c# - 如何实例化一个: monobehaviour script from another GameObject

标签 c# unity3d gameobject

我在解决这个问题时遇到了麻烦,并且在谷歌上找不到任何帮助我的东西。

在unity中,如果脚本派生自MonoBehaviour,则不能使用“new”关键字实例化。美好的。所以我一直在研究如何做到这一点,似乎获取 GameObject,然后获取它的 GameComponent 是可行的方法......但它不会走得太远......

所以我有一个名为 NetworkManager 的游戏对象。附加到它的是一个名为 NetworkManager 的脚本。我有另一个名为 Main 的游戏对象,附加到它的是一个名为 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 分钟的谷歌搜索限制。

最佳答案

如果你想实例化新的网络管理器游戏对象,你应该花一些时间来了解“预制件”。您可以将网络管理器游戏对象从您的场景拖到其中一个文件夹中,使其成为其中之一。实例化预制件非常简单:

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

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

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

关于c# - 如何实例化一个: monobehaviour script from another GameObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446946/

相关文章:

javascript - JavaScript 和 Unity JavaScript (UnityScript) 之间有区别吗?

c# - 为什么在将 Handles.ArrowHandleCap 添加到一条线时它不绘制 ArrowHandleCap?

c# - 克隆/复制现有的游戏对象及其子对象

c# - 对在 C# 中通过 ref/value 传递感到困惑

c# - 如何在文件的详细属性中设置和获取值? C#

c# - 属性更改时在ViewModel中执行方法

c# - Raycast - 从 C# 转换为 UnityScript

c# - Unity3D - 获取组件

c# - 将游戏对象动态添加到 Unity3d 中的场景

c# - C#封装内部类并访问外部