C#

时间:2018-08-04 23:21:13

标签: c# mysql unity3d structure

一段时间以来,我一直在试图解决这个问题。多次搜索的结果很少,因此我希望获得帮助。我对C#掌握得很好,但是我对结构或如何以最佳方式进行事情的经验不足。我目前正在与一群人作为首席程序员一起开发我的第一款独立游戏,因为我几乎毕业于游戏编程学位,并且取得了良好的进步。我们正在Unity中制作一本视觉小说(我主要是想使用if来处理艺术/声音资产和为我处理场景),并且在我需要开始实施决策结构之前,我已经尽我所能了。播放器。

现在,我发现的大多数教程或指南都说一个简单的开关,或者if / then语句将起作用。问题是,在更长的游戏中,有多个时间轴,我不确定这将有多有效。例如,某些决定可能不会被执行,或者在不同时间被执行。这给对话路线提出了一个问题,该对话路线需要做出多个决定才能达成。如果玩家选择向左走,然后打开一扇门,然后向右走,然后撞到一个桶,我是否需要四个单独的变量?

这很难解释,因为我不太确定这些决策结构通常是如何设置的,我阅读的所有内容都显示了一个问题的简单陈述以及由此产生的场景,或者只是说要使用视觉新颖的引擎。我希望扩展到一定程度并在以后的某个时间点单击游戏。 所以我的主要问题是,如何在存储和处理方面构建决策树?到目前为止,我最好的猜测是存储对象的结构或列表,每个对象都是在其中存储先前需求的决策。这也意味着,为了选择对话框,程序将从最开始的连接(链接到对象的对象)上跳过树。

我可以设置某种方式存储特定选择的方法吗?树越复杂,难度就越大。例如,如果您沿着一条使您做出100多个决定的道路走下去,这将使对话框选项变得越来越长。我在这里想念什么?

我认为我可以存储每个包含A,B,C或D的枚举数的决策。可以说,左,右两种问题只会使用A和B。但是,如果您有一个采用枚举器的对话框选项,它将最终看起来像这样。

Kyle:choiceHallway:1:choiceDoor2:“欢迎来到左侧走廊的门!”;

我想除非您一直走到第一个走廊,否则就无法到达门,但是当您假设除非这样做否则无法到达时,我觉得这可能会在路上造成问题,并导致选择错误选择,因为它。有没有更好的方法来解决这个问题?

我应该注意,我现在正在使用mysql数据库存储对话框。我已经可以进行导入/导出了,只是没有处理。

3 个答案:

答案 0 :(得分:0)

听起来您正在寻找finite state machine。我不会尝试在单个状态机中表示整个游戏,而是将每个都有自己的状态机的事物分解(例如分解为“章”或类似内容),并且“章”的集合将是一个状态机。本身(例如,如果您已经完成第2章和第3章,则只能过渡到第4章,但是在完成第1章后,可以过渡到第2章或第3章,等等。)

这是我在“普通” C#项目(即不是Unity)中使用的一个,但它应该与Unity一起使用,并且设置起来非常简单:{{3} }。另外,请查看文档中的“传奇”。尽管不是直接适用,但它们会为您编排多个状态机提供一些指导。

答案 1 :(得分:0)

只需一个简单的答案。希望这对您有所帮助。据我了解,您不需要每个语句中的其他抽象解决方案。使对象图像(https://i.stack.imgur.com/nVpih.jpg)一样,像isInRoomVariable = true那样进行设置和设置并且您的对象会向您显示您来自何处,甚至还可以显示您在左边房间还是右边房间时可以做什么

答案 2 :(得分:0)

从游戏开发的角度来看,我想轻松地操纵变量/条件要求,例如任务或关卡等

我建议去收集由可编写脚本的对象组成的需求集合。您可以将它们存储在可以在检查器中轻松操作的对象中。

您可以创建一个名为“踢桶”的决策。

[CreateAssetMenuAttribute(menuName = "Decision")]
public Decision : ScriptableObject
{
   public string Name;
   public DecisionState State; // Use an Enum with states "Inactive" "Completed", "Failed", "Unavailable" etc.
   // Other variables that may be relevant, like score or whatever   
}

您将在游戏开始时将状态设置为默认状态。然后,当您选择踢水桶时,将其标记为所需的任何状态。

然后您可以提出要求,接受决策和所需状态。

[CreateAssetMenuAttribute(menuName = "Requirement")]
public Requirement : ScriptableObject
{
   public Decision Decision;
   public DecisionState State;
}

现在,在您的房间,章节或任何脚本中,您可以附加执行任何逻辑所需的要求列表。您可以运行CheckRequirements方法来查看是否满足所有要求。

public Room : MonoBehaviour
{
   public List<Requirement> Requirements;

   public bool CheckRequirements()
   {
      foreach (var requirement in Requirements)
      {
         if (requirement.Decision.State != requirement.State)
         {
            return false;
         }
      }
      return true;
   }
}

我之所以喜欢这种方法,是因为您可以轻松地创建新的决策和要求,然后将其拖放到检查器插槽中。因此,当游戏流程发生变化时,您只需添加或删除决策/要求即可。

编辑:

花了一些时间,做了一些思考...

为使设计更加友好,您还可以集成在进入房间时触发的UnityEvents并为您设置某些决定。

public Room : MonoBehaviour
{
   UnityEvent OnRoomEnter;

   public void OnEnable() // Or whatever function you call when instantiating a room
   {
      OnRoomEnter();
   }

}

然后考虑以下问题

public GameManager : MonoBehaviour
{
   public void SetDecisionToActive(Decision decision)
   {
      decision.State = DecisionState.Active;
   }

    public void SetDecisionToInactive(Decision decision)
   {
      decision.State = DecisionState.Inactive;
   }
   // etc...
}

您现在可以将您的游戏管理器拖放到Unity中“房间”单行为对象的事件插槽中,选择一种方法,然后将创建的决策之一拖放到其参数插槽中。