2017-03-18 9 views
0

私はgenDicTableとStartGameという2つのクラスを持っています。私は、StartGameのgenDicTableから変数を参照したいが、NULLを返す。別のクラスの変数を参照するとNULLが返されます

genDicTable.cs

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

public class genDicTable : MonoBehaviour 
{ 
    public TextAsset file; 
    public double masterCount; 

    private void Start() 
    { 
     Load(file); 

     masterCount = rowList.Count; 
     Debug.Log(masterCount); // <-- This properly prints out the value of masterCount  
    } 

    public class Row 
    { 
     public string id; 
     public string word; 
     public string length; 
    } 

    public List<Row> rowList = new List<Row>(); 

    public void Load(TextAsset csv) { 
     // This function assigns a value into RowList 
    } 
} 

StartGame.cs

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

public class StartGame : MonoBehaviour { 

    public genDicTable GEN;  

    private void Start() 
    { 
     Debug.Log(GEN.masterCount); // <-- This yields NULL. 
    } 
} 

だから、問題は、私はStartGame.csで変数masterCountにアクセスすると、それは誤り「とNullReferenceException得られることである:オブジェクト参照をオブジェクトのインスタンスに設定されていません。

私はここで何が欠けていますか?

+0

値がnullであると言います。この動作に問題はありません。あなたは、startgame.csのgenDictTable型の変数GENのインスタンスを作成していません。 –

+0

尖った複製を注意深く読んでください。インスタンスとそれを初期化する方法がわからない場合、ここで与えられた答えはあなたの問題を理解し、同じ理由で将来の間違いを避けるのに役立ちません – Steve

答えて

3

そのオブジェクトへの参照が必要です。

あなたのクラスは、あなたのStartGame同じオブジェクトに添付されている場合は、あなたがこれを行うことができます:あなたのクラスが別のオブジェクトに添付されている場合はpublic genDicTable GEN = GetComponent<genDicTable>();

を、その後public genDicTable GEN = GameObject.Find("YourOtherObjectName").GetComponent<genDicTable>();

EDIT

genDicTableスクリプトが存在し、参照するだけの場合:

public class StartGame : MonoBehaviour { 

    public genDicTable GEN;  

    private void Start() 
    { 
     GEN = GameObject.Find("your object's name").GetComponent<genDicTable>();` 
     Debug.Log(GEN.masterCount); // <-- This yields NULL. 
    } 
} 

genDicTableスクリプトがでなく、が存在し、そのインスタンスを新規作成したい場合は、thisの回答をチェックしてください。

+0

ありがとうございます、しかしあなたの助言は "UnityException:Find is MonoBehaviourコンストラクタ(またはインスタンスフィールド初期化子)から呼び出すことはできません。それを呼び出すにはAwakeで呼び出します。私はStartでも呼び出しましたが、変数の値は0になりますが、これは適切な値ではありません。 – Dongsan

+0

@ Dongsanは彼の答えを修正した。もう一度確認してください。関数内で 'GetComponent'を実行する必要があります。 – Programmer

+0

FCinと他のすべての顧問ありがとうございます。最後に、何が間違っているかを理解しました。問題は、2つのスクリプトが実行される順序です。参照元は参照先の前に実行されていたことが判明しました。だからこそ私が望む価値を得られなかったのです。私はgenDicTableのStart()をAwake()に変更し、問題は解決されました。すべて、私の愚痴を許してください。 – Dongsan

-1
public static double masterCount; 

は非常にどのように団結エディタの作品を覚えてすることはできませんが、あなたがアクセスできるように静的であるため、二重のニーズをgenDicTableのインスタンスを作成していないかのように見えます。

+0

私はすでに '静的'を追加しようとしましたが、運はありません。 – Dongsan

+0

genDicTableの起動メソッドはこれまで実行されていますか? –

+0

はい、genDicTableのすべてが正常に動作していて、何が得られるかがわかります。問題は他のクラスから参照する方法です... – Dongsan

-1

フィールドを初期化することはありません。この

public genDicTable GEN = new genDicTable(); 

またはコンストラクタでそれを行うにそれを変更します。

public StartGame() 
{ 
    GEN = new genDicTable(); 
} 
+0

ありがとうございますが、新しいgenDicTable()は、 "新しいキーワードを使用してMonoBehaviorを作成しようとしていますが、これは許可されていません......" – Dongsan

+0

この問題の別のチケットを開くことをお勧めします。残念ながら私は 'MonoBehaviour'を使用したことはありませんでした。 –

+0

'MonoBehaviour'を' new'キーワードで継承したスクリプトの新しいインスタンスを作成することはできません(http://stackoverflow.com/a/37399263/3785314)。 – Programmer

-1

あなたはGENに任意の値を割り当てられてやりなさい。これで問題は解決するはずです:

private void Start() 
{ 
    GEN = new genDicTable(); 
    Debug.Log(GEN.masterCount); // <-- This is no longer NULL. 
} 
+0

ありがとうございますが、新しいgenDicTable()は、「新しいキーワードを使用してMonoBehaviorを作成しようとしていますが、これは許可されていません......」と警告します。 0であり、これは適切な値ではない。 – Dongsan

+0

@東山これらを止め、[FCin's](http://stackoverflow.com/a/42875938/3785314)答えを見てください。 – Programmer

+0

さて、あなたが団結しているのを見たことはありません(したがって、MonoBehaviour)。これは、Visual Studioを使用してWinForms-Applicationを開発する場合には有効ですが、ここでは... – MrElliwood

関連する問題