正文
然后你可以看到,左上角那个图,就是斜视角去看场景,你可以看到Lost Castle,其实把场景打斜放置。
为什么把场景打斜,是为了让点光源效果更好一些。
为什么需要动态设置SortingOrder,因为如果两个物体足够靠近,然后Order相同可能会发生两个物体的子节点前后错乱,如果靠的很紧,可能后面人的手显示在前面这个人身上,就出现了错乱。
这里提几个小技巧。首先是
SortingModule里面,其实有时候需要更新SortingOrder
,你可以在SortingModule里做一个触发器去做这件事情,比如主角换了一个武器。
其次是
可以将Y坐标乘以1000作为SortingOrder
,这个跟脑筋急转弯有点像,你可以省去排序y轴的步骤,但是这里需要注意取值范围。没有记错SortingOrder最高是65535。然后第三点,
可以把摄像机外的物体,可以把SortingModule停掉节省性能。
其实Lost Castle里面用到大量的动态光源。我们尝试过像baking,light probe等技术,但尝试发现在2D里显示效果很差。我昨天去问了一下Unity2D那边的技术负责人,他们说下一步会做2D lighting的东西,所以可以期待一下。
第三点是事件分发的高效解耦
,相信大家做游戏都会用事件分发的模式和机制。这一点真的非常有用,对我们写Lost Castle的代码帮助非常大,帮助我们非常高效去解耦。Lost Castle里面涉及非常多的道具,耦合程度很高。我们是怎么做的呢?
首先第一点,我们有一个标识事件的ID,然后第二点,是一个储存事件信息的一个类,去储存事件信息,比如一个事件的对象,一个数字,一个字符串等等。第三点申明一个委托。第四个东西会写一个委托对象的集合,就是里面有对应某个事件的大量的委托对象,负责注册、剔除或者执行回调。第五个会有一个静态的单例对象,其实就是做事件的触发和分发,这EventMgr也是一个静态单例对象,也是个对外接口。其他脚本不用关心分发机制里面的事情,就跟EventMgr打好关系就好了。
比如说我们需要监听玩家死亡的事件,比如是一个复活道具,他需要知道玩家什么时候死亡,可以在他脚本start时候,把自己注册进去,成为这个事件的监听对象,传入一个事件的ID和回调,如果触发这个事件,就执行那个回调函数执行相应的逻辑代码。在需要触发玩家死亡事件的地方,比如主角死了,需要分发这个死亡事件,可能在某个函数,比如PlayerDie里面,会用EventMgr.Call触发分发死亡事件,并传入这个事件所需要的参数,包含这个事件信息的对象。
刚刚那个是我们做Lost Castle里面做大量解耦的一个模式。其实帮我们做了非常多的东西,因为我们Lost Castle里面有大量的道具,它的耦合程度非常多,需要耦合的地方非常多,我们就用这个方式让他们之间解耦,让程序更加清楚更加明白。
第四点再提一下我们做Lost Castle的一个代码思路是怎么样
,肯定不是最优解,希望能抛砖引玉。
Lost Castle的代码思路,只有两个核心,
一个是尽可能少的类继承,尽可能多的专一功能模块。
那就比如说刚才提到的那个,SortingModule,不对外做什么接触,只关心对象的Sorting。这是思路一。
第二个思路,每个重要的实体,挂载有一个面向对象设计的脚本,但是那个脚本自身不做什么事情,只处理可能的耦合情况。
比如说Lost Castle里的主角,有个Hero脚本,它是面向对象设计的,继承自creature,往上还有继承关系。
主角实体本身挂载了很多专一功能模块,比如控制移动的模块,比如控制生物属性的模块,比如控制道具检测的模块,但是模块之间会存在一些耦合关系,我们就通过在图示中间这个继承关系的柱子(Hero,Creature,Entity),把他们耦合关系解决掉,但是这根柱子本身不做任何具体的事情。
第二个主题分享一些游戏设计方面的制作技巧,这些也比较散,都是每个点每个点的。
第一个希望跟游戏制作人分享,不要陷入游戏类型的误区。
可能会经常考虑一个问题,是沙盒还是Roguelike还是RPG还是生存还是模拟养成,哪个玩家比较多比较多受众,我往玩家多的地方去做。其实我是比较反对这种思维的,我觉得游戏类型取决于创作者想表达的内容和他们的喜好,一个创作者本身对这个游戏类型不足够熟悉,或者对这个类型不足够喜欢,是没办法把这个游戏做好,我是这么认为的。
第二个点是正确评估游戏类型对团队的一个可行性,风险一直都是存在的,从立项到游戏上线都是一直存在的。这边可以举我们做Lost Castle为例,因为一开始立项的时候,Lost Castle跟现在不是一样的游戏,其实一开始的时候,是计划做一个带,但是沙盒类的roguelike。现在Lost Castle是完全没有沙盒,大概第一年就把沙盒彻底砍掉,为什么砍掉,因为做不来,就这么简单。