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

我在弄清楚这一点时遇到了麻烦,并且在Google上找不到对我有帮助的东西.

统一来说,如果脚本是从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();”时出现问题部分.现在看来,如果函数正在寻找Component类型,而获得的是NetworkManager类型,那显然是行不通的……这就是我所坚持的地方.我不知道如何使它工作,并且我已经超过了15分钟的Google搜索限制.

解决方法:

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

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

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

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

上一篇:UnityEditor使用笔记 -- 自定义Hierarchy面板的右键菜单栏


下一篇:CodeGo.net>如何创建基本字符类的实例