不使用“状态”的文本冒险;- c# Unity

本文关键字:冒险 Unity 文本 状态 | 更新日期: 2023-09-27 18:17:56

我目前正在学习c#和Unity3D游戏引擎。我正在学习在线课程"通过制作视频游戏学习编程",到目前为止我很喜欢它。然而,我正在做第二个项目(制作一款"基于文本的"冒险游戏),我觉得如果你想要超过12个"房间"或行动,那么指导员构建游戏的方式就不太适合规模化。我希望有人能给我指出正确的方向,为一些更灵活的东西?

这是他目前让我们做的事情的一个真正精简的版本:

private enum States {state_1, state_2, state_3, etc...}
private States myState;

void Start () {
    //Starts the game in 'state_1'
    myState = States.state_1;
}
void Update () {
    //constantly checking what state we are in, and then runs the correct function
    if(myState == States.state_1) {
        state_1();
    }
    if(myState == States.state_2) {
        state_2();
    }
    if(myState == States.state_3) {
        state_3();
    }
    //etc...
}
//Starting screen/display first series of options
void state_1() {
    //display text and control options for my first 'state'
}
//Possible action or option
void state_2() {
    //display text and control options for my another 'state'
}
//Another possible action or option
void state_3() {
    //display text and control options for my another 'state'
}
//etc...

虽然这最终可以工作,但我觉得这是一个非常笨拙的系统,并且在仅仅十几个状态之后变得难以控制,因为我必须返回并在创建每个新状态后添加条件语句。难道没有办法在void Update函数中创建一个非常简单的"检查状态是什么,然后转到那个状态"命令,而不是列出每个可能的状态吗?

就像我说的,我对c#相当陌生(在PHP, HTML, CSS中做了一些工作,但没有c#那么残酷),所以我不确定这是否是我能做的事情。

谢谢!

不使用“状态”的文本冒险;- c# Unity

状态机实际上是游戏开发中最常见的机制之一,你很难找到一种更有效地组织游戏逻辑的方法。也就是说,你不应该使用一系列if语句来检查当前哪个状态是活动的,因为你是绝对正确的——这种方法根本不会很好地扩展。

明显的替代方法是使用switch块,但是尽管这比if序列要高效得多,但它无助于解决整个代码的可维护性问题。

那么,下一个解决方案就是使用委托。

public delegate void StateHandler();
private StateHandler CurrentState;
void Start()
{
    CurrentState = StartingState;
}
void Update()
{
    CurrentState();
}
void StartingState()
{
    // do something
    CurrentState = State1;
}
void State1()
{
    // do something
    if (somethingHappens)
        CurrentState = State2;
    else
        CurrentState = State3;
}
void State2()
{
    // do something
    CurrentState = State1;
}
void State3()
{
    // etc
}
etc...

我相信这就是你的教程系列的结果,所以你最好在问这些问题之前完成这个系列。在教程中呈现这样的例子是一种常见的策略,然后在下一课中说"现在你理解了原理,让我们以一种不完全是废话的方式实现它"。

嗯,TL;DR:这实际上取决于你想为你的游戏添加哪些特定的功能。

大多数游戏引擎/框架教程的重点是让你习惯基础的api和功能。

因此,诸如数据驱动设计或使用设计模式之类的概念很难在游戏教程/视频中找到!

您可以在以下链接中找到一些很好的资源来开始探索这条路径:

    c#中的创建、结构和行为设计模式
  • 游戏编程模式

我特别喜欢最后一个,即使我是用不同的语言编码,它真的帮助了我!除非你正在快速开发一个原型作为概念的证明,否则习惯良好的实践将使你免于积累工程债务,这将导致你不得不在长期内重构整个游戏!!

在决定一个特定的模式之前,花点时间定义你想从你的"房间"中得到什么具体的功能,小心范围蔓延!

您可能还需要一个适合"状态"的迷你数据库。在资产商店里有一个Google Sheets Asset,可以帮助你设置你的文本室,可以很容易地编辑,根据需要复制。我还没玩过,但是有很多好评