Почему объект становиться null?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Почему объект становиться null?

Сообщение ArtemSekretov 05 окт 2013, 21:11

У меня есть модель персонажа со скелетом, которую с положил в prefab. Так же я написал скрипт который содержит переменную Dictionary<string, Transform>, где содержаться имя кости - Transform кости. Этот скрип еще содержит функцию, которые получает все кости с модели и заносит их в словарь. Скрип прикреплен к prefabу с моделью, как компонент. Я достаю это prefab на сцены с помощью Instatiate и вызываю функцию заполнения словаря костей и сразу вывожу его Transform в словаре нормальный т.е. не null.
Но при повторном обращении к этому словарю из другой функции в скрипте, Transform вдруг становиться null. Почему так происходит и как это можно исправить?
ArtemSekretov
UNец
 
Сообщения: 7
Зарегистрирован: 29 апр 2013, 13:56

Re: Почему объект становиться null?

Сообщение seaman 05 окт 2013, 21:29

Скрипт в студию.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Почему объект становиться null?

Сообщение ArtemSekretov 05 окт 2013, 21:53

Класс который прикреплен к prefab.
Синтаксис:
Используется csharp
public class Data : MonoBehaviour {
    public Dictionary<string, BoneData> boneList = new Dictionary<string, BoneData>();

    public void ProcessBones()
    {
        GameObject go = gameObject.GetComponent<PlayerCharacter>().characterMesh;
       
        SkinnedMeshRenderer smr = go.GetComponent<SkinnedMeshRenderer>();
        if (smr != null)
        {
            Transform rootBone = smr.rootBone;

            Data.BoneData tempRootBone = new Data.BoneData();

            tempRootBone.boneTransform = rootBone;

            tempRootBone.actualBonePosition = rootBone.localPosition;
            tempRootBone.actualBoneScale = rootBone.localScale;
            tempRootBone.originalBonePosition = rootBone.localPosition;
            tempRootBone.originalBoneRotation = rootBone.localRotation;

            boneList.Add(rootBone.name, tempRootBone);

            Transform[] bones = rootBone.GetComponentsInChildren<Transform>();

            for (int i = 0; i < bones.Length; i++)
            {
                Data.BoneData tempBone = new Data.BoneData();

                tempBone.boneTransform = bones[i];

                tempBone.actualBonePosition = bones[i].localPosition;
                tempBone.actualBoneScale = bones[i].localScale;
                tempBone.originalBonePosition = bones[i].localPosition;
                tempBone.originalBoneRotation = bones[i].localRotation;

                if (!boneList.ContainsKey(bones[i].name))
                    boneList.Add(bones[i].name, tempBone);
            }
        }
        else
            Debug.LogError("На модели отсутствует модификатор Skin");
    }

}
 


Класс который достает объект на сцену

Синтаксис:
Используется csharp
public class CharacterCustomization: MonoBehaviour {

    private Data data;

        void Awake () {

        InstatiateCharacterModel();

        data = gameObject.GetComponentInChildren<Data>();

        data.ProcessBones();
// тут все нормально
            foreach (KeyValuePair<string, BoneData> kvp in data.boneList)
            {
                Debug.Log(string.Format("Key = {0}, Value = {1}",
                    kvp.Key, kvp.Value.boneTransform.name));
            }

            UpdateBones();

        }

    public void UpdateBones()
    {
        Debug.Log("bones count = " + data.boneList.Count);

        data.boneList["breast_L"].boneTransform.localScale = new Vector3(
        Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 1.90f, 0.8f, 1.25f),
        Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 1.90f, 0.8f, 1.4f),
        Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 2.00f, 1.0f, 1.6f));
        data.boneList["breast_R"].boneTransform.localScale = new Vector3(
        Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 1.90f, 0.8f, 1.25f),
        Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 1.90f, 0.8f, 1.4f),
        Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 2.00f, 1.0f, 1.6f));


        ............
    }


}
 


При вызове функции UpdateBones повторно из другого скрипта или даже из этого data.boneList["имя кости"].boneTransform становиться равно null.
ArtemSekretov
UNец
 
Сообщения: 7
Зарегистрирован: 29 апр 2013, 13:56

Re: Почему объект становиться null?

Сообщение seaman 05 окт 2013, 22:08

GC собирает. Не понял отчего. Посоветую вместо public Dictionary<string, BoneData> boneList использовать public Dictionary<string, Transform> boneList, запоминать туда саму кость: boneList.Add(rootBone.name, rootBone); и потом при нужде из нее брать то, что надо:
data.boneList["breast_L"].localScale = new Vector3(
Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 1.90f, 0.8f, 1.25f),
Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 1.90f, 0.8f, 1.4f),
Mathf.Clamp(1 + (characterParameters.breast - 0.5f) * 2.00f, 1.0f, 1.6f));
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 29