エディタ拡張を使うと、Unityの標準で搭載されていない機能を作ることができます。
実際に使ってみて便利だったエディタ拡張を紹介します。
先頭や最後尾に文字を追加するエディタ拡張
選択したオブジェクトの名前の先頭や最後尾に文字を追加できます。

使い方
- リネームしたいオブジェクトを選択
- メニューバーからツールを起動
- 実行すると階層下すべてリネームされる
コンポーネントを削除するエディタ拡張
消したいスクリプトがAdd Componentされていた場合に便利です。複数選択にも対応しています。
using UnityEngine;
using UnityEditor;
public class RemoveComponent : Editor
{
[MenuItem("Tools/Remove NewBehaviourScript")]
static void Remove()
{
foreach (GameObject obj in Selection.gameObjects)
{
var component = obj.GetComponent<NewBehaviourScript>();
if (component != null)
{
DestroyImmediate(component);
}
}
}
}Outlineコンポーネントを消したい場合はusing UnityEngine.UI;を追加して、obj.GetComponent<Outline>()とすると削除できます。
※エディタ拡張ではDestroyではなく、すぐ削除できるDestroyImmediateを使用します。
文字列の最後に連番を追加するエディタ拡張
階層内の数を見て、文字列の最後に連番をつけます。

ポイント:
string number = "0";にすれば0から始まる.transform.GetSiblingIndexで同階層における順序数を取得{0}{1}は数値の書式指定(0埋め1桁)
マスク素材用のマテリアルを作成してアサインするエディタ拡張
指定したオブジェクトにマテリアルをインスタンス化し、シェーダー選択、カラー指定後にアサインするスクリプトです。
複数オブジェクトにマスク用マテリアルをアサイン
アサインしたいオブジェクトに「Mask」というTagを付けておきます。
using UnityEngine;
public class ExampleClass : MonoBehaviour
{
void Start()
{
GameObject[] obstacles = GameObject.FindGameObjectsWithTag("Mask");
foreach (GameObject obs in obstacles)
{
Renderer rend = obs.GetComponent<Renderer>();
// シェーダー作成・アサイン
rend.material = new Material(Shader.Find("Unlit/Color"));
// カラーを変更
rend.material.color = Color.red;
}
}
}自分で色を指定したい場合:
rend.material.color = new Color(1f, 0f, 0f);ゲームビューのスクリーンショットを撮る方法
Photoshopで作ったレイアウトとUnityで作成したものを正確に見比べるために、原寸のGameビューのスクリーンショットを撮るエディタスクリプトです。


Ctrl + Shift + F12で保存。ダイアログで保存先を指定できます。
using UnityEditor;
using UnityEngine;
public class CaptureScreenshotFromEditor : Editor
{
[MenuItem("Edit/CaptureScreenshot #%F12")]
private static void CaptureScreenshot()
{
string path = EditorUtility.SaveFilePanel(
"Save Screenshot",
Application.dataPath,
System.DateTime.Now.ToString("yyyyMMdd-HHmmss"),
"png"
);
ScreenCapture.CaptureScreenshot(path);
var assembly = typeof(EditorWindow).Assembly;
var type = assembly.GetType("UnityEditor.GameView");
var gameview = EditorWindow.GetWindow(type);
gameview.Repaint();
Debug.Log("ScreenShot: " + path);
}
}選択したオブジェクトをCtrl+Gでグループ化するエディタ拡張
Mayaでよく使う機能です。選択した要素の上に親のGameObjectを作成します。
using UnityEngine;
using UnityEditor;
using System.Linq;
public class CreateEmptyParent : Editor
{
[MenuItem("Edit/Group Selected %g")]
static void Group()
{
if (Selection.transforms.Length == 0) return;
var sorted = Selection.transforms
.OrderBy(t => t.GetSiblingIndex())
.ToArray();
GameObject group = new GameObject("Group");
Undo.RegisterCreatedObjectUndo(group, "Group Selected");
group.transform.SetParent(sorted[0].parent);
group.transform.SetSiblingIndex(sorted[0].GetSiblingIndex());
foreach (Transform t in sorted)
{
Undo.SetTransformParent(t, group.transform, "Group Selected");
}
}
}参考:https://answers.unity.com/questions/118306/grouping-objects-in-the-hierarchy.html
使用コンポーネント名からオブジェクトを検索するエディタ拡張
MaskやOutlineなど、デフォルトで入っているコンポーネントがどこで使われているか調べられます。

ウィンドウを起動してSearch Forから探したいコンポーネント名(Mask、Outline、AspectRatioFitterなど)を入力してFind Nextボタンを押します。
参考:http://panzersoft.blog.fc2.com/blog-entry-66.html
無料の多機能リネーマー「Mulligan Renamer」
複数選択での置換など、高機能なリネーマーです。

Window → Red Blue → Mulligan Renamerから起動します。記号や数字を削除できる機能も便利です。
ダウンロード:https://github.com/redbluegames/unity-mulligan-renamer
日本語のリネーマー
日本語UIが良い場合はこちらが便利です。

参考:http://artawa.hatenablog.com/entry/2016/11/21/002242
複数プロジェクト共通でエディタ拡張する方法
プロジェクトを作るごとにエディタスクリプトを入れ直すのが面倒な場合、共通化できます。
手順
- 共通化したいスクリプトを用意
- Unityのインストール先の
Editor\Data\UnityExtensions\Unityにフォルダを作成 - バッチファイルでDLLを生成
- ivy.xmlを作成して配置
フォルダ構成:
Unity
└ Custom
├ Editor
│ ├ CustomMenu.cs
│ ├ CaptureScreenshotFromEditor.cs
│ └ EditorScript.dll
└ ivy.xml

新規プロジェクトを作成してUnityを起動すると、メニューが表示され、共通のエディタ拡張が使えるようになります。
参考:https://qiita.com/r-ngtm/items/493fdcbd62eb94031c6e
まとめ
- リネーム系:先頭・最後尾に文字追加、連番追加
- コンポーネント操作:削除、検索
- グループ化:Ctrl+Gで親オブジェクト作成
- スクリーンショット:ショートカット一発で保存
- マテリアル操作:マスク用マテリアルの一括アサイン
- 共通化:DLL化して全プロジェクトで使用可能
