2014-10-19 163 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>(); 
相關問題