Unity简单的MVC

这里写图片描述


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;
    }
}


效果如下

这里写图片描述


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yy763496668

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值