Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在同一脚本中处理两种游戏模式?_C#_Unity3d_Unity5 - Fatal编程技术网

C# 如何在同一脚本中处理两种游戏模式?

C# 如何在同一脚本中处理两种游戏模式?,c#,unity3d,unity5,C#,Unity3d,Unity5,例如,如果我有一个只包含一个场景的游戏,在该场景中,我让用户在正常播放模式或教程播放模式之间进行选择。游戏有4个不同的对象:一个球、4个方块和一个方块控制器。在教程模式下,我想在暂停游戏时为用户提供一个指向箭头,并在用户按下被指向的对象后继续。我应该为正常模式编写一个脚本,为教程模式编写另一个脚本,并检查每个函数中的教程布尔值是否为真(如果用户按下教程按钮,则布尔值应为真),还是进行某种预处理 例如,在squarescript中: void OnCollisionEnter2D () { if

例如,如果我有一个只包含一个场景的游戏,在该场景中,我让用户在正常播放模式或教程播放模式之间进行选择。游戏有4个不同的对象:一个球、4个方块和一个方块控制器。在教程模式下,我想在暂停游戏时为用户提供一个指向箭头,并在用户按下被指向的对象后继续。我应该为正常模式编写一个脚本,为教程模式编写另一个脚本,并检查每个函数中的教程布尔值是否为真(如果用户按下教程按钮,则布尔值应为真),还是进行某种预处理

例如,在squarescript中:

void OnCollisionEnter2D () {
 if (isTutorial) {
    PauseGame();
    arrow.position = GetRelativePosition();
    arrow.setActive(true);
 } else {
  if (canCollide) {
    score++;
  } else {
    GameOver();
   }
 }
在脚本中:

void OnMouseDown () {
   if (!isTutorial) {
      return;
   }

   ResumeGame();
}

我们对你的比赛一无所知,所以很难回答。但根据经验:你打字越少越好。还要考虑如果你需要为游戏添加新功能,将会发生什么,你是否需要回去改变你的代码中的吨? 如果是这样,您很可能没有编写好代码

为了给出一个具体的答案,我想说你应该继承,创建一个类
Level
,并创建子类
Tutorial
FreePlay
或类似的继承自
Level


然后,您可以在基类中添加所有“通用”功能,在子类中添加特定的功能

我们对您的游戏一无所知,因此很难回答。但根据经验:你打字越少越好。还要考虑如果你需要为游戏添加新功能,将会发生什么,你是否需要回去改变你的代码中的吨? 如果是这样,您很可能没有编写好代码

为了给出一个具体的答案,我想说你应该继承,创建一个类
Level
,并创建子类
Tutorial
FreePlay
或类似的继承自
Level


然后,您可以在基类中添加所有“通用”功能,并在子类中添加特定的内容

通过在if语句中构造这些行为,这使得代码难以理解和使用。想象一下,如果您决定让其中一个方块增加玩家分数并显示教程箭头,这将是什么样子

将行为拆分为单独的对象。对于正方形,它可能类似于
TutorialCollisionHandler
ScoreCollisionHandler
HazardCollisionHandler
。然后,只需更改添加到其中的碰撞处理程序,就可以创建不同的方块,甚至不需要编写任何代码


现在,根据用户选择的模式,您可以使用不同的方块组合。同样的原则也可以用于其他教程或游戏特定的行为。

通过在if语句中构造这些行为,代码很难理解和使用。想象一下,如果您决定让其中一个方块增加玩家分数并显示教程箭头,这将是什么样子

将行为拆分为单独的对象。对于正方形,它可能类似于
TutorialCollisionHandler
ScoreCollisionHandler
HazardCollisionHandler
。然后,只需更改添加到其中的碰撞处理程序,就可以创建不同的方块,甚至不需要编写任何代码


现在,根据用户选择的模式,您可以使用不同的方块组合。同样的原则也可以用于其他教程或游戏特定的行为。

我的游戏是一个非常简单的游戏,包含4种不同类型的对象和大约6个脚本。我非常需要脚本根据它是在教程模式还是正常模式下进行不同的操作。好吧,把它放在一个变量中,游戏是什么模式,然后根据游戏模式,你可以做不同的事情。就像这个答案所说的,你提供的不多,很难知道你想要什么。我添加了更多信息,请告诉我你可能需要的更多信息。如果你问的是“最佳实践”,那么这个答案告诉你你需要知道什么。如果目标是在良好实践中写作,那么项目的规模/范围当然并不重要。如果您询问的是任何一种解决方案的特定问题,则仍不清楚您所要求的是什么。@user24028抱歉,您没有意识到您已经得到了答案。但面向对象编程的另一条经验法则是将所有内容划分为尽可能多的类和方法。它使您的代码更易于调整、更改、调试和添加,也使代码更易于阅读。我的游戏是一个非常简单的游戏,包含4种不同类型的对象和大约6个脚本。我非常需要脚本根据它是在教程模式还是正常模式下进行不同的操作。好吧,把它放在一个变量中,游戏是什么模式,然后根据游戏模式,你可以做不同的事情。就像这个答案所说的,你提供的不多,很难知道你想要什么。我添加了更多信息,请告诉我你可能需要的更多信息。如果你问的是“最佳实践”,那么这个答案告诉你你需要知道什么。如果目标是在良好实践中写作,那么项目的规模/范围当然并不重要。如果您询问的是任何一种解决方案的特定问题,则仍不清楚您所要求的是什么。@user24028抱歉,您没有意识到您已经得到了答案。但面向对象编程的另一条经验法则是将所有内容划分为尽可能多的类和方法。它使您的代码更易于调整、更改、调试和添加,也使代码更易于阅读。因此,TutorialCollisionHandler、ScoreCollisionHandler和HazardCollisionHandler是独立的脚本,可以通过代码添加到方形游戏对象中,就像