LotosLabo

プログラミング技術とか気になった情報を載せていきます

UnityのAssetsフォルダ内の選択されているフォルダパスを取得

はじめに

UnityでEditor拡張する際に必要になるかと思いまして、
コードを書いてみました。参考にしていただければと思います。

説明


f:id:lo25131:20150927195544p:plain

例:Scenesまでのパスを取得したい!

パス -> Assets/Scenes


サンプルコード


~パス表示までの流れ~

(1)Assets内にあるフォルダを左クリックで選択する
(2)選択されているフォルダを右クリックでGetFilePathというアイテムを選択
(3)Consoleにそのファイルのパスが表示される


以下コード

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

public class EditorToolsSample: EditorWindow
{
 // 右クリックMenuに追加.
 [MenuItem("Assets/GetFilePath")]
 private static void GetFilePath()
 {
   GetSelectFile();
 }

 /// <summary>
 /// 選択中のファイルパス取得.
 /// </summary>
 private static void GetSelectFile()
 {
   // ファイルが選択されている時.
   if(Selection.assetGUIDs != null && Selection.assetGUIDs.Length > 0)
   {
     // ファイルリスト作成.
     List<string> fileList = new List<string>();
     
     // 選択されているパスの取得.
     foreach(var files in Selection.assetGUIDs)
     {
       var path = AssetDatabase.GUIDToAssetPath(files);
       fileList.Add(path);
     }

     // 出力.
    foreach(var list in fileList)
     {
       Debug.Log(list);
     }
   }
 }
}


【実行結果】

[メニューに追加]



[コンソールの出力]
f:id:lo25131:20150927190453j:plain
出力されたパスはAssetsからのパスとなります。



[複数選択の出力]
f:id:lo25131:20150927190521j:plain
複数選択も可能です。


解説

MenuItem~ でメニューにアイテムを追加し、これをクリックすることで
パス取得のメソッドが実行されます。

選択されている情報はSelection.assetGUIDsで取ることができますので、
それをリストに全ていれて出力。



取得したパスへの追加処理

以下は余談ですが、取得したパスへ行う処理をいくつか追加しました。


●Assetsの部分を消す処理

「Assets/Scenes」 というパスが取得できても、「Assets/」の部分がいらない!
という時がありますよね。そういう時に使用します。
先ほど取得したfileListを引数として渡します。

private static void GetSelectFile()
{
 List<string> childPath = GetChildPath(fileList);
 foreach(var list in childPath)
 {
   Debug.Log(list);
 }
}

/// <summary>
/// Assetsを除いたパスを取得.
/// </summary>
/// <param name="path">リスト型のパス.</param>
/// <returns>「Assets」部分が取り除かれたリスト型のパス.</returns>
private static List<string> GetChilePath(List<string> path)
{
 List<string> childPath = new List<string>();
 for(int index = 0; index < path.Count; ++index)
 {
   string temp = path[index].Remove(0, path[index].IndexOf("/") + 1);
   childPath.Add(temp);
 }
 return childPath;
}


出力結果:
f:id:lo25131:20150927193256j:plain




●パスを繋げる処理

パスを繋げたいという時があるかもしれません。そういう時に使用します。

private static void GetSelectFile()
{
 string joinPath = GetChildPath(fileList);
 Debug.Log(joinPath);
}

/// <summary>
/// パスを繋げる.
/// </summary>
/// <param name="path">リスト型のパス.</param>
/// <returns>繋げられたパス.</returns>
private static string GetJoinPath(List<string> path)
{
 string joinPath = string.Join(" ", path.ToArray());
 return joinPath;
}

出力結果:
f:id:lo25131:20150927193251j:plain


まとめ

Editor拡張をするにあたって、選択したファイルパスを取得して何かをするという時があるかもしれません。
今回はフルパスは取得していませんが、実際に外部プロセスを起動して何か作業したいという場合には、
プロセスのオプションとして、以下を設定してあげればいいと思います。

例: process.StartInfo.WorkingDirectory = Application.dataPath;

そうすればAssetsまでのフルパスとして取得でき、その場所からの作業を行うことができます。