2016-11-02 14 views
1

配列の長さを取得できない次のコードを持っています 配列のサイズは、単位インスペクタで定義されています。エラー エラーItem' does not contain a definition for長」配列の長さを取得する

public class Item : System.Object 
{ 
    public string name; 
    public int Radius = 1; 
    public GameObject obj; 
} 

public class Gen : MonoBehaviour { 
    public Item[] Items; 
    int iNum = Items.Length; // gives me an error 
} 

ある問題は顔で私を見つめているように私は感じるが、それは当時の一つです....

+1

あなたは機能 – Programmer

+1

に 'Items.Length'を行う必要があり、このポストをupvoting誰 - 確認コードをポストに表示されるエラーメッセージと整合してください。 –

+1

@ YotamSalmonあなたは間違っています。関数やプロパティ関数で 'Items.Length'を実行する必要があります。これは私が 'public Item [] Itemsについて話している例です。 int iNum; int getiNum(){ iNum = Items.Length; return iNum; } 'これを持っている唯一の人はクリストスとテオです。クリストスは明確な答えを出していませんでした。それ以上のコメントをする前にUnityでこれを試してください。 – Programmer

答えて

0

public Item[] Items;からItemsはnullです。変数(プレースホルダ)を宣言していますが、決して新しい配列に設定することはありません。

は、問題は、あなたが別のフィールドを使用して、フィールド初期化子を宣言することであるhttps://msdn.microsoft.com/en-us/library/aa288453(v=vs.71).aspx

+0

質問は、配列のサイズがIOC/DI – Theo

+0

@Theoで注入されていることを意味すると仮定している単一性検査器で指定されていると規定されていますが、値が注入されるまで使用できません。イベントで 'Items.Length'がアクセスされた場合、これはうまくいくでしょう。 – ps2goat

+0

注射済みですか?これはUnity3D(ゲームエンジン)の質問ではなくMSF Unity-Containerですか? – Programmer

3

を参照してください。あなたはこの機能を使用するために、配列を初期化する必要があります

Items.Length 
+0

「オブジェクトを作成する」とはどういう意味ですか?これはOPが既に問題になっているコードです。 – CodeCaster

2

:あなたがオブジェクトを作成することにより、あなたが、望むことを瞬時に取得し、Itemsの長さを取得アクセスすることができ、いつでもあなたは、以下のようにしたいです。

public Item[] Items = new Item[] { *ADD OBJECTS* }; 
4

問題は、別のフィールドのプロパティからフィールドを割り当てることです。フィールドは構築時に初期化されます。

public class Item : System.Object 
{ 
    public string name; 
    public int Radius = 1; 
    public GameObject obj; 
} 

public class Gen : MonoBehaviour { 
    public Item[] Items; 
    private int iNum { get { return Items.Length; /*add null check here to be safe*/ } } 
} 
+3

これは私のコメントで述べたことを説明し、正しい解決策です。 – Programmer

2

問題は、我々はfieldを初期化する方法である:あなたが望む結果を得るために、長さのようなプロパティやメソッドの中からアクセスする必要があります。 MSDNから

引用:

インスタンスフィールドは、他のインスタンスフィールド法外部 を初期化するために使用することができません。 メソッド以外の変数を初期化する場合は、クラス コンストラクタ内で初期化を実行することを検討してください。これについて行くには

一つの方法は次のとおりです。

public class Gen : MonoBehaviour 
{ 
    public Item[] Items { get; set; } = new Item[] { }; 
    int iNum = -1; 

    //Awake is called once by Unity since Gen inherits from MonoBehaviour 
    public void Awake() 
    { 
     iNum = Items.Length; 
    } 
} 
+1

私はあなたがエラーメッセージをどのように置くのが好きです。ここではほとんどの人はこれがnullエラーだと思うが、OPはこれがエディタから初期化/設定されていると言っているので、彼らはその部分を逃したと思う。このコードの1つの問題は、 'MonoBehaviour'を継承するスクリプトでコンストラクタを使用しないことをお勧めします。ここで説明するのは長いです。 – Programmer

+0

@Programmerは、これにどのようにアプローチすべきかについて非常に貴重な入力と正しい方法を提供しています。あなたがOPへの直接的な解決を提案し、彼/彼女が「建設」段階を理解するなら、それは素晴らしいことでした。本当にあなたの編集と提案をこの質問に感謝します。 –

+1

物事をより明確にするために - _ ** Awake()vsコンストラクタ**:MonoBehaviourから派生したクラスで作業する場合、Awake()を使用してください。_ [参考](http://answers.unity3d.com/answers /513464/view.html);別の[参考文献](http://answers.unity3d.com/answers/862312/view.html) - _ **アウェイク・アンド・スタート**、**アプリケーションが再生を開始したとき、再生モードでインスタンス化されます。したがって、シリアル化プロセスからシーンに漏洩することを防ぐため、コンストラクタは避けてください。 –

0

あなたはアイテムの配列変数に配列を与える必要があります。あなたの唯一の変数を定義するItemの配列を保持するが実際には何も保持しないItem。

また、クラス変数の宣言でItems.Lengthを呼び出すことはできません。プログラマが言っているように、それはメソッドまたはプロパティで行う必要があります。それはランタイムコードなので。だからあなたのゲンクラス最低限は次のようになります。

public class Gen : MonoBehaviour 
{ 
    public Item[] Items = new Item[] { }; // Now Items has an array 
    int iNum; 

    void Awake() 
    { 
     iNum = Items.Length; // iNum will in this case will be zero, because the array is empty. 
    } 
} 
関連する問題