【Unity/エディタ拡張】子のコンポーネントを事前に配列へ取得

初期化時にGetComponentsInChildrenする負荷が気になる人の為のエディタ拡張。

サンプルコードでは、Playerの子のRendererを全て取得している。
クラス名やコンポーネント名を一括置換すると他へ応用可能。
(大文字・小文字に注意)

用途

  • Rendererが複数含まれるキャラクターの被ダメージ点滅。
  • Colliderが複数含まれるキャラクターの当たり判定無効化。

等々。

コード

AttachComponentsEditor (エディタ拡張)

  1. スクリプトを新規作成、「AttachComponentsEditor」と命名。
  2. 以下のコードを全文貼り付け。
  3. 「Player」を対象にしたいクラス名に一括置換。
    (大文字・小文字に注意)
    (変数名の「player」は別に変えなくてもエラーにはならない)
  4. 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 (対象のスクリプト)

  1. 配列を保持しておきたいオブジェクトのメインスクリプトを開く。
  2. 以下のコードの「変数の宣言部分~コンポーネント取得メソッド部分」を追加。


//このサンプルコードでは要らなかったので一応コメントアウトしている(使う場合は戻しておいてください)。
//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>();
	}


}

使用方法

  1. 対象のオブジェクトをアクティブ化する(親も含め)。
  2. インスペクター -> Playerコンポーネント下部 -> 「Attach Components」をクリック。
【Unity】事前に配列へコンポーネントを取得するエディタ拡張の手順解説

タイトルとURLをコピーしました