(:3[kanのメモ帳]

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

拡張メソッドとは、全ての子オブジェクトにレイヤーとマテリアル設定を行ってみる【C#】【Unity】【拡張メソッド】


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

この記事でのバージョン
Unity 5.1.0f3 Personal

はじめに

以下のようなコードでスクリプトからLayerを変更する事が出来ます。

gameObject.layer = layerNo;


しかし、このやり方だと子オブジェクトのレイヤーは変更されません。


例えば以下のような構造になっていた時、ParentのLayerをスクリプト上で変えても

ChildやGrandsonのLayerは変わりません。


f:id:kan_kikuchi:20150622072330p:plain


なお、Hierarchyから変更する場合はウィンドウが出て、

全ての子オブジェクトのレイヤーを同時に変える事が出来ます。


f:id:kan_kikuchi:20150622072834p:plain


なので今回、スクリプト上からも簡単に

全ての子オブジェクトに同じレイヤーを設定出来る拡張メソッドを作りました。

ついでに全ての子オブジェクトに同じマテリアルを設定出来る拡張メソッドも作りました。


拡張メソッドとは

まず、拡張メソッドとは既存のクラスにメソッドを追加するというものです。



今回の場合で言えば、

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点を満たせば作る事が出来ます。

  1. クラスがstaticである事
  2. メソッドもstaticである事
  3. メソッドの最初の引数が this 拡張したいクラス 変数名である事


汎用的なメソッドを追加したい際に

継承したクラスを作らずに済むので、便利かつ楽ですね。


GameObjectExtension

さて本題のコードは以下の通りです。



自分自身のレイヤーやマテリアルを設定した後、

foreach(Transform childTransform in gameObject.transform)で、

自分の全子オブジェクトにも設定を行っています。


使い方は以下の通り、変更したレイヤー番号やマテリアルを入力するだけです。

int layerNo;
Material material;

gameObject.SetLayer (layerNo);
gameObject.SetMaterial (material);


余談ですが、以前公開した記事SettingClassCreatorを使えば、

レイヤー番号を定数で指定する事が出来るので、もっと楽になります。