我有一个带有公共UnityEvent的脚本,我试图将场景对象拖到对象插槽,以便我可以访问其方法,但不接受该对象。我不确定自己在做什么错。
场景对象是一个预制实例,我确实尝试过拆开预制包,但没有任何作用。
答案 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