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 можно использовать для решения проблемы сериализации.