SerializeField和Serializable

本文深入解析Unity中序列化的实现方式,特别是如何通过使用[System.Serializable]属性使非MonoBehaviour类成为可序列化的结构,以便在Inspector中显示和编辑。文章详细介绍了序列化的基本概念,以及其在Unity3D中的应用,并提供了具体示例。

在看Unity官方Demo《space shooter》时,一个没有继承MonoBehaviour的类Done_Boundary :

[System.Serializable]
public class Done_Boundary 
{
	public float xMin, xMax, zMin, zMax;
}

Serializable是.Net自带的序列化
有时候我们会自定义一些单独的class/struct, 由于这些类并没有从 MonoBehavior 派生所以默认并不被Unity3D识别为可以Serialize的结构。自然也就不会在Inspector中显示。我们可以通过添加 [System.Serializable]这个Attribute使Unity3D检测并注册这些类为可Serialize的类型。具体做法如下:

[System.Serializable]
public class FooBar {
    public int foo = 5;
    public int bar = 10;
}

注意:Serializable只可以对class,struct,enum,delegate进行序列化,不可以对属性序列化

具体的SerializeField和Serializable,赵青青大神有具体说明
https://www.cnblogs.com/zhaoqingqing/p/3995304.html
他对ScriptableObject的序列化还进行了举例说明,讲的特别好。

### Unity 中 SerializeField 的用法及解决相关问题 在 Unity 中,`[SerializeField]` 是一个属性,用于强制将私有字段(private field)序列化到 Unity 的 Inspector 面板中。通常情况下,Unity 的 Inspector 面板只会显示公共字段(public fields),但通过 `[SerializeField]`,可以将私有字段暴露给编辑器,从而允许开发者在运行时或设计时修改这些字段的值[^1]。 以下是一个详细的说明代码示例: #### 使用 `[SerializeField]` 的场景 1. **隐藏字段的同时保持可编辑性** 当需要将字段限制为仅在类内部访问,同时希望在 Unity 编辑器中对其进行调整时,可以使用 `[SerializeField]`。 2. **避免公开字段** 公开字段虽然可以直接在 Inspector 中编辑,但可能会破坏封装性原则。通过 `[SerializeField]`,可以在不暴露字段的情况下实现同样的功能。 #### 示例代码 以下代码展示了如何使用 `[SerializeField]` 将私有字段暴露给 Unity 的 Inspector 面板: ```csharp using UnityEngine; public class ExampleClass : MonoBehaviour { [SerializeField] private int hiddenInt = 42; // 暴露给 Inspector 的私有字段 private string notSerializedString = "This will not appear in the Inspector"; // 不会暴露 void Start() { Debug.Log("Hidden Int: " + hiddenInt); // 输出用户在 Inspector 中设置的值 Debug.Log("Not Serialized String: " + notSerializedString); // 输出默认值 } } ``` 上述代码中,`hiddenInt` 被标记为 `[SerializeField]`,因此它会在 Unity 的 Inspector 面板中显示,而 `notSerializedString` 则不会显示[^2]。 #### 常见问题及解决方案 1. **字段未在 Inspector 中显示** 如果发现字段未在 Inspector 中显示,可能是由于以下原因: - 字段未标记为 `[SerializeField]`。 - 字段类型不受支持(例如复杂自定义类型可能需要额外的序列化逻辑)。 - 字段被标记为 `const` 或 `static`,这些类型的字段无法序列化。 2. **字段值在运行时丢失** 如果发现字段值在运行时丢失,可能是由于对象未正确保存或序列化。确保对象已正确存储在场景或预制件中,并且没有在运行时被意外重置。 3. **如何区分 `[SerializeField]` `[HideInInspector]`** `[SerializeField]` 用于将私有字段暴露给 Inspector,而 `[HideInInspector]` 则用于隐藏公共字段或 `[SerializeField]` 标记的字段,使其不在 Inspector 中显示[^3]。 #### 进阶功能:结合 `[Range]` 属性 可以将 `[SerializeField]` 与 `[Range]` 属性结合使用,以限制字段的取值范围。例如: ```csharp using UnityEngine; public class RangeExample : MonoBehaviour { [SerializeField, Range(0, 100)] private int valueInRange = 50; // 限制值在 0 到 100 之间 } ``` 上述代码中,`valueInRange` 的值将在 Unity 的 Inspector 面板中以滑块的形式显示,并且只能在 0 到 100 的范围内调整[^4]。 #### 注意事项 - `[SerializeField]` 不能用于静态字段或常量字段。 - `[SerializeField]` 只能用于字段,不能用于方法或属性。 - 如果字段类型是自定义类,则需要确保该类标记为 `[System.Serializable]`,以便 Unity 能够正确序列化其内容。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值