我在弄清楚这一点时遇到了麻烦,并且在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;它会工作.