参照ScriptableObject的Unity ScriptableObject传递给Monobehaviour

时间:2019-11-18 14:57:12

标签: c# unity3d software-design

所以我有一个数据脚本:

[CreateAssetMenu(menuName="MyData", fileName="GoData")]
public class MyData : ScriptableObject
{
    [SerializeField] private List<GameObject> myObjects;

    public List<GameObject> MyObjects { get { return myObjects; } }
}

只是一堆游戏对象的容器。该容器应该像这样传递到可编写脚本的对象中:

public class SomeAwesomeScript : ScriptableObject, ISomeAwesomeInterface
{
    public MyData myData;

    public SomeAwesomeScript Init(...)
    {
        //initializations, since we cant use constructors when using ScriptableObject
    }

    public void DoSomeAwesomeShit()
    {
        DoSomethingWith(myData.MyObjects);
    }
}

现在DoSomeAwesomeShit是在ISomeAwesomeInterface中定义的,实际实现应该是实现该方法的每个其他类唯一的。

然后在这样的单一行为中使用SomeAwesomeScript:

public class SomeAwesomeBehaviour : MonoBehaviour
{
    private ISomeAwesomeInterface awesomeness;

    void Start()
    {
        //initialising awesomeness
    }

    void Update()
    {
        //...
        awesomeness.DoSomeAwesomeShit();
        //some code, changing awesomeness to other ISomeAwesomeInterface based on some condition maybe
    }
}

这里的问题是我无法将MyData分配给SomeAwesomeScript,因为 Default references will only be applied in edit mode 因此,当我启动统一程序时,MyData为null。

有没有办法解决这个问题?还是我被迫将“ MyData”部分硬编码到每个ISomeAwesomeInterface

编辑:

那些脚本不必继承ScriptableObject

我在此处进行此设计的唯一原因是,因为我需要将List分配给我的SomeAwesomeScript(以及ISomeAwesomeInterface的所有其他实现),除了使那些脚本继承ScriptableObject之外,似乎没有其他方法

0 个答案:

没有答案