2016-04-28 10 views
0

ユーザーがどの「フォルダ」を入れるかを選択できる拡張子ファイルのリストを持つカスタムエディタを作成しようとしています。ポップアップの選択されたインデックス(移動する必要がある拡張の数に基づいてそれらの配列を持っています)は変更されず、最後の位置にとどまります。EditorGUILayoutポップアップが選択項目の変更をドロップダウンした後に変更を受け付けない

enter image description here

public class ExtensionWindow : EditorWindow 
{ 
    ExtensionBank extBank; 

    string[] exts; 
    public bool[] extToggles; 

    public static List<string> extensions; 
    public static List<string> categories; 

    public static Vector2 scrollPosition; 

    [MenuItem("Build Master's Dream/Organize Files")] 
    static void Organize() 
    { 
     ExtensionWindow myWindow = (ExtensionWindow)EditorWindow.GetWindow(typeof(ExtensionWindow), true, "Extensions"); 
     myWindow.minSize = new Vector2(300.0f, 300.0f); 
     myWindow.maxSize = new Vector2(300.0f, 300.0f); 
    } 

    void Awake() 
    { 
     //Get all Category names and store them in a List<> 
     LoadFolderNames(); 
     LoadFolders(); 

     extBank = new ExtensionBank(); 

     //Populate the bank of Extensions from the .txt file 
     bool success; 
     success = extBank.PopulateList(); 

     exts = new string[extBank.GetNumOfExtensions]; 

     if (success) 
     { 
      for (int i = 0; i < extBank.GetNumOfExtensions; i++) 
       string shortExtensions = extBank.GetExtensions(i); 
     } 
    } 

    void OnGUI() 
    { 
     //extToggles = new bool[extBank.GetNumOfExtensions]; 

     int[] index = new int[extBank.GetNumOfExtensions]; 
     int selectedIndex = 0; 

     GUILayout.BeginArea(new Rect(0, 0, 300, 300)); 
     EditorGUILayout.BeginVertical(); 
     scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); 

