2016-05-18 3 views
0

UnityのUnityEditorクラスのOnInspectorGUIメソッドを使用してキャッチ22の状況に陥っているようです。私は簡単に編集用のインスペクタで配列要素に名前を付けたい、現在私はドキュメントごとに、使用しています:Unity3D - カスタムインスペクタコードで配列を使用する方法は?

public float[] aBaseStats = new float[35]; 

:私のJ_Characterスクリプトで

public override void OnInspectorGUI() 
{ 
    J_Character charScript = (J_Character)target; 

    charScript.aBaseStats[0] = EditorGUILayout.FloatField("Base Health", charScript.aBaseStats[0]); 

} 

を私はそうのようなaBaseStats配列を初期化します問題は、私は私がこの私を推測している

charScript.aBaseStats[0] = EditorGUILayout.FloatField("Base Health", charScript.aBaseStats[0]); 

ラインを指している範囲エラー外のインデックスを取得、私はエディタで何かをやろう(したがってOnInspectorGUIが呼び出される)たびということですなぜなら、私の配列はゲームの開始時に初期化され、エディタコードは開発中に常に実行されているからです。

どうすればこのような状況になるのですか?

多くのありがとうございます。

答えて

4

aBaseStatsを1回だけ実行する関数で初期化する必要があります。

以下のコードは、BADある:

public float[] aBaseStats = new float[35]; 
void Start(){ 

} 

以下のコードGOODある:

public float[] aBaseStats; 
void Start(){ 
aBaseStats = new float[35]; 
} 

一度実行エディタのコールバック関数でそれを初期化します。

EDIT:

私は()OnInspectorGUI関数の前に実行されますStartコールバック関数を知りません。下のハックはうまくいくはずです。私は次のようにあなたを指すようにたいプログラマが答えに加えとして

public float[] aBaseStats; 
bool initialized = false; 
public override void OnInspectorGUI() 
{ 
    if (!initialized) 
    { 
     initialized = true; 
     aBaseStats = new float[35]; 
    } 

    J_Character charScript = (J_Character)target; 

    charScript.aBaseStats[0] = EditorGUILayout.FloatField("Base Health",aBaseStats[0]); 

} 
+0

ありがとうございました。私はStartとAwakeの両方で試してみましたが、うまくいきません - おそらくそれらの関数はエディターではなく、ゲームの開始時にのみ実行されるからです。一度実行されるエディタコールバック関数で初期化することで意味を広げることができますか?お願いします? – Absinthe

+0

@Absintheエディタのコールバック関数は数多くあり、どの関数を使用しているのかわかりません。使用しているすべてのUnityの 'OnSomething'関数をリストすると良いでしょう。一度実行すると正しいものを教えてくれます。 – Programmer

+0

@Absintheもっと簡単なことを試してみてください。 'charScript.aBaseStats [0] = 1f;'を試し、同じエラーがまだ出るかどうか確認してください。あなたがそうしたら、それをうまく初期化しなかった。 'CharScript.aBaseStats [0] = EditorGUILayout.FloatField(" Base Health "、charScript.aBaseStats [0]);' – Programmer

0

http://docs.unity3d.com/ScriptReference/ExecuteInEditMode.html

これは機能性の面で探している正確に何のようです。 (プレイモードがアクティブでなくてもメソッドを実行します)

using UnityEngine; 
using System.Collections; 

[ExecuteInEditMode] 
public class ExampleClass : MonoBehaviour { 
    public Transform target; 
    void Update() { 
     if (target) 
      transform.LookAt(target); 

    } 
} 
+0

ありがとうございました、Awakeで初期化して[ExecuteInEditMode]で開始しようとしましたが、同じエラーが発生しました – Absinthe

+0

私たちの回答を組み合わせてみましたか?初期化を追跡するために変数を設定し、まだ初期化されていない場合は更新関数を使用して値を初期化してください。それができない場合は、一致するエラーのコードサンプルを投稿できますか? – MSB

関連する問題