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

时间:2019-09-24 03:56:39

标签: c# unity3d serialization

我刚刚接触序列化,并且有一个疑问为什么要使用公共数组  自定义类的名称不会显示在检查器上。

假设我有如下代码

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

据我所知,我不需要同时执行a和b的[Serializefield]或[Serializable]公共变量来显示检查器(因为这两个都是公共的,必须自动显示在inspector(?)上)。

有人可以向我解释为什么“ 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建议以下答案。两者都不会显示在检查器上。

3 个答案:

答案 0 :(得分:0)

Serialization在您当前的情况下是关于使对象对单位检查员“可读”。

当您应用Serializable属性时,表示您正在说这种类型的对象可以被单位检查员“读取”。

应用Serializefield属性时,表示您正在使检查人员可以读取当前对象
(提供了可以序列化的功能,并且它尚未首先进行序列化)

回到您的问题,您应该在案例中为C标记上一个Serializable属性。
(尽管大多数时候我发现我不需要)

像这样:

[System.Serializable]
public class C {}

答案 1 :(得分:0)

A派生您的类MonoBehaviour并将其附加到检查器中的GameObject。

答案 2 :(得分:0)

// 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;

}