我只是刚开始序列化,并且有一个问题,为什么公共数组 的自定义类未显示在检查器上。
假设我有如下代码
using UnityEngine;
using System.Collections;
public class A:MonoBehaviour{
public B b;
public C[] c= new C[3];
public D d;
public E[] e;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
[System.Serializable]
public class D
{
}
// Same goes for this you can remove monobehaviour
[System.Serializable]
public class E
{
}
我发现变量"b"在统一的检查器上,但我找不到"c"在哪里。
https://docs.unity3d.com/ScriptReference/SerializeField.html
据我所知,我不需要同时执行 [Serializefield] 或 [Serializable] 公共变量 a 和 b 来显示检查器(因为两者都是公共的,必须自动显示在检查器(?
谁能向我解释为什么检查器上没有出现"c"?还是我误解了什么?任何解释将不胜感激。
这是 B 类和 C 类。 相同的代码只是名称不同。
using UnityEngine;
using System.Collections;
public class B: MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
using UnityEngine;
using System.Collections;
public class C: MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
我尝试了D,C建议的以下答案。 并且两者都没有显示在检查器上。
// Attach this to gameobject and your classes will show up on inspector
public class A : MonoBehaviour
{
// both B and C is class
public B b;
public C[] c;
}
//This doesn't need to be monobehaviour as this should be the data class and A should be the container
[System.Serializable]
public class C {
public int number;
}
// Same goes for this you can remove monobehaviour
[System.Serializable]
public class B {
[SerializeField]
private int ID;
public string name;
}
在当前情况下,序列化是关于使对象对 Unity 的检查器"可读"。
当您应用Serializable
属性时,这意味着您是在说这种类型的对象可以被 Unity 的 inpector "读取"。
应用Serializefield
属性时,这意味着检查器正在使当前对象"可读"。
(前提是它可以序列化,并且一开始还没有序列化(
回到您的问题,您应该在C
的情况下使用Serializable
属性标记。
(虽然大多数时候我发现我不需要(
这样:
[System.Serializable]
public class C {}
从MonoBehaviour
派生类A
,并将其附加到检查器中的游戏对象。
这不是这个问题的问题,但以防万一其他人像我一样遇到它,这里有另一个提示。
确保要序列化的数组字段不是属性。无论出于何种原因,它似乎都不喜欢序列化属性。
public class A : MonoBehaviour
{
// works fine (so long as B meets the conditions mentioned by others)
public B[] SomeBees;
// does NOT work. do not do.
public B[] MoreBees { get; set; }
}
编辑
属性不能很好地序列化的原因是因为它们实际上不受支持,如此处所述。
序列化系统可以执行以下操作:
- CAN 序列化公共非静态字段(可序列化类型(
- CAN 序列化标有 SerializeField 属性的非公共非静态字段。
- 无法序列化静态字段。
- 不能序列化属性。