另一个最佳实践问题。我现在有一个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;
}
答案 0 :(得分:0)
创建一个将所有脚本加载到数组中的类。这个类不一定是MonoBehaviour,但是对于这个例子它将是。
您有两种选择:
或者将所有脚本放在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);
}
}
现在,您可以使用自己的逻辑来确定哪个GameObject
获取哪个Script
,但这应该对您来说非常简单。
答案 1 :(得分:0)
回到这个问题,因为我的原始答案实际上是错误的,正如有人指出的那样。 Monoscript存储对单个脚本的引用(强类型),但Monoscript仅在UnityEditor命名空间中有效。
由于我的问题是关于最佳实践,我提供了我作为提案所做的事情,但由于我还只有2个月的时间进入Unity开发,我对其他意见感兴趣。我最终做的是为每种对象类型构建预制件,它充分利用了Unity WYSIWYG界面的强大功能。因此,存储对脚本的引用变得无关紧要,因为预制件包含我需要的所有行为。
由于我的游戏仍然需要一个数据层来驱动游戏,因此我的可编写脚本的对象变得更加简单。引用脚本的问题变成了引用包含脚本的预制件的问题。
FunctionR在他的回答中描述了如何使用Resources.Load在运行时加载内容。但是,我的问题是如何引用我想要的单个脚本。我所做的只是将我想要加载的资源路径(即:prefab)存储为字符串。
答案 2 :(得分:-1)
Unity脚本资源的类型为“MonoScript”。只需将变量声明为此类型即可。