2017-02-20 9 views
-2

プロパティがC#でどのように機能するか理解できていません。背景の最初の簡単なビット:最初の1つのレベルマネージャーに取り組んで、その目的は、それぞれのゲームのレベルと情報のリスト(レベルの説明、レベルの画像など)を格納することで、これはすべて単一のScriptableObjectに保存されます。C#プロパティ変数に問題がある(取得と設定)

私は3つのプロパティ、sceneIndex、sceneNameとLevelIDを持っているとしましょう。

sceneIndexは、私が1のインスペクタで変更できる必要があり、ビルド設定のレベルインデックスと一致する必要がある変数です。

シーン名は、ユニティのインスペクタで編集できません。常にレベルの名前にする必要があります。 (これはsceneIndexによって決まります)

レベルIDは、常にレベルリストのこのクラスのインデックスに設定する必要があります。

ここに私の現在のコードがあります - 現在、私はsceneIndexを変更すると、私のsceneNameはインスペクタで一致する名前に更新されていませんし、私のリストに新しい要素を追加するとLevelIDは更新されません。

public class LevelDataBase : ScriptableObject { 

    [System.Serializable] 
    public class LevelData { 

     [SerializeField] 
     public string p_sceneName{//the levelName 
      get{ return sceneName; } 
      set{ sceneName = SceneManager.GetSceneAt (sceneIndex).name; }// it should always be set depending on the Scene Index 
     } 
     public string sceneName;//Properties dont display in unity's inspector so i have to use secondary variable for it to be displayed. 

     public int sceneIndex;//the scene index i should be able to change and then the scene Name should Updatedepending on the value 


     [SerializeField] 
     public int p_LevelID {//the Level id Should always be the index of this class in the list. 
      get{ return LevelID; } 
      set{ LevelID = LevelList.IndexOf (this); } 
     } 
     public int LevelID; 

     public string DisplayName; 
     public Sprite Image; 
     public string Description; 
    } 

    public List<LevelData> LevelList;//this is a list containing all the levels in the game 
} 

感謝〜スコット

+2

"のdoesntの仕事は、" - 適切な記述ではありません。 –

答えて

1

あなたがプロパティの作業方法を誤解しているようです。 set{ sceneName = SceneManager.GetSceneAt (sceneIndex).name; }は、動作するべき方法(ある種のプロパティベースの開発)を記述しているかのように使用します。

プロパティは、フィールドをカプセル化するために使用されます。したがって、彼らは一種の "get"と "set"機能を提供します。設定された機能は、MyProperty = valueを使用する場合にのみ呼び出されます。 getプロパティはvalue = MyPropertyによってトリガーされます。

あなたのセットはgetで名前を変更する必要があり、以前のgetを削除する必要があるように感じます。

public string SceneName{//the levelName 
      get{ return SceneManager.GetSceneAt (sceneIndex).name; }// it should always be set depending on the Scene Index 
     } 

そして、あなたのコードでは、常に(今はおそらく役に立たないです)パブリック文字列sceneNameではなくSceneNameを使用してこのデータにアクセスする必要があります。

編集:セッターを使用して:

public int SceneIndex{ 
    set 
    { 
     sceneIndex = value; 
     sceneName= SceneManager.GetSceneAt (sceneIndex).name; }// it should always be set depending on the Scene Index 
    } 
} 
+0

こんにちはブルーノお返事ありがとうございます。ええ、そうしたことを説明してくれて、プロパティーの仕組みを誤解しました。しかし、 "public string sceneName"変数を使用しなければならない理由は、統一者のインスペクタに正しく表示されないためです。つまり、2番目の変数を使用して、プロパティを変更するときに変数を変更するのはなぜですか。 – WeirderChimp53

+0

私は統一するのに慣れていませんが、プロパティは無視されています。とにかく、あなたができることは、セッターを使ってsceneIndexを変更して、sceneNameも更新することです。私はこれを反映するために私の答えを更新しました。 –

+0

私は混乱してコードスニペットを実装しました。実行時に "SceneIndex = 1;"を呼び出すと、今は動作しますsceneIndexとsceneNameが更新されます。唯一の問題は、単一性のインスペクタでsceneIndex(変数ではなくプロパティ)を変更してもプロパティ値が変更されないため、「set」を呼び出すのではなく、sceneNameを更新しないことです。 – WeirderChimp53

関連する問題