在整个游戏情节中控制NPC

时间:2018-11-06 03:56:28

标签: unity3d

我正在尝试找到一种在RPG中编写NPC脚本的好方法。 NPC交互示例可能如下:

  1. NPC与播放器开始#1对话框。
  2. 对话框结束后,NPC会移动到地图上的一个航路点。
  3. 一旦NPC到达航路点,并且玩家再次与他交谈,他将启动#2对话框。
  4. 在对话框的最后,NPC提出了一个问题。
    • 如果玩家给出答案A,则对话框结束。在这种情况下,再次与NPC对话将再次启动对话框2。
    • 如果播放器给出了响应B,则NPC将一个项目提供给播放器,然后消失。从现在开始,相同的NPC将出现在另一个Unity场景中。

我找到了很多制作对话框树的例子,但是我找不到解决这种复杂情况的好方法。最具挑战性的问题之一是确定NPC在哪个场景以及场景中的哪个位置。根据玩家在游戏中的走行距离,该NPC可以处于许多不同场景中的任何一个场景中,并具有不同的对话和行为。

由于Unity可以很容易地将脚本附加到NPC的游戏对象上,因此我当然可以通过C#脚本来完成全部操作。但是,对于重要的NPC来说,该脚本将变得非常庞大且混乱。

到目前为止,我走过的路是创建一个XML文件。像这样:

<AgentAi>
   <ActionGroup>
      <Dialog>
         <Statement>Hi!</Statement>
         <Statement>Follow me.</Statement>   
      </Dialog>
      <MoveTo>Waypoint_1</MoveTo>
      <SetNpcState>NpcGreetedPlayer</SetNpcState>
   </ActionGroup>
   <ActionGroup>
      <Conditions>
         <State>NpcGreetedPlayer</State>
      </Conditions>
      <Dialog>
         <Statement>Here, take this.</Statement>  
      </Dialog>
      <AddItem>Dagger</AddItem>
      <MoveTo>Waypoint_2</MoveTo>
   </ActionGroup>
</AgentAi>

该样本将导致NPC向玩家打招呼并移至另一个地点。然后,当玩家再次与他交谈时,NPC会给玩家一把匕首并移动到另一个航路点。

XML的问题在于,我担心重要的NPC会变得过大,这取决于玩家在游戏中的位置而可能在许多不同的地方。每次加载新场景时,我都必须不断动态确定场景中有哪些NPC。我并不完全反对这样的XML,但是如果有更好的方法,我不想浪费很多时间。

由于这种行为在很多游戏中都很常见,因此在Unity中是否有一种很好的方法可以不必自制自己的复杂系统呢?

1 个答案:

答案 0 :(得分:0)

一旦复杂度过高,普通软件系统就会使用数据库。

我会使用数字参考来设置故事情节,就像一本书的书页一样。
如果他们在没有互动的情况下获得更高的排名,那么互动仍然有效。

然后,您可以将每个互动设置为单独的事物,并带有一个开始和结束编号(之前不可用,之后不可用)。

也许您可以通过将xml文件分开来实现此目的,但是我认为您仍然需要将它们绑定到故事情节中。