我正在参加使用 Unity 进行游戏开发的在线课程,讲师有时可能会含糊其辞。我的印象是使用游戏对象与使用游戏对象名称相同(在本例中是 MusicPlayer),但是当我尝试用游戏对象实例替换 MusicPlayer 实例时,我收到错误
CS0246:找不到类型或命名空间名称“gameobject”。您是否缺少 using 指令或程序集引用?
我只是想了解两者之间的区别。
using UnityEngine;
using System.Collections;
public class MusicPlayer : MonoBehaviour {
static MusicPlayer instance = null;
void Awake(){
if (instance != null) {
Destroy(gameObject);
Debug.Log("Duplicate MusicPlayer Destroyed");
} else {
instance = this;
GameObject.DontDestroyOnLoad(gameObject);
Debug.Log("Original MusicPlayer Created!");
}
}
}
这是我遇到错误的代码:
using UnityEngine;
using System.Collections;
public class MusicPlayer : MonoBehaviour {
public static gameobject instance = null;
void Awake(){
if (instance != null) {
Destroy(gameObject);
Debug.Log("Duplicate MusicPlayer Destroyed");
} else {
instance = this;
GameObject.DontDestroyOnLoad(gameObject);
Debug.Log("Original MusicPlayer Created!");
}
}
}
gameObject
和GameObject
之间有区别。请注意第二个中的大写“G”。
GameObject 是一个类。您可以像这样创建它的实例:
GameObject myobject = new GameObject("PhilipBall");
或者您可以将其设为公共变量并从编辑器分配它:
public GameObject myobject;
gameObject
是从 GameObject 创建的变量。它的声明方式类似于上面的 myobject
变量示例。
您看不到它的原因是因为它是在名为
Component
的类中声明的。然后一个名为 Behaviour
的类继承自该 Component
类。还有另一个名为 MonoBehaviour
的类,它继承自 Behaviour
类。最后,当您执行 MonoBehaviour
时,名为 MusicPlayer 的脚本继承自 public class MusicPlayer : MonoBehaviour
。因此,您继承了 gameObject
变量并可以使用它。
GameObject类的
gameObject
变量类型,用于引用此脚本附加到的游戏对象。
我想知道为什么我不能使用 gameObject 而必须使用名称 游戏对象
你实际上可以做到这一点。只需将
public static gameobject instance = null;
替换为 public static GameObject instance = null;
,然后将 instance = this;
替换为 instance = this.gameObject;
。
public class MusicPlayer : MonoBehaviour
{
public static GameObject instance = null;
void Awake()
{
if (instance != null)
{
Destroy(gameObject);
Debug.Log("Duplicate MusicPlayer Destroyed");
}
else
{
instance = this.gameObject;
GameObject.DontDestroyOnLoad(gameObject);
Debug.Log("Original MusicPlayer Created!");
}
}
}
当你使用这个时,你指的是这个脚本,它是
MusicPlayer
。当您使用 this.gameObject
时,您指的是此脚本附加到的游戏对象。
为什么你的老师不使用
public static GameObject instance = null;
?
这是因为他们想要在运行时访问
MusicPlayer
脚本变量、函数。他们不需要游戏对象。现在,这可以通过 GameObject 来完成,但您必须执行额外的步骤,例如使用 GetComponent
才能在该脚本中使用变量或调用函数。
例如,您在该脚本中有一个名为“runFunction”的函数,并且您想要调用它。对于第一个示例,您可以这样做:
MusicPlayer.instance.runFunction();
对于第二个例子,你必须这样做:
MusicPlayer.instance.GetComponent<MusicPlayer>().runFunction();
这是很大的区别,还要注意
GetComponent
很贵。