Unity(对象名称与游戏对象)

问题描述 投票:0回答:1

我正在参加使用 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!");
        }
    }
}
c# unity-game-engine
1个回答
3
投票

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
很贵。

© www.soinside.com 2019 - 2024. All rights reserved.