3

我很难弄清楚这一点,并且在谷歌上找不到对我有帮助的东西。

统一来说,如果脚本派生自 MonoBehaviour,则无法使用“new”关键字对其进行实例化。美好的。所以我一直在研究如何做到这一点,似乎获取 GameObject,然后获取它的 GameComponent 是要走的路......但它不会走得很远......

所以我有一个名为 NetworkManager 的游戏对象。附加到它的是一个名为 NetworkManager 的脚本。我有另一个名为 Main 的 GameObject,附加了一个名为 Main 的脚本(惊喜!)。基本上我想做的是在主脚本中“实例化”网络管理器,这样我就可以做诸如 networkManager.hostServer() 或 networkManager.kickPlayer() 之类的事情。

这是我的 main.cs 脚本:

public class Main : MonoBehaviour {

Player player;
GameObject networkManager;
UiManager uiManager;

// Use this for initialization
void Start () 
{

    player = new Player(Network.player, Environment.UserName, 0, 0);
    networkManager = GameObject.FindGameObjectWithTag("NetworkManager").GetComponent<NetworkManager>();
    uiManager = new UiManager();

}

我得到的错误如下:“无法将类型'Assets.scripts.NetworkManager'隐式转换为'UnityEngine.GameObject'”

当我添加“.GetComponent();”时出现问题 部分。现在似乎很明显,如果该函数正在寻找一个 Component 类型,而不是获得一个 NetworkManager 类型,它就无法工作......这就是我被卡住的地方。我不知道如何让它工作,而且我已经超过了我在谷歌搜索上的 15 分钟限制。

4

2 回答 2

2

如果您想实例化新的网络管理器 GameObjects,您应该花一些时间了解“预制件”。您可以通过将网络管理器 GameObject 从您的场景拖到您的文件夹之一,使其成为其中之一。实例化预制件很简单:

 Instantiate(NetworkManagerPrefab, new Vector3(0, 0, 0), Quaternion.identity);

这将在您的场景中创建新的 NetworkManager GameObject。

正如您所说,您的脚本无法正常工作,因为它正在获取组件并将其存储到 GameObject。只需将变量的类型更改为组件的类型,或者如果组件是脚本,则更改为类的类型。在您的情况下更改GameObject networkManager;NetworkManager networkManager;,它将起作用。

于 2014-10-19T06:27:56.567 回答
2

如果你有预制件,那么你可以实例化它。

GameObject g = Instantiate(prefab, position, rotation) as GameObject;

如果游戏对象已经在场景中,除非你想要多个,否则不要实例化它。你只能找到它。

GameObject g = GameObject.Find("GameObject Name");

然后你会问,我如何获得附加到游戏对象的脚本。像这样:

ScriptName s = g.GetComponent<ScriptName>();
于 2014-10-19T20:26:10.780 回答