     for (int i = 0; i < index.Length; i++) 
     { 
      index[i] = EditorGUILayout.Popup(extBank.GetExtensions(i), index[i], categories.ToArray(), GUILayout.Width(275)); 
      EditorGUILayout.Space(); 
     } 
     if (GUILayout.Button("Make Your Dream Come True", EditorStyles.miniButtonLeft)) 
     { 
      string[] shortCategories = categories.ToArray(); 

      AssetDatabase.Refresh(); 
     } 
     EditorGUILayout.EndScrollView(); 
     EditorGUILayout.EndVertical(); 
     GUILayout.EndArea(); 
    } 

    void LoadFolders() 
    { 
     foreach (string cat in categories) 
     { 
      string projectPath = Application.dataPath + "/"; 
      if (cat != "Select Category") ; 
      { 
       Directory.CreateDirectory(projectPath + cat); 
      } 
     } 
     AssetDatabase.Refresh(); 
    } 

    void BeginMoveOperation(string ext, string cat) 
    { 
     Debug.Log("Data path is: " + Application.dataPath.ToString()); 

     string localPath = Application.dataPath; 

     DirectoryInfo dir = new DirectoryInfo(localPath); 
     FileInfo[] info = dir.GetFiles("*.*"); 
     foreach (FileInfo f in info) 
     { 
      Debug.Log("Name is: " + f.Name); 
      Debug.Log("Extension is: " + f.Extension); 
      MoveAssetsIntoFolders(f.Name, f.Extension, f.FullName); 
     } 
    } 

    static void MoveAssetsIntoFolders(string fileName, string extension, string oldPath) 
    { 

    } 

    void LoadFolderNames() 
    { 
     var path = "Assets/Scripts/Editor/Extensions.txt"; 

     if (File.Exists(path)) 
     { 
      try 
      { 
       var fileContent = File.ReadAllLines(path); 
       categories = new List<string>(); 
       foreach (var line in fileContent) 
       { 
        if (line != "") 
        { 
         if ((line.Substring(0, 1) != "" || line.Substring(0, 1) != null) && line.Substring(0, 1) != ".") 
         { 
          categories.Add(line); 
         } 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Debug.Log(ex); 
      } 
     } 
    } 
    void OrganizeScripts()     
    { 
     Assembly _assembly = Assembly.Load("Assembly-CSharp"); 

     foreach (Type type in _assembly.GetTypes()) 
     { 
      if (type.IsClass) 
      { 
       if (type.BaseType.FullName.Contains("MonoBehaviour"))   //Standard Unity Scripts 
       { 

       } 
       else if (type.BaseType.FullName.Contains("Editor"))    //Unity Editor Files 
       { 

       } 
      else               //All others, likely .js scripts 
       { 

Screen grab of Code errors

答えて

0

ここ理由はyou`reがEditorGUILayout.Popup方法の 'selectedIndexの' パラメータとしてゼロを通過することがあるように思えます。 このパラメータには、現在ストレージから選択されているインデックスが含まれている必要があります。そのような :

index = EditorGUILayout.Popup("Label", index, displayedOptions); 

アイデア「selectedIndexの」パラメータとしてメソッドの戻り値を取得するために使用you`re同じ変数を渡すことです。

private List<CharacterState> selected; 

    void OnGUI() 
    { 
     if (selected == null) 
     { 
      selected = new List<CharacterState>(); 
      foreach (var value in Enum.GetValues(typeof(CharacterState))) 
      { 
       selected.Add((CharacterState) value); 
      } 
     } 

     int[] index = selected.Select(x=>(int)x).ToArray(); 

     GUILayout.BeginArea(new Rect(0, 0, 300, 300)); 
     EditorGUILayout.BeginVertical(); 
     scrollPosition = 
     EditorGUILayout.BeginScrollView(scrollPosition); 

     var vals = Enum.GetNames(typeof (CharacterState)); 

     for (int i = 0; i < index.Length; i++) 
     { 
      var v = EditorGUILayout.Popup(((CharacterState)index[i]).ToString(), index[i], vals, GUILayout.Width(275)); 
      index[i] = v; 
      EditorGUILayout.Space(); 
     } 

     var j = 0; 
     foreach (var i in index) 
      selected[j++] = (CharacterState)i; 

     EditorGUILayout.EndScrollView(); 
     EditorGUILayout.EndVertical(); 
     GUILayout.EndArea(); 
    } 

あなたが見ることができるように、私はあなたがそうであるように[] intにすべて列挙値をキャストするが、Popupメソッド呼び出しの後、私は「選択に値を格納するために、インデックスを持つ配列の別の反復を行いますリスト。

+0

私もそれを試しましたが、同じエラー –

+0

あなたはあなたがそうしようとしているところでコードを投稿できますか? –

+0

ここにクラス全体があります。リンクされているすべてのアイテムは、私も渡すことができます。 –

0

この問題は、メソッドが呼び出されるたびにインデックス配列を作成しているように見えるため、index [i]に何を割り当てても、次にフレームが呼び出されたときにallが0にリセットされます。だから私は、あなたのextBankに値を割り当てるか、またはインデックス変数をローカル変数ではなくメンバ変数にします。

int[] index = new int[0]; 
void OnGUI() 
{ 
    //extToggles = new bool[extBank.GetNumOfExtensions]; 
    if(index.Length != extBank.GetNumOfExtensions) 
     System.Array.ReSize(ref index, extBank.GetNumOfExtensions); 
    int selectedIndex = 0; 

    GUILayout.BeginArea(new Rect(0, 0, 300, 300)); 
    EditorGUILayout.BeginVertical(); 
    scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); 

    for (int i = 0; i < index.Length; i++) 
    { 
     index[i] = EditorGUILayout.Popup(extBank.GetExtensions(i), index[i], categories.ToArray(), GUILayout.Width(275)); 
     EditorGUILayout.Space(); 
    } 
    //rest of your code 
} 
関連する問題