gpt4 book ai didi

unity3d - 如何避免在 PREFAB MODE 中调用 OnValidate 方法?

转载 作者:行者123 更新时间:2023-12-03 17:13:58 26 4
gpt4 key购买 nike

我的场景中有一个游戏对象作为实例预制件。我在 OnValidate 方法中添加了一个具有单一行为和验证逻辑的组件。但是我注意到当我处于预制模式时也会调用 OnValidate 方法。

所以我希望实例预制件的某些变量仅在我的场景中处于编辑器模式时进行验证,因为它们的值取决于场景中的其他对象。

所以我想知道如何避免在预制模式下调用 OnValidate 方法。是否嵌套。

所以我试着写我的方法引用这里:https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/SceneManagement/StageManager/PrefabStage/PrefabStageUtility.cs但是当预制件嵌套在另一个预制件中时它失败了。

class Helper
{
//It doesn't work. It failed when the prefab is nested in another prefab.
public static bool PrefabModeIsActive(Gameobject object)
{
UnityEditor.Experimental.SceneManagement.PrefabStage prefabStage = UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetPrefabStage (gameObject);
if(prefabStage != null)
return true;
if(UnityEditor.EditorUtility.IsPersistent(gameObject))
{
return true;
}

return false;
}
}

我的行为

class MyMonobehaviour : MonoBehaviour
{
public MyScriptableObject entity;

# IF UNITY_EDITOR
void OnValidate()
{
//So I expected that logic onvalidate is called only on instance prefab in my scene.
if(!Helper.PrefabModeIsActive(gameObject) && entity == null)
{
entity = Resources.Load<MyScriptableObject>("MyAssetScene/" + SceneManager.GetActiveScene().name) as MyScriptableObject;
}
}
#endif
}

所以我希望 onvalidate 逻辑只在我场景中的实例预制件上调用。

更新 1

一个似乎有效的替代解决方案是检查游戏对象中场景中的一些值:

bool PrefabModeIsActive(Gameobject gameobject)
{
return String.IsNullOrEmpty(gameObject.scene.path)
&& !String.IsNullOrEmpty(gameObject.scene.name);
}

但我不确定是否有一些案例研究可能并非如此

最佳答案

您可以尝试使用 PrefabStageUtility's GetCurrentPrefabStage方法。

前任。

    bool PrefabModeIsActive()
{
return UnityEditor.Experimental.SceneManagement.
PrefabStageUtility.GetCurrentPrefabStage() != null;
}

关于unity3d - 如何避免在 PREFAB MODE 中调用 OnValidate 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155148/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com