Amazonブラックフライデー&サイバーマンデー開催中!

【Unity】知っておくと便利!エディタ拡張まとめ9選

eyecatch-unity-editor-extensions

この記事の著者
CGブロガー すいみん

CGブロガー

すいみん

Suimin

プロフィール

某美大の油絵科を卒業後、大手CG映像プロダクションに入社。
その後ゲーム業界に転職。
現在は技術系のCGデザイナーをしています。 書籍:Unity デザイナーズ・バイブル
プロフィール詳細はこちら

知っておくと便利!エディタ拡張まとめ

エディタ拡張を使うと、Unityの標準で搭載されていない機能をつくることができます。

実際つかってみて、便利だったエディタ拡張機能を紹介いたします。

先頭や最後尾に文字を追加するエディタ拡張

目的がはっきりしているスクリプトは、使いやすいですよね。

  1. リネームしたいオブジェクトを選択。
  2. メニューバーからツールを起動。
  3. 実行すると階層下すべてリネームされます。

コンポーネントを削除するエディタ拡張

消したいスクリプトがAdd Componentされていたのでエディタ拡張で消してみました。

NewBehaviourScriptをAdd Componentされているゲームオブジェクトを選択して、実行すると削除されます。複数選択可。


たとえばOutlineのコンポーネントを消したい時はusing UnityEngine.UI;を追加して、obj.GetComponentとすると削除できます。

※エディタ拡張の場合Destroyではなく、すぐ削除できるDestroyImmediateを使用する

文字列の最後に連番を追加するエディタ拡張

階層内の数を見て、文字列の最後に連番をつけます。


  • string number = “0”; にすれば0からはじまります
  • .transform.GetSiblingIndex 同階層における順序数
  • {0}{1}は数値の書式指定 0埋め1桁

マスク素材用のマテリアルを作成してアサインするエディタ拡張

「マテリアル 切り替え」で調べると、変更したいオブジェクトにスクリプトを付けてマテリアルも登録し、そこからアサインというやり方が出てくるのですが、いちいち手動で仕込むのは面倒です。

そこで指定したオブジェクトに対してマテリアルをインスタンス、シェーダー選択、カラーも指定後アサインというスクリプトを書いてみました。

スクリプトをつけるスクリプトをかけばよいのかもしれませんが、要するに将来的にMayaのレンダーレイヤーみたいな事したいなということで・・・。

指定した複数オブジェクトにマスク用マテリアルをアサイン

アサインしたいオブジェクトに「Mask」というTagを付けておく

スクリプトは適当なGameObjectにつけておけばOK

using UnityEngine;
using System.Collections;
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;
}
}
}

Colorについて

RGB、CMYKの色はそれぞれコマンドが用意されています。

自分で色を指定したい時は

rend.material.color = new Color (1f, 0f, 0f);

※ちなみにマスク素材と言っているのはRGB/CMYKなどの色面をAE等で部分的に抽出して、調整するための素材のことです。

単体のオブジェクト名を入力して、マスク用マテリアルをアサイン

using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
//オブジェクト名入力
public string objname = "Sphere";
void Start() {
GameObject obj = GameObject.Find(objname);
Renderer rend = obj.GetComponent<Renderer>();
//シェーダー作成・アサイン
rend.material = new Material (Shader.Find( "Unlit/Color"));
//カラーを変更
rend.material.color = Color.red;
}
}

ショートカット一発!ゲームビューのスクリーンショットを撮る方法

Photoshopで作ったレイアウトとUnityで作成したものとを正確に見比べるように、原寸のGameビューのスクリーンショットを撮るEditorスクリプトを使ってみました。

同サイズの画像比較をしないと、システムフォント周りの再現度を上げるのは、なかなか難しいです。

スクリーンショット用Editorスクリプト

参考リンクのCaptureScreenshotFromEditor.csがベースです。

Ctrl + Shift + F12で保存。

Assets直下に画像を保存したくなかったので、ダイアログを出して保存先を指定するように一部変更しています。

using UnityEditor;
using UnityEngine;
public class CaptureScreenshotFromEditor : Editor {
[MenuItem( "Edit/CaptureScreenshot #�2" )]
private static void CaptureScreenshot() {
string path = EditorUtility.SaveFilePanel("Save Screenshot", Application.dataPath, System.DateTime.Now.ToString( "yyyyMMdd-HHmmss" ), "png");
Application.CaptureScreenshot( path );
var assembly = typeof( UnityEditor.EditorWindow ).Assembly;
var type = assembly.GetType( "UnityEditor.GameView" );
var gameview = EditorWindow.GetWindow( type );
gameview.Repaint();
Debug.Log( "ScreenShot: " + path );
}
}
参考 Unityエディタ上からGameビューのスクリーンショットを撮るEditor拡張Qiita 参考 Unityでスクリーンショットを保存する生存日記

選択したオブジェクトをCtrl+Gでグループ化するエディタ拡張

