【问题标题】:Loading a script by name in Unity3D在 Unity3D 中按名称加载脚本
【发布时间】:2013-01-03 16:16:21
【问题描述】:

我正在使用 Unity3D 用 C# 创建一个游戏,我需要调用我在运行时创建的脚本,所以我知道脚本的名称,因为我有一个名称与它完全相同的对象。

我在运行时创建脚本,然后将其保存到我的资源文件夹,但随后我更改了场景并需要调用该脚本并将其附加到当前场景中的我的 Empty GameObject,所以我想使用一些东西像这样:

Script myScript = Resources.Load(myObject.name) as Script;

但我知道不能这样完成,所以我正在寻找一种可以做我想做的事情的方法,因为我需要加载那个新脚本以在运行时添加一些功能。

你知道我的问题有什么解决办法吗?非常感谢!!

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    这实际上比您想象的要容易。您可以使用 AddComponent 方法将脚本添加到游戏对象。所以在你的关卡改变后,你可以抓住你的空游戏对象并执行以下操作:

    var gameObject = ... 
    
    gameObject.AddComponent<Script>(); // where Script is the name of your Script's C# class
    

    见http://docs.unity3d.com/Documentation/ScriptReference/GameObject.AddComponent.html

    【讨论】:

    • 好吧,我可以在编辑器中做到这一点,但是当我构建项目时,它会引发错误。问题是我在运行时使用 FileStream.WriteFile() 创建了一个 .cs 文件,因此当我构建项目时,该文件不像类本身那样存在。事实上,在 Unity 编辑器中我可以做到这一点,但是当我构建项目时,它会抛出错误“无法添加组件,因为类 'myClass' 不存在!”
    • 您在游戏运行时编写该类?你到底想用这个实现什么?也许还有另一种方法可以做到这一点。您能否就为什么需要在运行时创建该类提供一些见解?
    【解决方案2】:
        GameObject gameObj = new GameObject();
        Type scriptType = Type.GetType(nameSpace.className);
        if (scriptType == null)
        {
            foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
            {
                var tempType = a.GetType(nameSpace.className);
                if (tempType != null)
                {
                    scriptType = tempType;
                }
            }
        }
        gameObj.AddComponent(scriptType);
    

    【讨论】:

    • 即使完全没有解释或详细说明,这将使它成为一个答案,而不仅仅是一个代码转储,当有一个非常好的通用方法可用时,为什么世界上会有人认为这是一个可行的选择以更简单、更高效的方式完成工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多