読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

エディター上で選択しているオブジェクトを取得したり、任意のオブジェクトを選択したり【Unity】【エディタ拡張】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 5.5.1f1


はじめに

今回はエディターでの選択オブジェクトに関する諸々の話です。

選択しているオブジェクトの情報を取得したい、任意のオブジェクトを選択したい

そんな感じの時に役立つはずです!


Selection

選択オブジェクトにアクセスする時にはSelectionというクラスを使います。





取得

現在選択しているGameObjectはactiveGameObjectで取得出来ます。

同様にactiveTransform、activeInstanceID、activeObjectというのもあります。

//現在選択しているGameObjectを取得し、ログに表示
Debug.Log(Selection.activeGameObject);

//現在選択しているTransform, オブジェクトのInstanceID, objectを取得し、ログに表示
//Debug.Log(Selection.activeTransform);
//Debug.Log(Selection.activeInstanceID);
//Debug.Log(Selection.activeObject);

f:id:kan_kikuchi:20170212111637p:plain


なお、選択オブジェクトはHierarchy上だけでなく、Projectで選択しているものも対象になります。


f:id:kan_kikuchi:20170212111759p:plain


複数取得

先ほどの変数は単体を取得するものでしたが、複数のものを同時に取得する事も可能です。

例えば、現在選択している全てのGameObjectはgameObjectsで取得出来ます。

同様にtransforms、instanceIDs、objects、assetGUIDsというのもあります。

//現在選択しているGameObjectを全て取得し、個数をログに表示
Debug.Log(Selection.gameObjects.Length);

//現在選択しているTransform, オブジェクトのInstanceID, object, GUIDを全て取得し、個数をログに表示
//Debug.Log(Selection.transforms.Length);
//Debug.Log(Selection.instanceIDs.Length);
//Debug.Log(Selection.objects.Length);
//Debug.Log(Selection.assetGUIDs.Length);

f:id:kan_kikuchi:20170212112318p:plain


選択

次に任意のオブジェクトを選択する方法ですが、取得する時に使った変数に代入するだけです。

//4_1_1という名前のGameObjectを取得
GameObject target = GameObject.Find("4_1_1");

//取得したゲームオブジェクトを選択する
Selection.activeGameObject = target;

//他の変数での選択例
//Selection.activeTransform  = target.transform;
//Selection.activeInstanceID = target.GetInstanceID();
//Selection.activeObject     = target;

f:id:kan_kikuchi:20170212113156g:plain


複数選択

複数を同時に選択する場合も同様ですが、

gameObjectsとtransformsはgetterしかないため設定はできません。

なので、objectsまたはinstanceIDsを使います

//2と4_1_1という名前のGameObjectを取得
GameObject target1 = GameObject.Find("2");
GameObject target2 = GameObject.Find("4_1_1");

//取得したオブジェクトを選択する
Selection.objects       = new GameObject[]{target1, target2};
//Selection.instanceIDs = new int[]{target1.GetInstanceID(), target2.GetInstanceID()};

f:id:kan_kikuchi:20170212113718g:plain


任意のオブジェクトを選択しているか

任意のオブジェクトを選択しているかを判定する時はSelection.Containsを使います。

なお、Containsの引数はObjectまたはinstanceID(int)です。

//2という名前のGameObjectを取得
GameObject target = GameObject.Find("2");

//選択中のオブジェクトに対象が含まれているかを判定
Debug.Log(Selection.Contains(target));
//Debug.Log(Selection.Contains(target.GetInstanceID()));

f:id:kan_kikuchi:20170215150524p:plain


検索

選択されているオブジェクトから特定の条件のものだけを検索する場合は、

Selection.GetFilteredや、Selection.GetTransformsを使います。


なお、GetFilteredは検索するTypeを任意で指定出来るのに対し、

GetTransformsはTransformだけを検索します。

//選択中のオブジェクトから一番上のものだけ取得
object[] topLevelObjects = Selection.GetFiltered(typeof(GameObject), SelectionMode.TopLevel);

//GetTransformsで取得する場合
//Transform[] topLevelObjects = Selection.GetTransforms(SelectionMode.TopLevel);

//取得したobjectをログで表示
foreach (object topLevelObject in topLevelObjects) {
  Debug.Log(topLevelObject);
}

f:id:kan_kikuchi:20170215151633p:plain


上記の例の通り、第二引数のSelectionModeで条件を設定します。

SelectionModeの種類は下記の通り。

SelectionMode.Unfiltered   //選択されたすべて
SelectionMode.TopLevel     //一番上のもの
SelectionMode.Deep         //選択したものと、子もすべて(子を選択していなくても)
SelectionMode.ExcludePrefab//プレハブを除外したもの
SelectionMode.Editable     //変更されていないオブジェクトを除外したもの
SelectionMode.Assets       //アセットとしてのProjectウィンドウに存在するオブジェクトのみ
SelectionMode.DeepAssets   //選択したものにフォルダーがあればその中身も全て(フォルダーの中身を選択していなくても)

//複数指定する時は | で区切る
SelectionMode.TopLevel | SelectionMode.ExcludePrefab



選択されている項目が変更された時

選択されている項目が変更された事を知るにはSelection.selectionChangedを使います。

このselectionChangedにデリゲートを登録しておけば、

選択されている項目が変わる度に実行されるようになります。

//メソッドを登録
Selection.selectionChanged += OnChangedSelection;
//選択しているものが変更された
private static void OnChangedSelection(){
		
  if(Selection.activeGameObject == null){
    Debug.Log("GameObjectを選択していません");
   }
  else{
    Debug.Log(Selection.activeGameObject.name + "を選択しました");
  }

}

f:id:kan_kikuchi:20170215153439g:plain