假设我们有一个第一人称角色和几个 NPC AI。第一人称角色应该能够与 NPC AI 对话(通过对话服务)。我的问题是:我应该如何将两个游戏对象(FPC 和 NPC)相互“连接”起来?
所以他基本上可以四处走动并与他们交谈,然后他们回答一些问题,第一人称角色可以选择一个选项。
我在这里看到了几个选项:
- 为“第一人称角色”添加一个公共(public)变量。这个公众号 变量将保存 NPC AI。所以NPC AI和第一人称 角色可以通过两个类上的函数相互交谈。
- 添加一个实现观察者模式的“DialogService”类。 所以会有几个发布者和订阅者。我的问题在这里 是如何将 NPC 和第一人称角色联系起来
- 也许您有更好的选择?
最佳答案
如果您正在寻找一个简单的解决方案,我可以提供这个:
在角色的 GameObject
内部有另一个名为“Dialog Collider”的 GameObject
。向该游戏对象添加一个对撞机组件,使其(对撞机)成为触发器。另外,我建议您将碰撞器设为半径较大的圆柱体,这样您就可以进入对话而不会实际与其他角色发生碰撞。
添加一个脚本,当“对话框碰撞器”与另一个同名/标签的游戏对象发生碰撞时,该脚本将启动对话框。在这一点上,我假设你对所有游戏角色都有相同的设置:如果他们有一个对话选项开始,他们都应该在主游戏对象内有一个“对话碰撞器”GameObject
.
这样您就可以将碰撞检测留给 UnityEngine 而不是每帧都检查它。
此外,我建议制作一个通用的Dialog
脚本;使它成为一个抽象类,您可以从中继承以覆盖一些方法,这样您就可以从一开始就拥有所有基本功能,并有足够的灵 active 来稍后更改/扩展 NPC 的行为。
或者制作一个IDialogCharacter接口(interface),为每个类手动实现方法和对话框;如果您更喜欢组合而不是继承,请使用多态性来检查 IDialogCharacter 接口(interface)。
作为连接部分 - 当碰撞开始时,您的玩家角色将能够获取另一个角色的脚本(首先获取碰撞的游戏对象,然后是脚本组件)并请求从另一个角色开始对话或获取来自另一个角色的一些数据对象并启动对话。
关于c# - 统一 3D : Game Object interaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33399432/