繁体   English   中英

在Unity中控制两个类的类

[英]Class to control two classes in Unity

我有几乎相同的类, 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和超类。

提前致谢!

我有几乎相同的类,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附加在乒乓球桌上的好地方。 只要它整洁,在哪里附加都无所谓。 有些人喜欢简单地制作一个空对象(您可以将一个空对象称为“标记”),只需制作一个名为“ managerholder”的空对象,将其置于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);
    }
}

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

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);
     }
}

这样,您将避免使用静态变量 ,也将避免在foreach循环中使用GameObject.FindGameObjectsWithTag("paddles")) ,如其他答案中所述。 GameObject.Find...功能应该在比赛中使用,因为它会你的游戏慢下来 你需要使用一次,并缓存游戏对象Start功能,那么你就可以重新使用它,而不会减慢您的游戏。

首先,左右划桨是游戏对象而不是类,类名是paddle,如果两个对象上都使用相同的脚本,最简单的方法是将其放在另一个空对象上并调用一次并该代码将在脚本附加到的所有游戏对象上运行。 但! 这只是关于我想从您的问题中得出的结论,这是我真正的建议,正如您所说的,“因为我无法在Unity中扩展Mono-behavior和超类”。 好的,所以您有A类继承了monobehavior,并创建了类B和C,那么当您从A继承它们时,您将获得B和C类中所有monohaviour的能力,并且可以将它们附加到游戏对象上,甚至将启动和更新功能设为虚拟,并在B和C中覆盖它们,甚至可以使用关键字Base来调用A的功能,因此请仔细阅读它,这会花费一些时间,但从长远来看,使您成为一个更好的编码器

嗯等一下 您的问题出了点问题:

PaddleLeftPaddleRight不是类。 它们是Unity场景中存在的GameObject。 类是Paddle ,您可以通过GetComponent<Paddle>()获得引用。

现在,如果您拥有一个会影响该类所有实例的变量/函数,那么与将它们static shell一样,它们将static (如果您不知道Google静态变量和函数是什么,则为它们)。

因此,转到您的Puddle类,并将setIsPaused(bool val)的声明更改为:

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

然后通过类令牌(而不是对象)对其进行调用:

Paddle.setIsPaused(true/false);

注意,如果静态函数引用了类变量,则所有这些变量也应标记为静态。 (例如,如果您有一个bool isPaused不是将其标记为静态,因为无论如何对于所有对象它都应该始终相同)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM