初期化時にGetComponentsInChildrenする負荷が気になる人の為のエディタ拡張。
サンプルコードでは、Playerの子のRendererを全て取得している。
クラス名やコンポーネント名を一括置換すると他へ応用可能。
(大文字・小文字に注意)
用途
- Rendererが複数含まれるキャラクターの被ダメージ点滅。
- Colliderが複数含まれるキャラクターの当たり判定無効化。
等々。
コード
AttachComponentsEditor (エディタ拡張)
- スクリプトを新規作成、「AttachComponentsEditor」と命名。
- 以下のコードを全文貼り付け。
- 「Player」を対象にしたいクラス名に一括置換。
(大文字・小文字に注意)
(変数名の「player」は別に変えなくてもエラーにはならない) - Editorフォルダ内へ入れておく。
(無い場合は新規作成)
(入れていないとビルド時にエラーが出ます)
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(Player))]
public class AttachComponentsEditor : Editor
{
Player player;
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
if (player == null)
player = target as Player;
if (GUILayout.Button("Attach Components")) {
player.AttachComponents();
}
}
}
Player (対象のスクリプト)
- 配列を保持しておきたいオブジェクトのメインスクリプトを開く。
- 以下のコードの「変数の宣言部分~コンポーネント取得メソッド部分」を追加。
//このサンプルコードでは要らなかったので一応コメントアウトしている(使う場合は戻しておいてください)。
//using System.Collections;
//using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
//SerializeFieldを設定する or publicで宣言。
[SerializeField]
Renderer[] renderers;
//publicで宣言。
public void AttachComponents()
{
//取得部分。
renderers = GetComponentsInChildren<Renderer>();
}
}
使用方法
- 対象のオブジェクトをアクティブ化する(親も含め)。
- インスペクター -> Playerコンポーネント下部 -> 「Attach Components」をクリック。