Как избежать вызова метода OnValidate в режиме PREFAB? - PullRequest
4 голосов
/ 15 мая 2019

У меня игровой объект в качестве префаба в моей сцене. Я добавил компонент, который имеет одно поведение с логикой проверки в методе 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); 
}

но я не уверен, если есть какие-то примеры, где это может быть не так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...