无法将场景对象拖到公共UnityEvent上

时间:2019-06-24 06:54:11

标签: unity3d

我有一个带有公共UnityEvent的脚本,我试图将场景对象拖到对象插槽,以便我可以访问其方法,但不接受该对象。我不确定自己在做什么错。

场景对象是一个预制实例,我确实尝试过拆开预制包,但没有任何作用。

1 个答案:

答案 0 :(得分:0)

在评论中,您提到了您正在谈论的脚本是StateMachineBehaviour

StateMachineBehaviour不是继承自MonoBehaviour,而是继承自ScriptableObject

ScriptableObject实例“活跃”在资产中而不是某个场景中

您(通常)在诸如Prefabs或ScriptableObjects之类的资产中不能有任何Scene引用。


但是有一些变通办法仍然可以使您做到这一点。您可以例如为您要传递的每个值创建ScriptableObject容器。像

[CreateAssetMenu]
public class GameObjectReference : ScriptableObject
{
    public GameObject gameObject;

    public void SetActive(bool value)
    {
        if(gameObject) gameObject.SetActive(value);
    }
}

这样的GameObjectReference实例现在是ScriptableObject,因此也“存在”于Assets =>您可以在其他任何资产中将其引用为Prefabs和其他ScriptableObject

因此,您所需要做的就是确保从场景中设置此值,例如使用

[ExecuteInEditMode]
public class GameObjectReferenceSetter : MonoBehaviour
{
    public GameObjectReference gameObjectReferenceAsset;

    private void Awake()
    {
        gameObjectReferenceAsset.gameObject = gameObject;
    }
}

您可以为所需的每种类型创建此类参考资产和设置器对,并传递所需的公共方法,以便可以从UnityEvent进行调用。

具有[ExecuteInEditMode]的项目也应该已经在EditMode中设置。但是,由于“官方”仍然无法在ScriptableObject字段上具有场景引用,因此该值通常显示Type missmatch,但引用的是正确的对象,如单击该字段时应该看到的那样。


另一种替代方法是使用某种依赖项注入(对于Unity,经常提到的免费解决方案是Zenject)。第一次设置起来有点复杂,但是一旦它开始工作,它就会变得更加灵活和可扩展,因为您不需要为要传递给StateMachineBehaviour的每种类型实现包装器。

有关Zenject的更多信息和操作方法,请参见其github page