GO
BACK
MORE
PDF

BLOGブログ

カテゴリー

キーワード

【Tech Blog】Unityエディタ拡張のススメ

文責:山路 裕也

  • Unity

Unityは、マルチプラットフォーム開発エンジンとして、ゲームだけでなく様々な分野で利用されています。しかし、プロジェクトが大規模になるにつれて、Unityエディタの標準機能だけでは効率的な作業が難しくなることがあります。

Unityは、エディタ拡張をすることができ、この仕組みを活用すると、プロジェクトの作業フローに合わせてエディタをカスタマイズし、より効率的に作業を進めることができます。

本記事では、Unityのエディタ拡張のメリットや具体的な活用例について紹介します。
まだエディタ拡張に触れたことがない皆さんのエディタ拡張導入のきっかけとなればと思います。



■ エディタ拡張の主なメリット

エディタ拡張を活用することで得られる主なメリットとして、以下のような点が挙げられます。

 ・作業の自動化による効率化
 ・ワークフローの統一と開発の標準化
 ・開発チーム全体の生産性向上

ここでは、それぞれのメリットの解説や簡単な例を紹介します。



1. 作業の自動化による効率化


開発を進める上で、繰り返し行う作業が多く発生することがあります。例えば、シーン内のオブジェクトに特定のタグを一括設定したり、大量のプレハブのパラメータを変更したりする場合、インスペクター ※ から手作業設定をする必要があり、時間がかかるだけでなく、ミスが発生しやすくなります。

エディタ拡張を活用すれば、これらの設定をスクリプトを用いてクリック一つで自動化できます。例えば、以下のような処理をエディタスクリプトで実装できます。

 ・オブジェクトの一括処理
   ◦ 全ての敵キャラクターに特定のスクリプトを自動で追加
 ・リソースの自動整理
   ◦ プロジェクト内の未使用アセットを検出して削除
 ・バッチ処理の実装
   ◦ 複数のシーンを一括でビルド

※ インスペクターとは、現在選択されているゲームオブジェクトに関する詳細な情報を、ゲームオブジェクトにアタッチされたコンポーネントやそのプロパティの情報も合わせて表示します。また、シーンのゲームオブジェクトの機能を変更することができます





2. ワークフローの統一と開発の標準化


開発チームが大規模になればなるほど、作業のし方にばらつきが生じやすくなります。例えば、コードの命名規則やアセットの管理方法が統一されていないと、プロジェクトのメンテナンスが困難になります。

エディタ拡張を活用すると、チーム全体のワークフローを統一し、開発の標準化を図ることができます。例えば、以下のようなツールを作成することで、作業の統一化が可能です。

 ・スクリプトテンプレートの自動生成ツール
   ◦ マスタデータの管理クラスを自動生成
 ・命名規則のチェックツール
   ◦ アセットのインポート時に命名違反の警告表示
 ・アセット管理ツール
   ◦ プロジェクト内のアセットをカテゴリーごとに自動分類



3. 開発チーム全体の生産性向上


Unityの標準エディタでは、特定の機能を実装するために多くのステップが必要になることがあります。例えば、UIのボタン配置を細かく調整する場合、手作業で座標を変更しながら確認するのは手間がかかってしまいます。そこで、エディタ拡張を利用すれば、独自のカスタムツールを作成し、プログラマーではないメンバーにUnityエディタでの作業を行ってもらう事ができたり、マップなどのレベルデザインやリッチな演出の制作をスムーズに行うことができます。例えば、以下のようなツールが考えられます。

 ・オブジェクト配置補助ツール
   ◦ 街灯など特定の間隔でオブジェクトを自動配置するツール
 ・UIレイアウト調整ツール
   ◦ PSDファイルからPrefabを自動生成するツール
 ・エフェクト調整ツール
   ◦ パーティクルエフェクトのパラメータをリアルタイムで調整

このようにエディタ拡張を行うことで、様々なメリットがあることが分かります。
次に、活用例を見てみましょう。



■ 具体的なエディタ拡張の活用例


 1. カスタムインスペクターの活用 
  a. インスペクターの拡張(CustomEditorの適用)
 2. スクリプト自動生成ツール
  a. メニュー拡張(MenuItemの拡張)
  b. カスタムウィンドウの作成(EditorWindowの使用) 
 3. テクスチャインポートの自動化
  a.アセット設定の自動化(AssetPostprocessorの拡張)



1. カスタムインスペクターの活用


Unityのインスペクター(Inspector) は、オブジェクトのプロパティを編集するための重要な機能ですが、デフォルトのUIでは複雑なデータ構造を扱うのが難しい場合があります。例えば、大量の数値データを一度に調整したり、複雑なオブジェクト間の関連性を視覚的に確認したりするのは、標準のインスペクターでは手間がかかります。

