有关 Unity 序列化公共数组类的问题



我只是刚开始序列化,并且有一个问题,为什么公共数组 的自定义类未显示在检查器上。

假设我有如下代码

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 属性的非公共非静态字段。
  • 无法序列化静态字段。
  • 不能序列化属性。

最新更新