我想分享作为一个完全的初学者,我是如何为第一人称点击解谜游戏编写代码的。
选择这个类型的原因之一是它的功能看起来足够简单。结果发现它还是比我想象的难。我(借助AI的帮助)重构了好几次,才达到满意的状态。
一个典型的交互"用钥匙开门"看起来是这样的:
检查交互对象是否是钥匙且门的状态是"锁定"——从背包中移除钥匙——播放解锁动画——将门的状态改为"可以打开"。
我的第一次尝试,因为对编程模式一无所知,就是直接在if语句中硬编码。但每个对象都需要一个自定义脚本。
然后我尝试将逻辑分解成两个类:Condition 和 Action。每个类由一系列简单的单元条件(交互对象是钥匙?自身状态是"锁定"?)和单元动作(从背包中移除、播放动画、改变状态)组成,这些单元很容易组合。
现在我只需要几个类(CheckState、CheckActorID、PlayAnim)。具体的操作,比如要比较的状态/ID、动画名称,都可以保存为数据,而不需要修改代码。
我最初用UnityEvent实现了它,但这产生了"谁"的问题。门的动作引用了钥匙游戏对象。在Inspector中需要将大量游戏对象拖拽到UnityEvent中,变得混乱且数据分散。引用也是运行时依赖的。
所以我问AI如何将游戏对象的引用变成静态数据。思路是将InteractionContext传递给条件和动作单元。这个上下文包含游戏对象、组件和全局变量的注册表。这样每个单元条件和动作只需要存储要从上下文中检索的ID。
现在我的交互数据看起来是这样的:
https://preview.redd.it/wge3olzvu9qh1.png?width=832&format=png&auto=webp&s=915279c054834de7bd1f244776f26c83cd56f754
至少现在,创建新的交互只需要填写数据。剩下的就是画图、画图、设计谜题、再画更多的图。:)
评论 (0)