この記事でのバージョン
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);
なお、選択オブジェクトはHierarchy上だけでなく、Projectで選択しているものも対象になります。
複数取得
先ほどの変数は単体を取得するものでしたが、複数のものを同時に取得する事も可能です。
例えば、現在選択している全ての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);
選択
次に任意のオブジェクトを選択する方法ですが、取得する時に使った変数に代入するだけです。
//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;
複数選択
複数を同時に選択する場合も同様ですが、
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()};
任意のオブジェクトを選択しているか
任意のオブジェクトを選択しているかを判定する時はSelection.Containsを使います。
なお、Containsの引数はObjectまたはinstanceID(int)です。
//2という名前のGameObjectを取得 GameObject target = GameObject.Find("2"); //選択中のオブジェクトに対象が含まれているかを判定 Debug.Log(Selection.Contains(target)); //Debug.Log(Selection.Contains(target.GetInstanceID()));
検索
選択されているオブジェクトから特定の条件のものだけを検索する場合は、
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); }
上記の例の通り、第二引数の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 + "を選択しました"); } }