ここでは例として、キャラクターのパラメータをインスペクターから操作するカスタムインスペクターを見てみましょう。


【実装例】スライダーを使ったカスタムインスペクター
(キャラクターのパラメータをインスペクターから操作)

using UnityEngine;
using UnityEditor;




// CustomEditor属性を使ってCharacterクラスのインスペクタを拡張
[CustomEditor(typeof(Character))]
public class CharacterEditor : Editor
{
   public override void OnInspectorGUI()
   {
       Character character = (Character)target;


       character.hp = EditorGUILayout.Slider("HP", character.hp, 0, 100);
       character.speed = EditorGUILayout.FloatField("SPD", character.speed);


       if (GUILayout.Button("リセット"))
       {
           character.hp = 100;
           character.speed = 5;
       }


       EditorUtility.SetDirty(character);
   }
}


Characterクラスのインスペクター


このようにカスタムインスペクターを作ることで、スライダーによる直感的な数値の変更やリセットが簡単になり、作業効率が向上します。



2. スクリプト自動生成ツール


ゲーム開発では、似たようなスクリプトを何度も作成することがあります。例えば、敵のAIやUIのボタン処理などです。テンプレート化できるコードを毎回手作業で書くのはとても非効率です。
そういったケースで、エディタ拡張を利用すれば、スクリプトを自動生成するツールを作成し、開発の手間を大幅に削減できます。

次のコードは、EditorWindowを拡張して作成した独自のツールのウインドウをMenuItemから呼び出すソースのサンプルです。
独自の共通処理を実装したCustomMonoBehaviourクラスを基底クラスに持つスクリプトを生成しています。


【実装例】スクリプトテンプレート自動生成ツール
(EditorWindowを拡張して作成した独自のツールのウインドウをMenuItemから呼び出す)

using UnityEditor;
using System.IO;
using UnityEngine;


// EditorWindowを拡張して、独自のウインドウを作成
public class ScriptGenerator : EditorWindow
{
   private string scriptName = "NewScript";


   // MenuItem属性でUnityエディタのメニューバーにTools / Script作成を追加
   [MenuItem("Tools/スクリプト作成")]
   public static void ShowWindow()
   {
       GetWindow<ScriptGenerator>("スクリプトGenerator");
   }


   void OnGUI()
   {
       scriptName = EditorGUILayout.TextField("スクリプト名", scriptName);


       if (GUILayout.Button("スクリプト作成"))
       {
           string path = $"Assets/Scripts/{scriptName}.cs";
           if (!File.Exists(path))
           {
               string text = $"using UnityEngine;\n\npublic class {scriptName} : CustomMonoBehaviour\n{{\n    void Start() {{ }}\n    void Update() {{ }}\n}}\n"; ;
               File.WriteAllText(path, text);
               AssetDatabase.Refresh();
           }
           else
           {
               Debug.LogError("Script already exists!");
           }
       }
   }
}


※スクリプトテンプレート自動生成ツールの表示


このツールを使えば、スクリプト名を入力してボタンを押すだけで、指定のフォルダにCustomMonoBehaviourを継承したスクリプトが自動生成されます。命名規則や利用するクラスに一定のルールを設けたい場合などはこういったクラスを用いて、生成を自動化するのも良いかもしれません。



3. テクスチャインポートの自動化


Unityでの開発において、アセット※2 のインポートは頻繁に行われる作業です。AssetPostprocessorインターフェースを活用することで、インポート時に自動的に特定の処理を行うことができ、作業の効率化を図ることができます。
AssetPostprocessorクラスを拡張して、アセットインポートのポストプロセスの簡単なサンプルとそのメリットについて紹介します。

ここでは事例として、「テクスチャーのPathにSpritesと含まれていた場合に、Spriteとしてをインポートする」方法を取り上げます。


【実装例】アセットインポートのポストプロセス
(PathにSpritesと含まれていたら、Sprite設定でインポートする)

using UnityEngine;
using UnityEditor;


public class TexturePostprocessor : AssetPostprocessor
{
   void OnPreprocessTexture()
   {
       TextureImporter textureImporter = (TextureImporter)assetImporter;


       // 特定の条件に基づいて設定を変更することも可能
       if (assetPath.Contains("Sprites"))
       {
           textureImporter.textureType = TextureImporterType.Sprite;
       }
   }
}


このようなコードを書けば、画像をインポートし“Sprites”のキーワードがPathに含まれていたら、自動でSprite設定に変更してくれる機能を実装することができます。
画像のインポートをするたびに手動で設定を変更する必要がなくなり、大量の画像をインポートした際などの作業工数が現象し、手作業による作業漏れやミスなども防ぐことができます。