Mayaでよく使うやつです。
Unityでも選択した要素の上に親のゲームオブジェクトを作成したかったので調べてみました。

グループ化するエディタースクリプト

Editorフォルダの中に、CreateEmptyParent.csを入れてやります。

ということでLinqを使って、階層順にグループ化できるようにしました。

参考 Grouping objects in the Hierarchy?Unity Answers

使用コンポーネント名からオブジェクトを検索するエディタ拡張

Assetsに入っているデータから関連している素材を探すことはできるのですが、

そうではなくマスクとかアウトラインとか、デフォルトで入っているコンポーネントがどこで使われているのか調べてみました。

コンポーネントの検索方法

コンポーネント名から検索する方法です。

STEP.2
検索

ウインドウを起動してSerch Forから探したいコンポーネント名を入れて、Find Nextボタンを押します。

MaskOutlineAspectRatioFitter、などなど

無料!多機能リネーマー「Mulligan Renamer Tool for Unity」の紹介

正直、複数選択しての置換さえできればなんでも良いのですが、リネーマーを探してみました。

Mulligan Renamer Tool for Unity

下記の部分をダウンロード

参考 Mulligan Renamer Tool for UnityGitHub
STEP.1
PDFを開きます

Window > Red Blue > Mulligan Renamerからリネーマーが起動します

STEP.2
検索

詳細は省きますが、画像を見ての通り、多機能かつ見やすいです。

記号を削除できたり、数字を削除できたりと地味に便利な機能も。

日本語のリネーマー

日本語の方が良い場合はこちらが良さそうです。

参考 リネームツールツクロウヤ

使い方はEditorにCommonEditorTools.csとObjRenamer.csを格納してCustome>Prefabs>ObjRenamerから起動します。

複数のプロジェクト共通でエディター拡張する方法

プロジェクト作るごとにエディタースクリプト入れ直すのが面倒だったので、共通化する方法を調べてみました。

こちらの記事を参考にしています。

参考 プロジェクトをまたいでエディター拡張したいQiita
STEP.1
スクリプトの用意
2種類のスクリプトを用意

・参考記事のデバッグログ出すスクリプト(CustomMenu.cs)
・Ctrl+Shift+F12でゲーム画面のスクリーンショットが撮れるスクリプト(CaptureScreenshotFromEditor.cs)

スクリーンショット用エディタスクリプト

STEP.2
フォルダの作成

Unityがインストールされている場所のC:Program FilesUnityEditorDataUnityExtensionsUnity
下記のようにフォルダを作成しました。(※UnityExtensions直下であればどこでもいいようです)

STEP.3
フォルダの作成
Unity
 L Custom
  L Editor
   L CustomMenu.cs
   L CaptureScreenshotFromEditor.cs

スクリプトもEditorの中に格納します。

STEP.4
DLLの生成
下記のようなバッチ(build.bat)を作成

"C:Program FilesUnityEditorDataMonobinsmcs.bat" -r:"C:Program FilesUnityEditorDataManagedUnityEngine.dll" -r:"C:Program FilesUnityEditorDataManagedUnityEditor.dll" -target:library -out:"C:Usersユーザー名DesktopEditorScript.dll" *.cs

※Unityフォルダにバージョンを入れている場合はパスを変更する

※生成する.dllは仮にEditorScript.dllとしました。

プログラムファイルは管理者権限もあるので、まずはバッチをデスクトップに置き、そこに2つのスクリプトをドラッグ&ドロップして、EditorScript.dllを生成

生成された. dllをスクリプトと同階層に移動

STEP.5
xmlの作成

Editorフォルダと同階層に下記のivy.xmlを配置

Unity
 L Custom
  L Editor
   L CustomMenu.cs
   L CaptureScreenshotFromEditor.cs
   L EditorScript.dll
  L ivy.xml

ivy.xml

<?xml version="1.0" encoding="utf-8"?>
<ivy-module version="2.0">
<info version="2017.3.0f3" organisation="Unity" module="Custom" e:packageType="UnityExtension" e:unityVersion="2017.3.0f3" xmlns:e="http://ant.apache.org/ivy/extra" />
<publications xmlns:e="http://ant.apache.org/ivy/extra">
<artifact name="Editor/EditorScript" type="dll" ext="dll" e:guid="adebbd281f1a4ef3a30be7f21937e02f" />
</publications>
</ivy-module>

※変更箇所はinfo version,organisation,module,unityVersion,artifact name

詳しく知りたい場合はこちら

参考 Module Managerを使って自作ライブラリを読み込んでみたけいごのなんとか
STEP.5
確認

新規プロジェクトを作成しUnityを起動すると、メニューが表示され、またCtrl+Shift+F12でスクショも撮ることができました。

これで自作のエディター拡張制作がますます楽しくなります!

すいみん

uGUIに関するエディタ拡張は下記の記事にまとめました!
eyecatch-unity-ui-editor-extensions 【Unity】UI制作に便利!エディタ拡張まとめ13選[uGUI]

以上、すいみん(@cg_method)でした!