Unity 3D:游戏对象交互

本文关键字:对象 交互 游戏 3D Unity | 更新日期: 2023-09-27 18:19:37

假设我们有一个第一人称角色和几个NPC AI。第一人称角色应该能够与NPC AI对话(通过对话服务)。我的问题是:我应该如何将两个游戏对象(FPC和NPC)"连接"在一起?

所以他基本上可以四处走动,与他们交谈,然后他们回答一些问题,第一人称角色可能会选择一个选项。

我在这里看到了几个选项:

  1. 在"第一人称字符"中添加一个公共变量。这个公众变量将容纳NPC AI。因此NPC AI和第一人称角色可以通过两个类上的函数相互交谈
  2. 添加一个实现观察者模式的类"DialogService"。因此将会有几个出版商和订阅者。我的问题在这里是如何将NPC和第一人称角色连接起来的
  3. 也许你有更好的选择

Unity 3D:游戏对象交互

如果你正在寻找一个简单的解决方案,我可以提供:

在角色的GameObject内部有另一个GameObject,比如说,"对话碰撞器"。向该游戏对象添加一个碰撞器组件,使其(碰撞器)成为触发器。此外,我建议您将碰撞器制作成一个半径更大的圆柱体,这样您就可以在不与其他角色发生实际碰撞的情况下进入对话框。

添加一个脚本,当"对话框碰撞器"与另一个同名/标记的游戏对象发生碰撞时,玩家角色会启动对话框。在这一点上,我认为所有游戏角色都有相同的设置:如果他们有一个对话框选项,那么他们都应该在主游戏对象内有一个"对话框碰撞器"GameObject

这样,您就可以将碰撞检测留给UnityEngine,而不是每帧都检查一次。

此外,我建议制作一个通用的Dialog脚本;让它成为一个抽象类,你可以从中继承来覆盖一些方法,这样你就可以从一开始就拥有所有的基本功能,并有足够的灵活性来更改/扩展NPC的行为。

或者制作一个IDialogCharacter接口,为每个类手动实现方法和对话框;如果您更喜欢组合而不是继承,请使用多态性来检查IDialogCharacter接口。

作为连接部分,当冲突开始时,玩家角色将能够获取另一个角色的脚本(首先获取冲突的GameObject,然后获取脚本组件),并请求从另一个字符开始对话,或者从另一角色获取一些数据对象并启动对话。