【问题标题】:Can't drag scene object onto public UnityEvent无法将场景对象拖到公共 UnityEvent 上
【发布时间】:2019-06-24 06:54:11
【问题描述】:

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

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

【问题讨论】:

  • 如果你能提供更多的上下文会有所帮助,比如:脚本和预制件在同一个场景中吗?你在使用 UnityEvent?
  • 抱歉,他们在同一个场景,我使用公共 UnityEvent onExitEvent;它在检查器中创建了一个小框,您可以在其中拖动对象以访问其方法(您可以在其中选择运行时或编辑器和运行时)如果有帮助,这里是检查器图像的链接ibin.co/4lgDRb7vL7kJ.png
  • 这听起来是正确的做法。如果您在脚本中添加一个简单的 GameObject 公共字段,您可以将您的对象附加到它吗?
  • 哦,很奇怪,不,它也不允许这样做。是否可能是因为带有公共 UnityEvent 的脚本是 StateMachineBehavior 而不是单一行为,而我试图引入的对象具有单一行为脚本?好像它不允许它,尽管它不允许我创建变量。
  • 哦,AnimatorContoller 不是场景的一部分。这一定是您无法从场景中附加对象的原因。我没有想到的解决方案,但我会看看。

标签: unity3d


【解决方案1】:

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

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

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

您(通常)不能在任何资产(如 Prefabs 或 ScriptableObjects)中拥有任何场景引用。


有一些解决方法,但是仍然允许您这样做。你可以例如为您要传递的每个值创建 ScriptableObject 容器。类似的东西,例如

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

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

这种GameObjectReference 的实例现在是ScriptableObject,因此也“存在”在资产中=>您可以在任何其他资产中将其引用为预制件和其他ScriptableObjects。

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

[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

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多