■ エディタ拡張を活用する際の注意点


Unityのエディタ拡張は、開発の効率化に非常に有効ですが、適切に管理しないと逆に作業の負担が増えてしまうこともあります。ここでは、エディタ拡張を活用する際に注意すべきポイントを解説します。



1. 過度な拡張による負荷の増加


エディタ拡張は便利ですが、機能を増やしすぎるとUnityエディタ自体の動作が重くなる可能性があります。特に、以下のような処理には注意が必要です。

 ・Update() 内での過度な処理
   ◦ EditorWindow や Editor クラスでは、OnGUI() や Update() を使用できますが、ここで無駄な計算をすると
    エディタの動作が遅くなります。
 ・シーン内オブジェクトの過剰な操作
   ◦ GameObject.FindObjectsOfType() を頻繁に実行すると、シーン内のオブジェクトを毎回検索するため、
    パフォーマンスが低下します。
 ・大量のエディタウィンドウの作成
   ◦ 不要なウィンドウを開きすぎると、UIの描画負荷が増加し、エディタの動作が不安定になることが
    あります。

【対策】

 ・できるだけ必要なときだけ処理を実行する(例:ボタンを押したときのみ処理を実行する)
 ・OnGUI() や Update() では、最小限の処理のみにする
 ・GetWindow()を使用して、作成するウィンドウのインスタンスを最小限に抑える
 ・オブジェクトの検索処理をキャッシュしておく



2. 他のアセットやUnityのアップデートによる互換性問題

エディタ拡張を作成するときは、Unityのバージョン変更や他のアセットとの互換性にも注意する必要があります。特に、Unityの新しいバージョンがリリースされると、以前のエディタ拡張スクリプトが正常に動作しなくなる可能性もあります。


【具体的な問題例】

 ・UnityEditor のAPIが変更される
   ◦ 古いメソッドが非推奨になる
 ・他のアセットと機能が競合し、エラーが発生する
   ◦ 同じメニューに登録されたツールが動作しなくなる 
 ・エディタ拡張のスクリプトが新しいバージョンのUnityでコンパイルエラーを引き起こす


【対策】

 ・Unityのアップデート前に、リリースノートを確認し、APIの変更点をチェックする
 ・エディタ拡張のスクリプトを別のアセットフォルダに管理し、すぐに修正できるようにする
 ・#if UNITY_EDITOR を使い、エディタ専用のコードがゲームのビルドに影響しないようにする



3. チームメンバーが使いやすい設計を意識する

エディタ拡張をチームで活用する場合、設計が複雑すぎると、他のメンバーが使いこなせないことがあります。
また、UIが直感的でないと、せっかく作ったツールが活用されず、無駄になってしまうこともあります。


【使いやすいエディタ拡張のポイント】

 ・直感的なUIを作成する
   ◦ ボタンやスライダーを活用し、シンプルな操作で機能を使えるようにするなど
 ・説明を追加する
   ◦ ツールチップを表示したり、マニュアルを作成するなど
 ・誤操作を防ぐ
   ◦ 「実行」ボタンを押すと警告を表示するなど



■ まとめ

本記事では、Unityのエディタ拡張のメリットと実装方法について解説しました。
Unityのエディタ拡張は、ゲーム開発の生産性を向上させる強力な手段です。エディタ拡張を活用することで、開発の効率化や作業の標準化が可能になり、チーム全体の生産性向上につながります。
特に、チーム開発や大規模プロジェクトでは、適切なエディタツールを作ることにより、作業の効率が大幅に向上します。

最初はシンプルなエディタ拡張から始め、開発環境に合わせて少しずつカスタマイズしていくと、無駄なく効果的なツールを作ることができます。
Unityのエディタ拡張を活用し、より効率的で快適なゲーム開発環境を構築しましょう!



■ さいごに


本記事が、Unityのエディタ拡張の理解と実践の手助けになれば幸いです。
もし「こんなツールを作りたい」「エディタ拡張で解決できる問題はないか?」といった疑問があれば、ぜひ挑戦してみてください。




最後まで読んでいただきありがとうございます。
この記事の内容について詳しく聞きたい方は、以下よりお気軽にお問い合わせください。

※記載されている会社名、製品名は、各社の登録商標または商標です。

文責:山路 裕也  エクスペリエンスデザイン部 エンジニア
山路さん_ver笑顔モノクロ_スクエア.png セガ エックスディーで、ゲーム開発で培った技術やノウハウを活かして、サービス開発や支援を行っています。

ナレッジ一覧にもどる