Unity简单的MVC

来源:互联网 发布:国家大数据专业委员会 编辑:程序博客网 时间:2024/06/03 23:06

这里写图片描述


Unity中游戏对象的目录结构

这里写图片描述


第一个类:PlayerData

此类是游戏角色的相关信息,写这个类主要是为了减少Player和PlayerModel中的重复代码

using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 这是有关玩家的信息/// 为了减小Player和PlayerModel中的代码的重复/// </summary>public class PlayerData{    //名字    private string _name;    //等级    private int _lv;    //经验值    private int _exp;    public string Name    {        get        {            return _name;        }        set        {            _name = value;        }    }    public int Lv    {        get        {            return _lv;        }        set        {            _lv = value;        }    }    public int Exp    {        get        {            return _exp;        }        set        {            _exp = value;        }    }}

第二个类:Player

角色控制类,这里是角色控制信息,比如移动,跳跃

using System.Collections;using System.Collections.Generic;using UnityEngine;public class Player:MonoBehaviour{    private PlayerData _playerData;    public PlayerData PlayerData    {        get        {            return _playerData;        }        set        {            _playerData = value;        }    }    public Player()    {        PlayerData data = new PlayerData();        data.Lv = 0;        data.Name = "张三";        data.Exp = 0;        PlayerData = data;    }}

第三个类:PlayerView

UGUI界面的相关信息展示:

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class PlayerView{    private Button _gradeButton;    private Text _lvText;    private Text _expText;    public PlayerView()    {        _gradeButton = GameObject.Find("Canvas/PlayerInfoPanel/GradeButton").GetComponent<Button>();        _gradeButton.onClick.AddListener(OnGradeButtonClick);        _lvText = GameObject.Find("Canvas/PlayerInfoPanel/LVText").GetComponent<Text>();        _expText = GameObject.Find("Canvas/PlayerInfoPanel/EXPText").GetComponent<Text>();    }    /// <summary>    /// 更新数据的方法    /// </summary>    /// <param name="model">需要更新的数据信息模型</param>    public void UpdateAll(PlayerModel model)    {        _lvText.text = "LV:"+ model.PlayerData.Lv.ToString();        _expText.text = "EXP:" + model.PlayerData.Exp.ToString();    }    //增加经验值    void OnGradeButtonClick()    {        PlayerController.Instace.CaculateInfo();    }}

第四个类:PlayerModel

游戏数据通知更新

using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// 模型委托(当用户信息发生变化时执行)/// </summary>public delegate void OnValueChangeHanler(PlayerModel model);public class PlayerModel {    public event OnValueChangeHanler OnChangValue;    private PlayerData _playerData;    public PlayerData PlayerData    {        get        {            return _playerData;        }        set        {            _playerData = value;        }    }    public void UpdateData()    {        if (PlayerData.Exp / 500 > PlayerData.Lv)        {            PlayerData.Lv = PlayerData.Exp / 500;            PlayerData.Exp = 0;        }        if (OnChangValue != null)        {            OnChangValue(this);        }    }}

第五个类:PlayerController

实现Model和View之间的沟通

using System.Collections;using System.Collections.Generic;using UnityEngine;/// <summary>/// Model和View之间没有任何的关系/// 数据的更新通知都是Controller完成的/// </summary>public class PlayerController:MonoBehaviour{    private PlayerModel _playerModel;    private PlayerView _playerView;    public static PlayerController Instace;    void Awake()    {        Instace = this;    }    public PlayerModel PlayerModel    {        get        {            return _playerModel;        }        set        {            _playerModel = value;        }    }    public PlayerView PlayerView    {        get        {            return _playerView;        }        set        {            _playerView = value;        }    }    void Start()    {        //初始化两个实例        PlayerModel = new PlayerModel();        PlayerView = new PlayerView();        //注册事件        PlayerModel.OnChangValue += PlayerView.UpdateAll;    }    //通过计算得到Model    public PlayerModel CaculateInfo()    {        PlayerModel model = GetPalyerInfo();        //对数据计算        model.PlayerData.Exp += 100;        //更新数据        model.UpdateData();        return model;    }     public PlayerModel GetPalyerInfo()    {        //模拟从网络请求数据,在这里我们直接使用的是游戏对象本身的信息        Player player = GameObject.Find("Player").GetComponent<Player>();        PlayerModel.PlayerData = player.PlayerData;        return PlayerModel;    }    void OnDestroy()    {        //移除注册的事件        PlayerModel.OnChangValue -= PlayerView.UpdateAll;    }}

效果如下

这里写图片描述


原创粉丝点击