存储对脚本的引用以在运行时附加

时间:2014-12-06 01:11:55

标签: c# unity3d

另一个最佳实践问题。我现在有一个ScriptableObjects列表(感谢LearningCocos2d),它定义了我可以在运行时加载的sprite列表。

我遵循了本教程:http://www.jacobpennock.com/Blog/?p=670

为了驱动一些自定义行为,我希望在实例化时将不同的脚本应用于我的各种游戏内对象。什么是存储我想要应用的所需脚本的引用的最佳方法?

[编辑]更多细节:

我的脚本化对象是一个可序列化对象的简单列表。我有一系列已定义的脚本,我想附加到我定义的对象上。但是,Unity似乎不允许我使用以下方法存储对脚本的引用。

public class TestList : ScriptableObject {
    public List<MotionSpriteData> MotionSprites;
}

[System.Serializable]
public class MotionSpriteData {
    public Component motionPath;
}

3 个答案:

答案 0 :(得分:0)

创建一个将所有脚本加载到数组中的类。这个类不一定是MonoBehaviour,但是对于这个例子它将是。

您有两种选择:

  1. 通过编辑器将脚本拖放到数组中。
  2. 或者将所有脚本放在Resources/Scripts/文件夹中,以便在运行时加载它们。

    public class ScriptManager : MonoBehaviour 
    {
       public Object [] list;
    
       void Awake()
       {
           // Comment this line if you used step 1 above.
           list = Resources.LoadAll("Scripts"); 
    
           gameObject.AddComponent(list[0].name);
       }
    }
    
  3. 现在,您可以使用自己的逻辑来确定哪个GameObject获取哪个Script,但这应该对您来说非常简单。

    enter image description here

答案 1 :(得分:0)

回到这个问题,因为我的原始答案实际上是错误的,正如有人指出的那样。 Monoscript存储对单个脚本的引用(强类型),但Monoscript仅在UnityEditor命名空间中有效。

由于我的问题是关于最佳实践,我提供了我作为提案所做的事情,但由于我还只有2个月的时间进入Unity开发,我对其他意见感兴趣。我最终做的是为每种对象类型构建预制件,它充分利用了Unity WYSIWYG界面的强大功能。因此,存储对脚本的引用变得无关紧要,因为预制件包含我需要的所有行为。

由于我的游戏仍然需要一个数据层来驱动游戏,因此我的可编写脚本的对象变得更加简单。引用脚本的问题变成了引用包含脚本的预制件的问题。

FunctionR在他的回答中描述了如何使用Resources.Load在运行时加载内容。但是,我的问题是如何引用我想要的单个脚本。我所做的只是将我想要加载的资源路径(即:prefab)存储为字符串。

答案 2 :(得分:-1)

Unity脚本资源的类型为“MonoScript”。只需将变量声明为此类型即可。

http://docs.unity3d.com/ScriptReference/MonoScript.html