【问题标题】:Unity3D values disappear from custom editor when starting game开始游戏时,Unity3D 值从自定义编辑器中消失
【发布时间】:2018-07-04 08:51:03
【问题描述】:

我在更改值并尝试玩游戏时遇到问题,这些值消失了。例如,如果我在编辑器中启用 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);

}

首先我要更改编辑器上的值:

然后,当播放模式处于活动状态时,所有值都会消失:

有没有办法解决这个问题? 感谢您的帮助。

【问题讨论】:

  • 你知道你有一个 .在Settings.settings 的末尾Settings.settings. = EditorGUILayout.Toggle("Test Mode", Settings.testMode); 行中,关于你的问题,你能解释一下吗?您是说您在编辑器脚本中设置了这些值,但是当您开始游戏时,这些值会发生变化?你确定你在任何地方都没有改变这些值吗?因为它们是静态的,所有对象都会引用同一个对象。
  • 感谢您的帮助。我在重写代码时犯了一个错误,一切正常。问题是价值在任何地方都没有改变,但价值仍然消失。我添加了一些图片来了解这个想法。

标签: c# unity3d


【解决方案1】:

Unity 不支持“开箱即用”的序列化静态变量(您可以重写序列化以适应它,但是努力与奖励等等)。因此,基于此,您实际上看到的是您在编辑期间设置的存储在类中的值,但是当 Unity 进入播放模式时,所有类都被重新初始化、反序列化并为游戏做好准备——玩。你的静态值丢失了。

这与当您以另一种方式返回编辑模式时不会保留游戏期间更改的值的原因相同。编辑模式和播放模式本质上是两个独立的过程。

您最好的选择是创建一个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 上的an excellent video 介绍了编辑和播放模式,以及如何使用 ScriptableObjects 来克服序列化问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多