我的课程几乎相同,PaddleLeft
和PaddleRight
。当我需要完成任务时,我厌倦了调用这两个类,我宁愿一次完成它们。例如,以下是我必须做的事情:
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和超类。
先谢谢!
答案 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或类进行通信。
由于您的课程都被称为PaddleRight
和PaddleLeft
,因此您只需将此课程称为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)
您PaddleLeft
和PaddleRight
不是课程。它们是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
而不是将它标记为静态,因为它应该始终对所有对象都相同)