Articles of 系列化

在Unity Inspector中获取任何types

我正在为我的游戏开发一个SaveManager系统。 基本上它应该做的是; 1)通过拖放到检查器获取“ANY”用户创建的Serializable类。 (保存数据)。 2)使用BinaryFormatter或XMLSerializer将该类写入文件。 我希望能够在未来的游戏中使用它。 所以它应该是保存数据类(types)独立(如序列化)。 我会像使用资源一样使用它,导入SaveManager,将序列化的类作为参数,然后让其余部分完成。 但正如我所说,它应该能够使用任何用户创建的序列化类。 所以问题是,因为“序列化类”将由用户在“游戏项目”(不在SaveManager项目中)编写,而且我的SaveManager项目中没有那个“序列化”类types,不知道如何制作SaveManager,从检查器引用该类。 所以我们可以说我在游戏项目中创建了这个类(不在SaveManager项目中) [System.Serializable] public class SaveData { public string Name = "Name"; public int Number = 5; } 现在,当我将SaveManager项目(资产)导入到我的“游戏”项目中时,我应该可以将脚本拖放到SaveManager检查器,然后让其完成。 由于BinaryFormatter适用于每个Serializabletypes,因此types的名称实际上并不重要。 我的意思是BinaryFormatter是types自由的,只要types是可序列化的。 我想要使​​用该function,并使SaveManagertypes也是免费的。 所以在未来,如果我想使用,说“MyNewSaveData”序列化类,“在另一个游戏”,我想能够拖放到SaveManager督察,让其余的做。 现在的事情是,如果我使用 public object _SaveData; 在SaveManager脚本中,unity inspector不显示它。 如果我使用 public Object _SaveData 它将用户创建的types转换为对象,并且我失去了我需要的types。 我试图使用System.Type,但统一不显示它。 基本上我想要做的是,获得“任何”序列化的类作为参考。 喜欢 public SerializedClass _SaveData; 或类似的东西 public Script _SaveData; 该引用应该接受“任何”序列化的类。 获取它的types,然后将其转换为该types。 […]

统一:组件不被序列化

我有这样的脚本: public class A: MonoBehaviour { public bool x = false; } …和一个像这样的自定义编辑器: [CustomEditor(typeof(A))] public class A_E: Editor { public override void OnInspectorGUI() { A a= target as A; if (a== null || a.gameObject == null) return; ax = !EditorGUILayout.Toggle("x", !ax); } } 当我进入播放模式时,属性重置。 我试图通过添加: if(GUI.changed) EditorUtility.SetDirty(a); 但是这只能解决它的播放模式。 如果我保存并closures了场景,它将重置为默认值。 此外,如果通过自定义编辑器更改组件,场景不会变脏。

Vector3数组序列化ReorderableList

我一直在做一个ReorderableList,但是让我非常头疼。 我已经到了想要定义一个“drawElementCallback”callback的地步,看起来像这样: list.drawElementCallback = (rect, index, active, focused) => { EditorGUI.PropertyField(rect, list.serializedProperty.GetArrayElementAtIndex(index), GUIContent.none); }; 它应该绘制的是Vector3对象数组中的一个Vector3对象。 我得到这样的属性:(“属性”是一个SerializedProperty包含我需要的属性) SerializedProperty locationsProperty = property.FindPropertyRelative("locations"); 数组声明如下: public Vector3[] locations; 在标记为“可序列化”的容器类中。 我用不同的代码得到的问题是,ReorderableList正确显示所有的向量,但它不允许我重新sorting任何项目,也不删除它们(我可以添加新的Vector3对象,并按预期更改它们)。 有了这个代码,我想解决这个问题。 但是,现在我不断收到以下错误: “InvalidOperationException:移过所有属性时操作不可能(下一个返回false)” 我想制作一份可重新订购的清单,因为看起来很简单,但是我不知道这个问题,我真的希望我还没有开始研究这个问题。 过去三天里大部分时间都是这样。 如果有人知道如何解决这个问题,我将非常感激。 为了澄清,这段代码正确地显示了数组: list.drawElementCallback = (rect, index, active, focused) => { SerializedProperty item = locationsProperty.GetArrayElementAtIndex(index); EditorGUI.BeginChangeCheck(); item.vector3Value = EditorGUI.Vector3Field(rect, string.Empty, item.vector3Value); }; 但不允许我删除或重新排列项目。 我以为我应该显示的代码来演示确实有数组项目。

序列化ScriptableObject而不创建一个资产呢?

有没有可能做这样的事情? public class SomeScriptable : ScriptableObject { public MyScriptable myScriptable; public void OnValidate() { if (myScriptable == null) { myScriptable = ScriptableObject.CreateInstance<MyScriptable>(); } } } public class MyScriptable : ScriptableObject { public int MyVar1; public string MyVar2; } 我尝试过,但在Unity中出现“types不匹配”错误。

在Unity编辑器中保持状态而不会触发序列化

在我的游戏中,我有一个MonoBehaviour WorldView ,当在编辑器创建时,初始化一个大字典。 后来从编辑器WorldViewEditor调用WorldView.SetBlock()来尝试访问这个字典,但是发现它是空的。 如果我理解正确,这是因为我的编辑器不访问相同的WorldView实例,而是通过序列化和反序列化我的原始实例而得到的副本。 通过序列化过程推送这本字典是一个性能噩梦,并不支持Unity的开箱即用。 这个字典不应该在任何编辑器中显示,对于实例来说是私有的,并且每次加载场景时都会调用初始化。 这听起来像是将它保存在序列化过程之外的一个完美的例子。 我可以尝试利用ISerializationCallbackReceiver,但这仍然需要我通过一些序列化过程来拉整个字典。 我正在考虑在统一之外的一个单独的图书馆中保持所有的相关状态,但这有其自身的缺点。 有没有办法把这本字典放在保存状态的地方?

我如何创建一个自定义的PropertyDrawer为我的点结构?

我创建了一个Point结构体: [System.Serializable] public struct Point { public int x; public int y; } 我正在尝试为它创建一个属性抽屉,以便当它在检查器中显示时,它将显示在Vector2字段中。 我在“编辑器”文件夹中有以下脚本: using UnityEditor; using UnityEngine; [CustomPropertyDrawer(typeof(Point))] public class PointEditor : PropertyDrawer { public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { EditorGUI.Vector2Field(position, label, property.vector2Value); } } 它在检查器中显示了我想要的方式,但值被locking在0.基本上,我试图从OnGUI方法内部访问Point实例,但这可能是完全错误的方法。 我怎样才能做到这一点,当检查员的值改变时,相应的Point也会改变?

如何使一个字段在检查员中可见(可附着),但通过代码无法访问(类似于私人)?

比方说,我有一个名为ButtontypesButton的variables,当然是System.Serializable 。 我希望这个variables可以通过检查员分配,所以我把它public : public class SomeScript : MonoBehaviour{ public Button button; } 这给了我: 现在,我想保持代码的清洁和安全(有组织),并且有一个真正的原因,我需要保留封装。 我知道在运行时检索组件的方法有很多种,例如transform.Find("Some/Genius/TypeUnsafe/Path")或GameObject.Find("3 seconds scene iteration").GetComponent(…). 我想避免这一点。 如何在检查员中将可变private access与public access混合?