【发布时间】:2019-10-02 22:34:23
【问题描述】:
我的场景中有一个游戏对象作为实例预制件。我在 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);
}
但我不确定是否有一些案例研究表明这可能不是真的
【问题讨论】:
标签: unity3d