Unity战斗模块之角色继承设计---1.1
一、游戏对象实体基类
包含有:
1.属性
2.自身继承MonoBehaviour的方法
3.以及虚方法---初始化、更新、启用禁用、销毁
4.Cmd 命令相关部分
1.属性
/// <summary> /// 游戏对象名字 /// </summary> protected string _name; public string Name { set { _name = value; gameObject.name = _name; } get { return _name; } } /// <summary> /// 游戏对象id /// </summary> public int Id { protected set; get; } /// <summary> /// 游戏对象Uid /// 服务器上的唯一id /// </summary> public int Uid { protected set; get; } /// <summary> /// 游戏对象实体类型 /// </summary> public EnumEntityType EntityType { protected set; get; }
2.继承MonoBehaviour的方法
/// <summary> /// 一般游戏对象中不再使用该方法 /// </summary> protected void Update() { UpdateEntity(Time.deltaTime); } /// <summary> /// 销毁游戏对象 /// </summary> private void OnDestroy() { DestroyEntity(); }
3.虚方法 --- 初始化、更新、启用、禁用、销毁
/// <summary> /// 实体对象初始化方法 /// </summary> /// <param name="uid">UID</param> public virtual void Init(int uid) { Uid = uid; //默认名字为UID Name = uid.ToString(); //子类中重写实体类型 EntityType = EnumEntityType.None; } /// <summary> /// 更新实体对象 /// </summary> /// <param name="deltaTime"></param> protected virtual void UpdateEntity(float deltaTime) { } /// <summary> /// 启用游戏对象 /// </summary> /// <param name="pos">对象位置</param> public virtual void EnableEntity(Vector3 pos) { gameObject.transform.position = pos; } /// <summary> /// 禁用游戏实体对象 /// </summary> public virtual void DisableEntity() { } /// <summary> /// 自定义销毁实体对象 /// </summary> public virtual void DestroyEntity() { }
4.Cmd命令相关部分
/// <summary> /// 接收命令委托 /// </summary> /// <param name="data"></param> public delegate void OnReceiveCmd(ICmd data); /// <summary> /// 角色所能处理的命令列表 /// </summary> protected Dictionary<EnumCmdType, OnReceiveCmd> dicCmds = new Dictionary<EnumCmdType, OnReceiveCmd>(); /// <summary> /// 添加命令 /// </summary> protected void AddCmd(EnumCmdType cmd, OnReceiveCmd func) { if (dicCmds.ContainsKey(cmd)) { DebugManager.Instance.ErrorLog("Error: " + Name + " 重复添加" + cmd + "命令"); return; } dicCmds.Add(cmd, func); } /// <summary> /// 移除命令 /// </summary> protected void RemoveCmd(EnumCmdType cmd) { if (!dicCmds.ContainsKey(cmd)) { DebugManager.Instance.ErrorLog("Error: " + Name + " 对象不存在此命令 " + cmd); return; } dicCmds.Remove(cmd); } /// <summary> /// 接收命令 /// </summary> public void ReceiveCmd(EnumCmdType cmd, ICmd data) { if (!dicCmds.ContainsKey(cmd)) { DebugManager.Instance.ErrorLog("Error: " + Name + " 对象不存在此命令 " + cmd + " 触发命令失败"); return; } //触发命令 dicCmds[cmd].Invoke(data); }
5.关于枚举EnumEntityType 和 EnumCmdType 以及接口 ICmd
/// <summary> /// 游戏对象实体类型 /// </summary> public enum EnumEntityType { None, Boss, Player, } /// <summary> /// 游戏对象处理的命令类型 /// </summary> public enum EnumCmdType { None, } /// <summary> /// 命令接口 /// </summary> public interface ICmd { }
6.完整的代码为:
/// <summary> /// 游戏对象实体基类 /// </summary> public class BaseEntity : MonoBehaviour { #region 属性 /// <summary> /// 游戏对象名字 /// </summary> protected string _name; public string Name { set { _name = value; gameObject.name = _name; } get { return _name; } } /// <summary> /// 游戏对象id /// </summary> public int Id { protected set; get; } /// <summary> /// 游戏对象Uid /// 服务器上的唯一id /// </summary> public int Uid { protected set; get; } /// <summary> /// 游戏对象实体类型 /// </summary> public EnumEntityType EntityType { protected set; get; } #endregion #region MonoBehaviour自身方法 /// <summary> /// 一般游戏对象中不再使用该方法 /// </summary> protected void Update() { UpdateEntity(Time.deltaTime); } /// <summary> /// 销毁游戏对象 /// </summary> private void OnDestroy() { DestroyEntity(); } #endregion #region 虚方法 --- 初始化、更新、启用、禁用、销毁 /// <summary> /// 实体对象初始化方法 /// </summary> /// <param name="uid">UID</param> public virtual void Init(int uid) { Uid = uid; //默认名字为UID Name = uid.ToString(); //子类中重写实体类型 EntityType = EnumEntityType.None; } /// <summary> /// 更新实体对象 /// </summary> /// <param name="deltaTime"></param> protected virtual void UpdateEntity(float deltaTime) { } /// <summary> /// 启用游戏对象 /// </summary> /// <param name="pos">对象位置</param> public virtual void EnableEntity(Vector3 pos) { gameObject.transform.position = pos; } /// <summary> /// 禁用游戏实体对象 /// </summary> public virtual void DisableEntity() { } /// <summary> /// 自定义销毁实体对象 /// </summary> public virtual void DestroyEntity() { } #endregion #region Cmd 命令相关部分 /// <summary> /// 接收命令委托 /// </summary> /// <param name="data"></param> public delegate void OnReceiveCmd(ICmd data); /// <summary> /// 角色所能处理的命令列表 /// </summary> protected Dictionary<EnumCmdType, OnReceiveCmd> dicCmds = new Dictionary<EnumCmdType, OnReceiveCmd>(); /// <summary> /// 添加命令 /// </summary> protected void AddCmd(EnumCmdType cmd, OnReceiveCmd func) { if (dicCmds.ContainsKey(cmd)) { DebugManager.Instance.ErrorLog("Error: " + Name + " 重复添加" + cmd + "命令"); return; } dicCmds.Add(cmd, func); } /// <summary> /// 移除命令 /// </summary> protected void RemoveCmd(EnumCmdType cmd) { if (!dicCmds.ContainsKey(cmd)) { DebugManager.Instance.ErrorLog("Error: " + Name + " 对象不存在此命令 " + cmd); return; } dicCmds.Remove(cmd); } /// <summary> /// 接收命令 /// </summary> public void ReceiveCmd(EnumCmdType cmd, ICmd data) { if (!dicCmds.ContainsKey(cmd)) { DebugManager.Instance.ErrorLog("Error: " + Name + " 对象不存在此命令 " + cmd + " 触发命令失败"); return; } //触发命令 dicCmds[cmd].Invoke(data); } #endregion }
/// <summary> /// 命令接口 /// </summary> public interface ICmd { }
/// <summary> /// 游戏对象实体类型 /// </summary> public enum EnumEntityType { None, Boss, Player, } /// <summary> /// 游戏对象处理的命令类型 /// </summary> public enum EnumCmdType { None, }
Dean二十七