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

时间:2016-11-13 23:42:48

标签: c# unity3d scripting

我目前正在学习C#和Unity3D游戏引擎。我正在浏览在线课程" Learn to Code by Making Video Games"并且喜欢到目前为止。然而,我正在进行第二个项目(制作一个基于文本的冒险),我觉得如果你想要的话,教练建立游戏的方式并不能很好地扩展十几个房间'或行动。 我希望有人能指出我正确的方向,以获得更灵活的东西吗?

这是他目前正在做的事情的精简版本:

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#那样残酷)所以我不确定这是否是我能做的事情。

谢谢!

3 个答案:

答案 0 :(得分:3)

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

显而易见的替代方案是使用切换块,但虽然这比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...

我确信这样的内容无论如何都会导致你的教程系列产生的结果,所以在问这些问题之前你最好完成这个系列。在教程中提供这样的示例是一种常见的策略,然后在下一课中,“现在你理解了原理,让我们以一种不完全废话的方式实现它。”

答案 1 :(得分:0)

嗯, TL; DR:它实际上取决于您对游戏的具体功能。

大多数游戏引擎/框架教程都专注于让您习惯其API和功能的基础知识。

出于这个原因,在游戏教程书籍/视频中很难找到诸如数据驱动设计或使用设计模式等概念!

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

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

在决定特定模式之前,花一些时间确定您想要从“房间”中准确定义哪些特定功能,并注意范围蔓延!

答案 2 :(得分:0)

您可能还需要一个适合"状态的迷你数据库。"资产商店中有一个Google Sheets Asset可以帮助您设置文本房间,可以根据需要轻松编辑和复制。我还没有玩过它,但是有很多很棒的评论。