У меня игровой объект в качестве префаба в моей сцене. Я добавил компонент, который имеет одно поведение с логикой проверки в методе 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;
}
}
}
MyMonobehaviour
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
Альтернативное решение, которое, кажется, работает, это проверить некоторые значения на сцене внутри игрового объекта:
void PrefabModeIsActive(Gameobject gameobject)
{
return String.IsNullOrEmpty(gameObject.scene.path)
&& !String.IsNullOrEmpty(gameObject.scene.name);
}
но я не уверен, если есть какие-то примеры, где это может быть не так