[英]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.