关于这次聚光灯程序老师有话说!

11/1063 浏览技术交流
参加这次聚光灯gamejam比赛,作为程序我在写代码的时候踩了两个坑,也摸索出了解决方法,以及一个对象池应用的心得,来跟大家分享一下。
       一是摸索出了如何处理玩家在连续单格地块上的地面判断问题。初期代码中,判断玩家是否处于地面是通过isGround这个bool来确定的,他在Unity碰撞响应函数中被修改(OnCollisionEnter2D -> true;OnCollisionExit2D -> false)。这个做法带来了一个问题,玩家在连续单格地块上移动时对于其是否在地面的判断会有bug。举个例子,假设在玩家前进方向上有A、B、C三个连续单格方块,当玩家前进时,会先进入B地块,之后离开A地块,这个时刻玩家站在B地块上而没有进入C地块,最后的碰撞响应函数是A地块的OnCollisionExit2D,即isGround为false,进而会导致有关地面判断的相关行动与预期不符。解决办法是,把玩家的地面判断试做类似buff一样的东西,在玩家控制脚本中开一个列表,当玩家接触地块时,把地块的引用添加到列表中,玩家控制器通过判断列表中是否有元素来判断自己是否处在地面上。
       二是摸索出了玩家攻击范围会随玩家移动,而产生超范围判定的问题的解决方法。初期实现中,我将攻击范围作为玩家的子物体,默认隐藏,玩家攻击时激活该物体并进行碰撞检测和伤害结算,之后隐藏,如此往复。在此场景下,如果玩家在攻击时移动,攻击范围所依附的物体也就跟着玩家移动,从而会产生一个更大的、非预期的攻击范围。对于这个问题,我把攻击范围单独抽出来作为预制体,把他的引用给到玩家,玩家每次攻击时在攻击时刻的位置生成一个攻击范围物体,这个物体在进行完碰撞检测和伤害结算之后会销毁自己,这样一来就不会有攻击范围随着玩家移动而扩大的问题了。
       三是对象池的应用。在我们的游戏中,美术关和boss小美的战斗中,小美会向玩家发射错误贴图的导弹,这个贴图在设定上是来自于背景,每发射一次,背景就会因为"贴图bug"而丢失贴图。一方面,丢失的贴图总量固定,另一方面,boss小美每个阶段倒地时如果没被玩家击败,又会恢复行动向玩家发射导弹,因为这些在导弹上的、来自于背景的贴图实际上是场景中物体的引用,那么这个时候就会有个问题,我如何保证贴图的循环利用?于是我使用了对象池。首先,我声明了两个列表作为对象池列表,boss小美每个阶段会清空自己的所有对象池列表;接着,boss小美在"扣去"背景贴图并生成导弹时,会将改导弹整体的引用存入对象池列表1,直到达到本阶段的攻击次数上限;最后,小美每次倒地后恢复行动,会调换开启列表和结束列表(即调换对象池列表1和2的作用),发射出去的导弹会存入开启列表而从关闭列表中移除,如此往复。
8