牧师与魔鬼——动作分离版

        修改上一次的《牧师与魔鬼》代码,实现动作分离。

        上次的博客:在UNITY中使用面向对象+DMC实现“牧师与魔鬼”-CSDN博客

        在3D游戏中,经常需要让物体进行连续的移动。如何让物体进行连续移动,如何设置一连串的动作,如何在动作结束时进行额外的处理,如何在做到前面这些任务的同时控制代码的复杂性,是需要学习和思考的。

        我们可以用继承于ScriptableObject的类实现最基础的动作 。继承于ScriptableObject的类不会自动随着游戏帧的进行而执行Update,可以用其他类的对象调用其Update进行更新。

        然后用更高层次的类,将这些简单动作进行组合、循环,构成复杂的、多步的动作。还可以继续用更高层次的类将这层的类进行组合、循环,实现更加复杂的动作。

        为了使多个动作可并行发生,应该让高层管理器能存储多个对象的多个底层动作,并在自身的Update函数被调用时,按照设计的逻辑调用一个或多个底层动作。

        动作之间通过接口进行通信。每个底层动作对象存储其管理者的接口,如果它负责的动作结束了,就调用接口中的方法,由管理者完成后续工作。最高层的动作管理器可以与场景控制器交互,场景控制器需要让游戏对象发生动作时,就向最高层的动作管理器发送动作请求,由其向底层的管理器分发动作任务。动作完成后,再由最高层的动作管理器通知场景控制器,进行后续的操作。

        代码组织:

牧师与魔鬼——动作分离版_第1张图片

运行截图:

牧师与魔鬼——动作分离版_第2张图片

        代码将游戏空间分为三片区域:区域1——左岸,区域2——右岸,区域3——船上,每片区域使用一个数组存储其中的人物,同时每个游戏对象记录了其所在区域和索引。牧师、魔鬼、船等对象是可操作的,通过点击这些对象可以将其移动。程序维护了船上的人数和、两侧的牧师和魔鬼的数量。当点击岸上人物时,会判断船是否与人物在同一侧,以及船上是否有空位,若都为是,则人物上船。当点击船上人物时,会让人物下船。点船时,如果船上有角色,则船会过河。船每次移动后,就会调用裁判类,根据两岸的牧师与魔鬼数量判断游戏是否结束。若游戏结束则提供刷新提示和刷新的按钮。(以上逻辑主要在场景管理器和裁判类中实现)

        人物上下船和船过河时,由场景管理器调用动作管理器,实现游戏对象在游戏空间中的连续移动。其中上下船使用三段MoveTo动作组成的“上升、水平移动、落地”实现,而过河由一段MoveTo动作的“水平移动”实现(人物在船上时绑定为船的子对象,跟随船移动)。而人物在三个数组的移动则由场景控制器完成。动作开始前,场景控制器将游戏对象标记为不可操作,这会使得点击处理函数在处理到这些对象时直接返回。动作结束后,由动作管理器将游戏对象重新标记为可操作。

代码链接:GitHub - xu-yongjia/3DgameDesign: Homework

运行视频:unity实现牧师与魔鬼_哔哩哔哩_bilibili

你可能感兴趣的:(unity)