2014-10-19 149 views
3

我无法弄清楚这一点,并且在谷歌上找不到帮助我的东西。如何从另一个游戏对象实例化monobehaviour脚本

统一起来,如果一个脚本派生自MonoBehaviour,它不能使用“new”关键字实例化。精细。所以我一直在研究如何做到这一点,看起来获得游戏对象,然后得到它的游戏组件是要走的路......但它并不会走得太远......所以我有一个叫做GameObject的游戏对象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分钟的限制。

+1

我不明白为什么这个问题是downvoted。这是一个很好的问题 - 请在投票时留下一些反馈意见。 – luqui 2014-10-19 22:10:21

回答

2

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

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

这将在您的场景中创建新的NetworkManager游戏对象。

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

+0

谢谢!我感谢你指点我对预制件。我会阅读它! – 2014-10-19 20:36:31

2

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

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

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

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

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

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