この記事でのバージョン
Unity 5.1.0f3 Personal
はじめに
以下のようなコードでスクリプトからLayerを変更する事が出来ます。
gameObject.layer = layerNo;
しかし、このやり方だと子オブジェクトのレイヤーは変更されません。
例えば以下のような構造になっていた時、ParentのLayerをスクリプト上で変えても
ChildやGrandsonのLayerは変わりません。
なお、Hierarchyから変更する場合はウィンドウが出て、
全ての子オブジェクトのレイヤーを同時に変える事が出来ます。
なので今回、スクリプト上からも簡単に
全ての子オブジェクトに同じレイヤーを設定出来る拡張メソッドを作りました。
ついでに全ての子オブジェクトに同じマテリアルを設定出来る拡張メソッドも作りました。
拡張メソッドとは
まず、拡張メソッドとは既存のクラスにメソッドを追加するというものです。
今回の場合で言えば、
GameObjectに全ての子オブジェクトに同じレイヤーを設定するメソッドを追加する
という事になります。
例えば以下のようなスクリプトを作成するだけで、
全GameObjectがLogというメソッドが使えるようになります。
using UnityEngine; using System.Collections; /// <summary> /// GameObjectの拡張クラス /// </summary> public static class GameObjectExtension{ //これが拡張メソッド public static void Log(this GameObject gameObject){ Debug.Log (gameObject.name); } }
//使用例
gameObject.Log();
拡張メソッドは以下の3点を満たせば作る事が出来ます。
- クラスがstaticである事
- メソッドもstaticである事
- メソッドの最初の引数が this 拡張したいクラス 変数名である事
汎用的なメソッドを追加したい際に
継承したクラスを作らずに済むので、便利かつ楽ですね。
GameObjectExtension
さて本題のコードは以下の通りです。
自分自身のレイヤーやマテリアルを設定した後、
foreach(Transform childTransform in gameObject.transform)で、
自分の全子オブジェクトにも設定を行っています。
使い方は以下の通り、変更したレイヤー番号やマテリアルを入力するだけです。
int layerNo;
Material material;
gameObject.SetLayer (layerNo);
gameObject.SetMaterial (material);
余談ですが、以前公開した記事のSettingClassCreatorを使えば、
レイヤー番号を定数で指定する事が出来るので、もっと楽になります。