簡體   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