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