Значения Unity3D исчезают из пользовательского редактора при запуске игры - PullRequest
0 голосов
/ 03 июля 2018

У меня проблема при изменении значений и попытке играть в игру, эти значения исчезают. Например, если я включаю bool в редакторе, и запуск игры bool отключает сам. Я использую пользовательский редактор для изменения этих значений.

Это мой скрипт настроек, и [system.serializable] не помогает:

using UnityEngine;

[System.Serializable]
public class Settings : MonoBehaviour 
{
    public static bool testMode;
    public static string androidUnitID;
    public static string iphoneUnitID;
}

А это мой редактор сценариев:

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Settings))]
class TestEditor : Editor {

    public override void OnInspectorGUI() {

        GUILayout.Label("Settings", EditorStyles.boldLabel);

        Settings.testMode = EditorGUILayout.Toggle("Test Mode", Settings.testMode);
        Settings.androidUnitID = EditorGUILayout.TextField("Android UnitID", Settings.androidUnitID);
        Settings.iphoneUnitID = EditorGUILayout.TextField("Android UnitID", Settings.iphoneUnitID);

}

Сначала я изменяю значения в редакторе:

Editor

Тогда, когда режим воспроизведения активен, все значения исчезают:

Play mode

Есть ли способ исправить эту проблему? Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 04 июля 2018

Unity не поддерживает сериализацию статических переменных «из коробки» (вы можете переписать сериализацию, чтобы приспособить ее, но усилия против вознаграждения и все такое). Итак, исходя из этого, то, что вы по существу видите, это значения, которые вы устанавливаете, сохраняемые в классе во время редактирования, но когда Unity переходит в режим Play, все классы повторно инициализируются, десериализуются и подготавливаются для игры. играть. Ваши статические значения потеряны.

Это та же самая причина, по которой измененные значения во время игры не сохраняются, когда вы возвращаетесь в режим редактирования. Режим редактирования и режим воспроизведения - это, по сути, два отдельных процесса.

Лучше всего было бы создать ScriptableObject с теми полями, которые вы пометили как статические в своем классе Settings, создать ссылку на новый ScriptableObject, а затем, если хотите, изменить значения непосредственно из ScriptableObject.

Что-то вроде:

[CreateAssetMenu ( fileName = "Settings", menuName = "Settings/Create Settings SO", order = 1 )]
public class SettingsScriptableObject : ScriptableObject
{
  public bool testMode;
  public string androidUnitID;
  public string iphoneUnitID;
  //... Any further configuration/settings items you want should go here.
}

Затем вы измените свой Settings класс:

public class Settings : MonoBehaviour
{
  public SettingsScriptableObject SettingsSO;
}

И скрипт вашего редактора:

[CustomEditor(typeof(Settings))]
class TestEditor : Editor
{
  public override void OnInspectorGUI()
  {
    if ( target == null ) return;
    var settings = target as Settings;
        GUILayout.Label("Settings", EditorStyles.boldLabel);
        settings.SettingsSO.testMode = EditorGUILayout.Toggle("Test Mode", settings.SettingsSO.testMode);
        settings.SettingsSO.androidUnitID = EditorGUILayout.TextField("Android UnitID", settings.SettingsSO.androidUnitID);
        settings.SettingsSO.iphoneUnitID = EditorGUILayout.TextField("Android UnitID", settings.SettingsSO.iphoneUnitID);
  }
}

В Unity есть отличное видео * о режимах редактирования и воспроизведения и о том, как ScriptableObjects можно использовать для решения проблемы сериализации.

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