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

How to deal with two game modes in the same script?

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

以正方体为例:

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

在脚本中:

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

   ResumeGame();
}

我们对您的游戏一无所知,因此很难回答。但作为一个经验法则:您需要输入的内容越少越好。还要考虑如果您需要向游戏添加新功能会发生什么,您是否必须返回并更改大量代码? 如果是这样,您很可能没有编写好的代码。

为了给出一个具体的答案,我想说你应该继承,创建一个 class Level 并创建 sub classes TutorialFreePlay 或类似的,继承自 Level.

然后你可以在基础 class 中添加所有 "general" 功能,具体的事情在子 classes

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

将行为拆分为单独的对象。对于正方形,它可能类似于 TutorialCollisionHandlerScoreCollisionHandlerHazardCollisionHandler。然后你可以简单地通过改变添加哪些碰撞处理程序来创建不同的方块,你甚至不需要编写任何代码!

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