Вопрос о классе открытого массива Unity Serialization - PullRequest
0 голосов
/ 24 сентября 2019

Я просто новичок в сериализации, и у меня возник вопрос, почему открытый массив пользовательского класса не отображается в инспекторе.

скажем, у меня есть код вроде follow

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 для отображения инспектора (поскольку оба общедоступны, они должны автоматически отображатьсяна инспектора (?)).

Может кто-нибудь объяснить мне, почему на инспекторе не появляется «с»?Или я что-то не понимаю?Любое объяснение будет оценено.


Вот классы 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 голосов
/ 24 сентября 2019

Получите ваш класс A из MonoBehaviour и присоедините его к GameObject в инспекторе.

0 голосов
/ 24 сентября 2019
// 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;

}
0 голосов
/ 24 сентября 2019

Сериализация в вашем текущем случае означает, что объект должен быть «читабельным» для инспектора единства.

Когда вы применяете атрибут Serializable, это означает, что вы говорите, что Объекты этого типа могут быть «прочитаны» с помощью инспектора единицы.

Когда вы применяете атрибут Serializefield, это означает, что вы делаете текущий объект 'читабельным'инспектором.
(при условии, что он может быть сериализован, и он не был сериализован в первую очередь)

Возвращаясь к вашей проблеме, вы должны пометить C знаком SerializableАтрибут в вашем случае.
(Хотя большую часть времени я нахожу, что мне это не нужно)

Примерно так:

[System.Serializable]
public class C {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...