繁体   English   中英

不使用“状态”的基于文本的冒险-C#Unity

[英]Text-Based Adventure Without Using “States” - C# Unity

我目前正在学习C#和Unity3D游戏引擎。 我正在学习在线课程“ 通过制作视频游戏来学习编码 ”,并且到目前为止还很喜欢。 但是,我正在进行第二个项目(进行“基于文本的”冒险),并且我觉得如果您想要十几个“房间”或动作,那么讲师制作游戏的方式将无法很好地扩展。 我希望有人可以为正确的方向指明我的方​​向,使之更灵活一些?

这是他目前正在为我们做的工作的简化版本:

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#这么残酷),所以我不确定这是否是我可以做的。

谢谢!

状态机实际上是最常见的游戏开发机制之一,很难找到一种能更有效地组织游戏逻辑的方法。 话虽这么说,您不应该使用一系列的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和功能的基础。

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

您可以在以下链接中找到一些不错的资源来开始探索该路径:

我特别喜欢最后一个,即使我用另一种语言编写代码,也确实对我有帮助! 除非您正在快速开发原型作为概念验证,否则习惯良好实践将使您免于积累工程债务,从而使您不得不长期重构整个游戏!

在确定特定模式之前,请花一些时间来准确定义您想要从“房间”获得哪些特定功能,并注意示波器的变化!

您可能还需要一个小型数据库,该数据库很适合“状态”。 资产商店中有一个Google Sheets资产可以帮助您设置文本室,可以轻松地对其进行编辑,并根据需要进行复制。 我还没有玩过,但是有很多很棒的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM