SRPG游戏开发(二十八)第七章 寻路与地图对象 - 六 在地图中创建地图对象(Create Map Object in Map)

本文档介绍了在SRPG游戏开发中关于寻路与地图对象的处理,包括修复SRPG Tile保存错误,分析地图对象类型如用户光标、范围光标及其在对象池中的管理,以及如何创建、显示和隐藏这些对象。同时,文章还展示了如何为光标添加父物体以优化显示效果。
摘要由CSDN通过智能技术生成

返回总目录

第七章 寻路与地图对象(Pathfinding and Map Object)

这一章主要进行寻路与地图对象的部分工作。



六 在地图中创建地图对象(Create Map Object in Map)

这一节我们在MapGraph中添加创建地图对象的方法。

不过在这之前,要修复一点小bug:在寻路时发现,我们的SrpgTile创建的Asset的属性无法保存(当退出Unity再打开时,部分属性回复成了默认值)。


1 修复 SRPG Tile 无法保存的错误(Fix Bug of SRPG Tile )

这里无法保存的原因是因为我们的属性没有被Unity序列化。

而没有被序列化的原因是我们的字段(Field)用的private,而对外调用使用的是属性(Property)。

在Unity序列化ScriptableObject时,只有当字段为public或者持有[SerializeField]属性(Attribute)的字段才会被序列化。

所以在我们的代码中添加[SerializeField]

        [SerializeField]
        private TerrainType m_TerrainType = TerrainType.Plain;
        [SerializeField]
        private int m_AvoidRate = 0;

这样就可以保存了,你可以改变数值,关闭Unity,再次打开Unity看是否保存正确。


2 地图对象分析(Analysis of Map Objects)

我们先来看一下每种地图对象:

  • MapMouseCursor:我们要知道它是用户光标,它也有几种变化,比如选中角色和没有选中应该是不同的,但我们这里从简,只使用了一种。如果你要改变它,可以自己建立新的Prefab,控制它的状态,或者控制不同的动画。而在地图中显示这种光标,有且仅有一个。

  • MapCursor:它是显示范围使用的光标,这种光标在每次选择角色进行移动或攻击时都会出现,而且每次出现几个或十几个不等数量,重用量非常大,所以它最好在对象池(Object Pool)中。

  • MapObstacle:障碍物一般是地图中的静态物体,只需要随着场景创建与销毁就可以了。

  • MapClass,玩家角色一般每一个场景中是固定的,但敌人的出现就不固定了。比如在FE4中,当敌人全部被击杀至小于一定数量时,敌人小队长会返回城中再次出现同样数量的敌人;再比如,大部分游戏中都会出现击杀某个敌人或到达指定地点后触发事件,产生新的敌人。所以它最好也在对象池(Object Pool)中。

对象池ObjectPool在第六章编写的DR.Book.SRPG_Dev.Framework命名空间下。

基于以上分析,我们在MapGraph先暂时添加一些相关的字段与属性:

        #region Map Object Field
        [Header("Map Object Setting")]
        [SerializeField]
        private ObjectPool m_MapObjectPool;
        [SerializeField]
        private MapMouseCursor m_MouseCursorPrefab;
        [SerializeField]
        private MapCursor m_CursorPrefab;

        /// <summary>
        /// 生成的MapMouseCursor
        /// </summary>
        private MapMouseCursor m_MouseCursor;

        /// <summary>
        /// 运行时,MapCursor的预制体
        /// </summary>
        private MapCursor m_RuntimeCursorPrefab;

        /// <summary>
        /// 移动范围光标集合
        /// </summary>
        private List<MapCursor> m_MapMoveCursors = new List<MapCursor>();

        /// <summary>
        /// 攻击范围光标集合
        /// </summary>
        private List<MapCursor> m_MapAttackCursors = new List<MapCursor>();

        /// <summary>
        /// 职业集合
        /// </summary>
        private List<MapClass> m_Classes = new List<MapClass>();
        #endregion

        #region Map Object Property
        /// <summary>
        /// MapObject父对象
        /// </summary>
        public ObjectPool mapObjectPool
        {
            get { return m_MapObjectPool; }
            set { m_MapObjectPool = value; }
        }

        /// <summary>
        /// 默认mouse cursor的prefab
        /// </summary>
        public MapMouseCursor mouseCursorPrefab
        {
            get { return m_MouseCursorPrefab; }
            set { m_MouseCursorPrefab = value; }
        }

        /// <summary>
        /// 默认cursor的prefab
        /// </summary>
        public MapCursor cursorPrefab
        {
            get { return m_CursorPrefab; }
            set { m_CursorPrefab = value; }
        }

        /// <summary>
        /// 用户光标
        /// </summary>
        public MapMouseCursor mouseCursor
        {
            get { return m_MouseCursor; }
        }

        /// <summary>
        /// 运行时,MapCursor的预制体
        /// 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值