読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

スクリプトのテンプレを複数使えるようにしつつ、作成日や作成者名等も追加する【Unity】【エディタ拡張】

Unity エディタ拡張

このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 4.6.3f1


はじめに

以前、スクリプトを新規作成する時に使用するテンプレートの変更方法を紹介しました。



ただ、このテンプレートは一つしか登録出来ないらしく、

作成するスクリプトの種類によってテンプレートを変える

みたいな事は普通は出来ないみたいです。


普通で出来ないなら、エディタ拡張すればいいじゃない!

という事で作ってみました。

ついでに作成日や作成者名等も追加出来るようにしてみたり。


使用イメージ


今回の方法でのテンプレ作成は[Project]-[Create]-[Template Script]

から行います。


f:id:kan_kikuchi:20150525214625p:plain


この項目からテンプレートを選ぶと、ウィンドウが開き、


f:id:kan_kikuchi:20150525215007p:plain


上段がスクリプト&クラス名、中段がスクリプトの概要、下段が作成者の入力欄です。

これらを適宜入力してCreateを押すと、

選んでいた場所に以下のような新たなスクリプトが生成されます。

//  NewScript.cs
//  ProductName test
//
//  Created by kan on 2015.05.25.

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// さまり〜(:3っ)∋〜
/// </summary>
public class NewScript : MonoBehaviour 
{

	//=================================================================================
	//初期化
	//=================================================================================

	private void Awake(){

	}

	private void Start(){

	}

	//=================================================================================
	//更新
	//=================================================================================

	private void Update () {
	
	}

}


ちなみに上の方のコメント文はXcodeと同じ感じにしてみました。


ScriptCreator

ではプログラムを!



やっている事は簡単で、テンプレートのテキストを読み込み、

クラス名等を置換してスクリプトとして書き出してるだけです。


使い方

まず上記のScriptCreatorをEditorディレクトリに入れます


次にAssets/Scripts/Templatesという階層でディレクトリを作り、

テンプレートである下記のBasic.txt、Singleton.txt、Static.txtを入れます。



これでcreateメニューに新しいメニューが追加されるので、あとはスクリプトを作るだけ!


コード説明

ではでは項目ごとにコード説明です!


テンプレ指定、メニュー追加

上の方でTEMPLATE_SCRIPT_〜_NAMEとして宣言している定数がテンプレ名です。

private const string TEMPLATE_SCRIPT_BASIC_NAME     = "Basic";
private const string TEMPLATE_SCRIPT_STATIC_NAME    = "Static";
private const string TEMPLATE_SCRIPT_SINGLETON_NAME = "Singleton";


これをMenuItemで使う事によって、メニューにテンプレ名を表示しています。

ちなみに[MenuItem(COMMAND_NAME)]と書く事でCOMMAND_NAMEで

指定したボタンを押した時に実行するように出来ます。

//=================================================================================
//メニューに表示する項目
//=================================================================================
[MenuItem (MENU_PATH + TEMPLATE_SCRIPT_BASIC_NAME)]
private static void CreateBasicScript ()
{
  ShowWindow (TEMPLATE_SCRIPT_BASIC_NAME);
}

[MenuItem (MENU_PATH + TEMPLATE_SCRIPT_SINGLETON_NAME)]
private static void CreateSingletonScript ()
{
  ShowWindow (TEMPLATE_SCRIPT_SINGLETON_NAME);
}

[MenuItem (MENU_PATH + TEMPLATE_SCRIPT_STATIC_NAME)]
private static void CreateConstantsScript ()
{
  ShowWindow (TEMPLATE_SCRIPT_STATIC_NAME);
}


ShowWindowにボタンに表示しているテンプレ名と同じ文字列を渡す事で、

選択されたテンプレが何かを判断しています。


ウィンドウ作成

EditorWindow.GetWindowを使う事でウィンドウを作成出来ます。

また、ウィンドウ内に描画する内容はOnGUI内に記述します。

詳しくは以下が参考になります。


【エディタ拡張徹底解説】初級編①:ウィンドウを自作してみよう【Unity】 | ケットシーウェア


なお、ScriptCreatorがEditorWindowを継承していたのは、このウィンドウの管理をするためでした。


各情報読み込みと置換

ShowWindowやCreateScript内で色々な情報を読み込み、

それをテンプレに書いてあるタグと置換する事で新たなスクリプトを作成しています。

//現在時刻を取得
_createdData = DateTime.Now.ToString ("yyyy.MM.dd");

//作成者としてログインしているユーザ名を取得
_authorName = System.Environment.UserName;

//プロダクト名を取得
PlayerSettings.productName


//scriptTextの中から#PRODUCTNAME#という文字列全てをPlayerSettings.productNameに置換する
scriptText = scriptText.Replace ("#PRODUCTNAME#", PlayerSettings.productName);


また、プロダクト名はPlayerSettingsのProduct Nameに記載している内容です。


f:id:kan_kikuchi:20150526063632p:plain


置換しているタグは以下の5種類です。

  • #PRODUCTNAME# プロダクト名
  • #AUTHOR# 作成者
  • #DATA# 作成日
  • #SUMMARY# 概要
  • #SCRIPTNAME# スクリプト名


作成者はいまいち上手い取得方法が考えられずPCにログインしているユーザ名にしています。

gitconfigからユーザ名も読み込もうとか、ユーザ名ファイルを作ってそれをgitignoreしようかとか、

色々考えましたがしっくりいかず、苦肉の策でこの形になりました……


おわりに

複数のテンプレを使えるようにするという目標は達成できましたが、

テンプレ作るのが地味に面倒ですね……


( ゚ Д゚)ハッ!


という事で次回は、スクリプトからテンプレを自動作成するエディタ拡張です!