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

 

posted @ 2017-12-05 12:36  Dean二十七  阅读(942)  评论(0编辑  收藏  举报