Запретить приложению Unity Editor вход в режим воспроизведения - PullRequest
0 голосов
/ 25 декабря 2018

Можно ли помешать Unity изменить режим воспроизведения после того, как пользователь нажал кнопку?

Допустим, у меня есть собственный редактор, который может иметь состояние, которое не может быть правильно сериализовано;если в этот момент пользователь изменит режим Unity Editor, его изменения будут потеряны.

Это возможность полностью избавиться от несериализуемого состояния, но это задача совершенно другой сложности.Хотелось бы избежать этого.

UPD:

Я проверил ответ derHugo с помощью следующего сценария:

using UnityEditor;
using UnityEngine;

namespace Innoactive.Hub.Training.Editors
{
    [InitializeOnLoad]
    public class ProveThatDudeWrongWindow : EditorWindow
    {
        private static ProveThatDudeWrongWindow windowInstance;

        private string notSerializedString = "default";

        static ProveThatDudeWrongWindow()
        {
            EditorApplication.playModeStateChanged += OnPlayModeStateChanged;
        }

        [MenuItem("Test/I'm damn sure he's wrong")]
        private static void MenuItem()
        {
            if (windowInstance == null)
            {
                windowInstance = GetWindow<ProveThatDudeWrongWindow>();
            }

            windowInstance.notSerializedString = "some value";
        }

        [MenuItem("Test/Display current value")]
        private static void DisplayCurrentNonSerializedValue()
        {
            windowInstance = GetWindow<ProveThatDudeWrongWindow>();
            Debug.Log("string: " + windowInstance.notSerializedString);
        }

        private static void OnPlayModeStateChanged(PlayModeStateChange state)
        {
            if (state == PlayModeStateChange.ExitingEditMode)
            {
                EditorApplication.isPlaying = false;
            }

            Debug.Log("state: " + state);
        }
    }
}

Затем я сделал следующее:

  1. Нажмите опцию Test/I'm damn sure he's wrong, чтобы установить несериализованное значение от default значение до some value
  2. Нажмите Test/Display current value, чтобыубедитесь, что значение изменено
  3. Нажмите кнопку воспроизведения
  4. Нажмите Test/Display current value, чтобы увидеть текущее значение.Если это default, решение derHugo не работает, если оно some value, оно работает.

Результат: derHugo круто.

1 Ответ

0 голосов
/ 25 декабря 2018

Да, есть, я думаю,

Вы можете зарегистрироваться на EditorApplication.playModeStateChanged

Посмотрите на пример из документа, который я модифицировал:

using UnityEngine;
using UnityEditor;

public static class PlayModeStateChangedExample
{   
    private static void LogPlayModeState(PlayModeStateChange state)
    {
        Debug.Log(state);
    }

    public static void SetPlayModeEnabled(bool enabled)
    {
        //This is possible since you allways can remove
        //a listener even if there is none so far
        //This allways removes the listener making sure it is only added once  
          EditorApplication.playModeStateChanged -= LogPlayModeState;

        if(!enabled)
        {
            EditorApplication.playModeStateChanged += LogPlayModeState;
        }
    }
}

Теперь все, что осталось - сбросить EditorApplication.isPlaying обратно на false, например, заменив

Debug.Log(state);

на

// This mode occures right before entering PlayMode
// and is the moment in which we want to intervene
if(state == PlayModeStateChange.ExitingEditMode)
{
    EditorApplication.isPlaying = false;
}

, чтобы убить PlayMode.

Так что вы можете звонить откуда угодно, например:

PlayModeStateChangedExample.SetPlayModeEnabled(false);

Однако я не уверен, что это полностью предотвратит часть сериализации, так как это также указано в документе

Установка isPlaying задерживает результат до тех пор, пока не завершится весь код сценария для этого кадра.

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