如何从另一个 GameObject 实例化一个:monobehaviour 脚本
Posted
技术标签:
【中文标题】如何从另一个 GameObject 实例化一个:monobehaviour 脚本【英文标题】:How to instantiate a : monobehaviour script from another GameObject 【发布时间】:2014-12-14 07:57:12 【问题描述】:我无法弄清楚这一点,并且在谷歌上几乎找不到对我有帮助的东西。
统一来说,如果脚本派生自 MonoBehaviour,则不能使用“new”关键字对其进行实例化。美好的。所以我一直在研究如何做到这一点,似乎获取 GameObject,然后获取它的 GameComponent 是要走的路......但它不会走得很远......
所以我有一个名为 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】:如果您想实例化新的网络管理器游戏对象,您应该花一些时间了解“预制件”。您可以通过将网络管理器游戏对象从场景中拖到其中一个文件夹中来将其设置为其中之一。实例化预制件很简单:
Instantiate(NetworkManagerPrefab, new Vector3(0, 0, 0), Quaternion.identity);
这将在您的场景中创建新的 NetworkManager GameObject。
正如您所说,您的脚本无法正常工作,因为它正在获取组件并将其存储到 GameObject。
只需将变量的类型更改为组件的类型,或者如果组件是脚本,则更改为类的类型。在您的情况下,将 GameObject networkManager;
更改为 NetworkManager networkManager;
即可。
【讨论】:
谢谢!感谢您将我指向预制件。我会仔细阅读它!【参考方案2】:如果你有预制,那么你可以实例化它。
GameObject g = Instantiate(prefab, position, rotation) as GameObject;
如果游戏对象已经在场景中,除非您想要多个,否则不要实例化它。你可以找到它。
GameObject g = GameObject.Find("GameObject Name");
然后你会问,我如何获取附加到游戏对象的脚本。像这样:
ScriptName s = g.GetComponent<ScriptName>();
【讨论】:
以上是关于如何从另一个 GameObject 实例化一个:monobehaviour 脚本的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个活动访问在一个活动中实例化并在其自己的线程中运行的对象?
实例化 GameObject 会导致所述对象的 Transform 被破坏?
GameObject.Instantiate(游戏体的实例化),角色的选择