1

インスペクタから TextAsset を取り ('ExampleEditor' に配置)、blendshape アニメーションを使用するためのカスタム データ インスタンスを作成するプログラムを作成したいと考えていました。

最初に、[System.Serializable] を使用しないカスタム データ クラスを作成しました。

public class Matrix {
    public int row;
    public int col;
    public double[,] mat;
}

私の戦略は、TextAsset を取得し、TextAsset から文字列を解析し、最後に Matrix インスタンスを「Example.cs」のフィールド変数に作成することでした。最初に初期化して割り当てたときに、その変数を Example インスタンスで使用できると思いました。しかし、それは機能せず、「NullReferenceException」をスローしました。

そこで、「[System.Serializable]」を使用して解決策を見つけました。それはうまくいきました。(そして、Unity3D がシリアル化方法に多次元配列を提供していないことは知っていました。)

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

[System.Serializable]
public class Matrix {
    [System.Serializable]
    public class mRow {
        public List<float> aRow = new List<float>();
    }

    [HideInInspector]
    [SerializeField]
    public int row;

    [HideInInspector]
    [SerializeField]
    public int col;

    //[HideInInspector]
    [SerializeField]
    public List<mRow> mat = new List<mRow>();
}

最後に、解決策を知っていますが、なぜこの問題が発生したのかわかりません。それはGCに関連していますか?

4

1 に答える 1

9

あなたの質問はあまり明確ではありませんが、あなたが理解していないことを知っていると思います。

私の戦略は、TextAsset を取得し、TextAsset から文字列を解析し、最後に Matrix インスタンスを「Example.cs」のフィールド変数に作成することでした。

あなたはそれをどのように行ったかを説明しませんでした (おそらく、カスタム インスペクターから解析関数を呼び出しますか?)。ただし、エディターからフィールドをどのように初期化できたとしても、フィールドがシリアライズ可能でない場合、エディターから再生モードに切り替えると null になります

これは、再生モードに入るときに、エンジンの相対クラスを設定するUnity3Dすべてのクラスをシリアル化するために発生します。フィールドが、Unity がシリアル化できるタイプの public フィールドでない場合 (または、常にserialize できるタイプの でマークされたプライベート フィールドでさえ)、それをシリアル化しません。C#C++SerializeFieldAttributeUnityUnity3D

そのため、再生モードに切り替えると、参照は null になります。

つまり、エディターから初期化するすべてのフィールドは、再生モードで使用するためにシリアライズ可能でなければなりません。

[SerializeField]
public List<mRow> mat = new List<mRow>();

上記のコードはあまり意味がありません。インスペクターからシリアル化可能なフィールドを初期化する場合は、コードで初期化しないでください。そうしないと、最終的に参照が失われる可能性があります。このようなエラーの例:

[SerializeField]
private List<int> aList;

public void Start()
{
  aList = new List<int>();
} 

上記のコードは問題を引き起こします。インスペクターから初期化aListした場合、正しくシリアル化されますが、再生モードに切り替えるとStartコールバックが呼び出され、aList再初期化され、空のリストへの参照になります。

これは、オブジェクトのシリアル化を処理する方法の詳細を説明する素晴らしいブログ投稿です。Unity3Dそれを読んで!

于 2013-07-27T16:07:07.567 に答える