如何从另一个GameObject实例化a:monobehaviour脚本

时间:2014-10-19 03:18:35

标签: c# unity3d gameobject

我无法搞清楚这一点,并且在谷歌上发现很少帮助我。

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

所以我有一个名为NetworkManager的GameObject。附加到它的是一个名为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();”时出现问题。部分。现在看来很明显,如果函数正在寻找一个组件类型,而是获得一个不起作用的NetworkManager类型......那就是我被困住的地方。我不知道如何让这个工作,并且我超过了谷歌搜索的15分钟限制。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

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

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

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

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

然后你会问,我如何将脚本附加到GameObject上。像这样:

ScriptName s = g.GetComponent<ScriptName>();