用于控制Unity中两个类的类

时间:2016-05-17 09:36:20

标签: c# unity3d

我的课程几乎相同,PaddleLeftPaddleRight。当我需要完成任务时,我厌倦了调用这两个类,我宁愿一次完成它们。例如,以下是我必须做的事情:

public void pause() {
    GameObject.Find("Paddle Objects/paddleRight").GetComponent<Paddle>().setIsPaused(true);
    GameObject.Find("Paddle Objects/paddleLeft").GetComponent<Paddle>().setIsPaused(true);
}

这就是我想要做的事情:

public void pause() {
    GameObject.Find("Paddle Objects/paddles").GetComponent<Paddle>().setIsPaused(true);
}

这似乎是不必要的,但是,在我的游戏中,有时会将同一行代码复制并调整为最多十个相似的对象。

问题有没有办法像Java一样为这些对象创建超类。我已经搜索了互联网并找到了信息,但我似乎无法理解如何使其工作,因为我无法在Unity中扩展MonoBehavior和超类。

先谢谢!

3 个答案:

答案 0 :(得分:4)

  

我有几乎相同的类,PaddleLeft和PaddleRight

但是你的代码完全是在说不同的东西

 GameObject.Find("Paddle Objects/paddleRight").GetComponent<Paddle>().setIsPaused(true);
 GameObject.Find("Paddle Objects/paddleLeft").GetComponent<Paddle>().setIsPaused(true);

也许你想要写下面的代码?

 GameObject.Find("Paddle Objects/paddleRight").GetComponent<PaddleRight>().setIsPaused(true);
 GameObject.Find("Paddle Objects/paddleLeft").GetComponent<PaddleLeft>().setIsPaused(true);

我将假设第二个代码是您打算写的。

当您有多个具有类似操作的 GameObjects 或Scripts时,您应该创建一个中央管理器脚本,以便与这些GameObjects或类进行通信。

由于您的课程都被称为PaddleRightPaddleLeft,因此您只需将此课程称为PaddleManager

不要忘记,当然,PaddleManager只是一个脚本,它不是Unity中的“东西”。当然,您会将PaddleManager附加到某个游戏对象上。你可能会问“我应该把它放在哪里?”在一个简单的游戏中,你可以将它附在你的相机上,比方说。 (因为你总是有一个摄像头,其他正在开发你项目的开发人员总是知道“看看摄像机”的几率和结尾,如声音效果,像这样的经理等等。)或者,说物理所有你的桨都是关联的(例如)一个对象是乒乓球桌。然后,附加PaddleManager.cs的好地方将在乒乓球桌上。只要它是整洁的,你附加它的地方并不重要。有些人喜欢简单地创建一个空对象(你可以将一个空对象称为“标记”),只需创建一个名为“manager holder”的空对象,将其放在0,0,0,然后添加脚本就像那个对象的PaddleManager.cs一样。

您的PaddleManager.cs脚本:

public class PaddleManager : MonoBehaviour
{
   private PaddleRight rightPaddle = null;
   private PaddleLeft  leftPaddle = null;

    //Initialize variables
    void Start()
    {
        //Get reference/Cache
        rightPaddle =  GameObject.Find("Paddle Objects/paddleRight").GetComponent<PaddleRight>();

        //Get reference/Cache
        leftPaddle =  GameObject.Find("Paddle Objects/paddleLeft").GetComponent<PaddleLeft>();
    }

    //Call to pause and unpause
    public void pause(bool pausePaddle)
    {
        rightPaddle.setIsPaused(pausePaddle);
        leftPaddle.setIsPaused(pausePaddle);
    }
}

现在,您可以从另一个脚本中的一个脚本访问两个Padd。

public class YourOtherScript : MonoBehaviour{

    PaddleManager paddleManager = null;

    void Start()
     {
         //Get reference/Cache
         paddleManager = GameObject.Find("GameObjectPaddleManaerIsAttchedTo") .GetComponent<PaddleManager>();

         //To pause
         paddleManager.pause(true);

         //To un-pause
         paddleManager.pause(false);
     }
}

通过这样做,您将避免使用静态变量,并避免在GameObject.FindGameObjectsWithTag("paddles"))循环中使用foreach,如其他答案中所述。 GameObject.Find...函数应该 NOT 在游戏中使用,因为它会减慢你的游戏。您需要使用它一次并将 GameObject 缓存在Start函数中,然后您可以在不降低游戏速度的情况下重复使用它。

答案 1 :(得分:1)

首先,左右两边都是游戏对象,而不是类,类名是paddle,如果两个对象上都有相同的脚本,最简单的方法是将它放在另一个空对象上并调用它一次,代码将适用于脚本附加到的所有游戏对象。但!这只是关于我从你的问题中得出的结论,正如你所说的那样,这就是我真正推荐的,因为我不能在Unity中扩展Mono-behavior和super-class&#34; 。好的,所以你有A级继承monobehavior,然后你创建了B级和C级,然后当你从A继承它们时,你将获得B级和C级的monobehaviour的所有能力,你可以将它们附加到游戏对象,您甚至可以将启动和更新功能作为vrtual并在B和C中覆盖它们甚至可以调用A的功能使用关键字Base,所以读取它,这需要时间,但从长远来看会让你一个更好的编码器

答案 2 :(得分:0)

嗯,等等。您的问题有问题:

PaddleLeftPaddleRight不是课程。它们是Unity场景中存在的GameObjects。类为Paddle,您可以通过GetComponent<Paddle>()向其引用。

现在,如果你有一个影响类的所有实例的变量/函数,那么你的shell static就是这样。 (Google静态变量和函数,如果你不知道它们是什么)。

请转到Puddle课程并将setIsPaused(bool val)的声明更改为:

public static void setIsPaused(bool val) { /* implemenetation */ }

然后通过类令牌调用它,而不是对象:

Paddle.setIsPaused(true/false);

请注意,如果静态函数引用了类变量,那么所有这些变量也应该标记为static。 (例如,如果你有一个bool isPaused而不是将它标记为静态,因为它应该始终对所有对象都相同)