C# C语言中的可视化新决策结构#

C# C语言中的可视化新决策结构#,c#,mysql,unity3d,structure,C#,Mysql,Unity3d,Structure,我一直想弄明白这一点已经有一段时间了。多个搜索结果很少,所以我希望能得到帮助。我对C#有很好的掌握,但我对结构或如何以最好的方式处理事情不太有经验。我目前正在与一个团队一起开发我的第一款独立游戏,作为他们的首席程序员,因为我几乎毕业了,获得了游戏编程学位,并且取得了很好的进步。我们正在Unity中制作一部视觉小说(我主要想用if来制作艺术/声音资产和处理场景),在我需要开始为玩家实现决策结构之前,我已经尽我所能地使用代码了 现在,我找到的大多数教程或指南都说,一个简单的开关或if/then语句可

我一直想弄明白这一点已经有一段时间了。多个搜索结果很少,所以我希望能得到帮助。我对C#有很好的掌握,但我对结构或如何以最好的方式处理事情不太有经验。我目前正在与一个团队一起开发我的第一款独立游戏,作为他们的首席程序员,因为我几乎毕业了,获得了游戏编程学位,并且取得了很好的进步。我们正在Unity中制作一部视觉小说(我主要想用if来制作艺术/声音资产和处理场景),在我需要开始为玩家实现决策结构之前,我已经尽我所能地使用代码了

现在,我找到的大多数教程或指南都说,一个简单的开关或if/then语句可以工作。问题是,在一个有多个时间表的较长游戏中,我不确定这会有多高效。例如,某些决策可能未命中,或者在不同的时间命中。这给需要不止一个决定才能达成的对话线路带来了问题。如果玩家选择向左走,打开一扇门vs向右走,踢翻一个桶,我会有4个单独的变量吗

这很难解释,因为我不太清楚这些决策结构通常是如何设置的,我读到的每一篇文章要么显示一个问题的简单陈述和结果场景,要么只是说使用视觉小说引擎。我希望在将来的某个时候扩展到点击游戏。 所以我的主要问题是,我将如何在存储和处理方面构建决策树?到目前为止,我最好的猜测是存储一个结构或对象列表,每个对象都是一个决策,在其中存储以前的需求。这也意味着,为了选择对话框,程序将从第一个连接(对象链接到对象)跳下树

我可以设置一种存储特定选择的方式吗?树越复杂,它就越难。例如,如果你选择了一条能让你做出100多个决定的路径,那么对话选项就会越来越长。我错过了什么

我想我可以存储每个包含A、B、C或D的枚举数的决策。左或右类问题只能使用A和B。但是,如果您有一个对话框选项,它需要一个枚举器,那么它最终会是这样的

凯尔:精选走廊:1:精选门2:“欢迎来到左边走廊的门!”

我想除非你沿着第一条走廊走,否则门是够不着的,但我觉得如果你假设除非你这样做,否则什么东西是够不着的,这可能会给你的选择带来问题。有没有更好的办法


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

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


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

只是一个小小的答案。希望这将对您有所帮助。据我所知,您需要一个抽象的解决方案,而不是每条语句中的其他解决方案。制作对象图,如(),设置路径并设置为isInRoomVariable=true,你的对象将向你展示你来自何处,甚至功能当你在左室或右室时你能做什么从游戏开发的角度来看,我想轻松地操纵变量/条件要求,例如任务或关卡等

我建议使用一个由可编写脚本的对象组成的需求集合。您可以将它们存储在可以从inspector中轻松操作的对象中

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

你可以在游戏开始时将状态设置为默认状态。然后当你选择启动时,将其标记为你想要的任何状态

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

[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;
   }
}

然后考虑下面的

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

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

您现在可以将您的gamemanager拖放到Unity中“房间”单行为对象的事件槽中,选择一个方法,然后将您创建的一个决策拖到它的参数槽中。

这听起来绝对完美,不过还有最后一件事。我会将对话框的要求存储到我的DB中吗?我想我可以添加一个额外的列umn,但是否有更有效的方法?这会存储决策以便于检查,但我如何设置检查它们的内容?我不确定您为什么要将需求存储在数据库中。在我看来,这种逻辑在应用程序中更有效。或者是否有一个有益的用例你想把它放在数据库里吗?我想我解释得不好。有一点信息可以帮助你。我有我的“游戏”数据库,每个场景都是一个“表格”。在每个场景开始时,我加载所有的文本,其中存储有角色名、角色图像,可能还有一个声音效果,诸如此类。我将它们加载到我的拨号管理器A中我的场景经理要求他们,所以
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...
}