2017-01-03 13 views
0

私はタイルのテクスチャを変更することができるエディタスクリプトを持っています(私はゲームボードを作っています)。これは、さまざまな "タイルタイプ"を持つドロップダウンメニューを作成することによって動作し、メニューから新しいタイルタイプを選択すると、テクスチャが適切なタイプに変更されます。EditorGUILayout.EnumPopupカスタムエディタの値をリセットする

[CustomEditor(typeof(Tile))] 
public class TileEditor : Editor { 

    enum Type { 
     Blank, 
     Portal 
    } 

    // Represents the type of tile this is 
    Type type; 

    public override void OnInspectorGUI() { 
     Tile tile = (Tile)target; 

     // Create a dropdown list of tile types 
     type = (Type)EditorGUILayout.EnumPopup ("Type", type); 

     switch (type) { 
     case Type.Blank: 
      tile.GetComponent<Renderer>().material = Resources.Load ("Materials/Blank Tile", typeof(Material)) as Material; 
      break; 
     case Type.Portal: 
      tile.GetComponent<Renderer>().material = Resources.Load("Materials/Portal Tile", typeof(Material)) as Material; 
      break; 
     } 
    } 
} 

私はそれだけで一瞬のテクスチャを変更しますドロップダウンからポータルを選択したとき、私は、予想通り、ドロップダウンメニューは動作しますが、私は材料を設定する行を削除しますが、これらの行に含まれている場合、テクスチャとメニューの両方がenum(空白)の最初の項目に戻ります。

ここでは何が起こっているのですか。どのように選択を持続させるのですか?

編集

私は少し問題を絞り込むました。ポータルタイプを選択すると、Type.Portalのケースが実行されますが、すぐにtypeType.Blankに変更され、Type.Blankのケースが実行されます。だから、私のtype変数がOnInspectorGUI()の呼び出しの間で変わっているようです。

それはすぐに最初の列挙にリセットされ、あなたがシーンを保存し、それをロードするときに、ゲームオブジェクトTileスクリプトが接続されている選択したときに、それはまた、最初の列挙にリセットされます:

+0

Tileスクリプトを投稿してみませんか? – Programmer

+0

@Programmer現時点では空白です。ちょうど空のクラス。 – anthropomorphic

+0

あなたの「ポータルタイル」はどのディレクトリに置かれていますか? – Programmer

答えて

1

はちょうど2つの問題があります。

ソリューション1

Type typeは、静的ください。 Type type;static Type type;に変更するだけです。 これは上記の問題を解決するはずです。

しかし、プロジェクトを保存して再ロードすると、列挙型は保存されません。インデックス0(Type.Blank)にリセットされます。

ソリューション2

私はほとんどエディタスクリプト上で動作していないが、私の理解に、type変数はTileスクリプトの代わりに、TileEditorスクリプト内で宣言する必要があります。また、タイプenumの名前を変更する必要があります。 Typeは、System名前空間のC#標準APIの一部です。あなたの将来を混乱させないように、それをTileTypeのような名前に変更してください。

Tileスクリプトで宣言すると、すべての問題が解決されます。

タイルスクリプト:

public class Tile : MonoBehaviour 
{ 
    public TileType type; 

    // Use this for initialization 
    void Start() 
    { 

    } 

    // Update is called once per frame 
    void Update() 
    { 

    } 
} 

TileEditorスクリプト:

[CustomEditor(typeof(Tile))] 
public class TileEditor : Editor 
{ 
    public override void OnInspectorGUI() 
    { 
     Tile tile = (Tile)target; 

     // Create a dropdown list of tile types 
     tile.type = (TileType)EditorGUILayout.EnumPopup("TileType", tile.type); 

     Debug.Log("OnInspectorGUI"); 

     switch (tile.type) 
     { 
      case TileType.Blank: 
       tile.GetComponent<Renderer>().material = Resources.Load("Materials/Blank Tile", typeof(Material)) as Material; 
       Debug.Log("Blank"); 
       break; 
      case TileType.Portal: 
       tile.GetComponent<Renderer>().material = Resources.Load("Materials/Portal Tile", typeof(Material)) as Material; 
       Debug.Log("Portal"); 
       break; 
     } 
    } 
} 

public enum TileType 
{ 
    Blank, 
    Portal 
} 

ます。また、静的変数に格納しいったん材料をロードするクラスを追加することでこれを改善することができます。これにより、ドロップダウンが変更されるたびにロードする必要がなくなります。 カスタムインスペクタhereについて詳しく知ることができます。

+0

ああ私のゴシック。どのように私はそれを逃したことができますか?私は、タイルの代わりにエディタにタイルタイプを保存していました。それは私のことわざだった。しかし、私はあなたの助けなしにそれを理解したとは思わない、ありがとうございました。 – anthropomorphic

+0

以前にカスタムインスペクタを作っていないのであれば、それはダムではありません。私はそれが[this](https://unity3d.com/learn/tutorials/topics/interface-essentials/building-custom-inspector)を見た後に確認された問題だと思った。あなたは歓迎して幸せなコーディングです! – Programmer

関連する問題