Monthly Archives: 10月 2014

[Unity] プロジェクト単位でカスタムテンプレートを適用する

前回の記事でUnityのスクリプトテンプレートを書き換える方法を紹介しました。

しかし、上記にはいくつかの問題点が存在します。

 ・インストールされたUnity全体に影響が及ぶ
 ・共同開発では各々のPCで設定する必要あり
 ・1台のPCで異なるテンプレートを併用することが出来ない

テンプレートの変更はインストールされたUnity配下のファイルを弄ることになるので当然といえば当然です。

そこで、上記の問題を払拭するためにUnityプロジェクト個別にテンプレートを適用する方法を考えてみました。

■実現方針
Unityプロジェクトそれぞれに対してテンプレートを適用するので、Assetsディレクトリ配下にテンプレートファイルを置いて、これをスクリプト作成時に用いるようにします。
Unityにはもともとそのような機能は無いため、エディタ拡張機能を用いて実現する形となります。

スクリプト作成時に読み出し処理を行うためには、以下のようにAssetPostprocessorの派生クラスを定義したスクリプトをAssets配下に置いておきます。

上記のOnPostprocessAllAssets()の第1引数importedAssetsより新規作成されたスクリプトファイルへのパスを取得できます。
ここで厄介なのが、importedAssetsには外部からインポートされたファイルも含むことです。
また、OnPostprocessAllAssets()の呼び出されるタイミングがインポート終了後というのも曲者です。

このままでは新規作成されたのか外部からインポートされたのか判断できません。
外部からインポートされたファイルを書き換えてしまうと大変なので、何とかして新規作成かどうかの判定を行います。

新規作成されたスクリプトはUnityのテンプレートファイルから作成されるため、こちらと中身が一致していれば新規作成かどうかの判定ができます。
ファイル内容比較を新規作成/インポートのたびに行うため、非常に非効率な方法です。
他に思いつく方法が無いので今回はこれで行きます。

テンプレートの読み書きは.NET FrameworkのファイルIOで実現できます。

■導入手順
1.以下パスのディレクトリを丸ごとコピーし、UnityプロジェクトのAssets配下にドラッグします。

Windows
 (Unityのインストールパス)EditorDataResourcesScriptTemplates
Mac
 (Unityのインストールパス)ContentsResourcesScriptTemplates

unity-pj-template

2.以下スクリプトをAssets配下の任意の場所に置きます。

TemplateGenerator.cs

3.TEMPLATE_DIRに1.のScriptTemplatesディレクトリへのパスを指定します。
Assets直下に置いた場合は変更する必要がありません。

これでAssets配下のScriptTemplatesのテンプレートが適用されるようになります。

必要なら50行目付近に置換したいシンボルを追加してください。
例としてスクリプトの制作者名と作成した日付を定義しています。

以上で導入手順は終わりです。

かなり乱暴な手法となってしまいましたが、プロジェクト個別にテンプレートを設定する方法が無かったため紹介させていただきました。

[お知らせ] 今年のゲーム開発予定

今年度中のゲーム開発の予定を上げておきます。

11月~12月
 ・Departure from the Voidステージ1制作
12月~12月中旬
 ・Departure from the Voidステージ2制作
12月中旬~12月下旬
 ・風使い(仮)制作

ざっとこんな感じです。
今年もあまりゲームを公開できず仕舞いに終わりそうですが、昨年度に比べて大きなスキルアップが出来る年になりそうなので、来年度でその花を開かせればと考えているところです。

制作中のDeparture from the Voidは何とか年末までにWindows版からWeb版への移植を終えられればと考えています。
移植が終わればひとまずWeb版を公開できると思います。

風使い(仮)はその後に着手したいと思います。
こちらも出来れば公開まで持っていきたいところですが、かなり微妙です…

少なくともDeparture from the VoidのWeb版公開を目標に年末まで制作に励みたいと思います。

[Departure from the Void] ステージ1の敵配置

前回の更新から間が空いてしまいました。
ステージ1の完成に向けて少しずつステージ制作を進めています。
ステージ自体はWindows版のものと同じにするため、そちらのソースを眺めながらの作業をしています。

敵の動きも一つ一つ見て比較しながらの移植作業です。

dpv-stage1-enemy

Unityでゲーム開発を進めています。
ここからは技術的な話になりますが…

ゲーム内での画面切り替えには通常はシーン読み込みで行います。
しかし、今回はより高速な動作を目指しているため、1つのシーンだけでシーン読み込みは行わず、プレハブの削除・追加で実現することとしました。
管理が若干面倒になりそうですが、特定のGameObject配下に敵や自機などのオブジェクトをまとめておいて、その親元のGameObjectを削除するようにします。
これで管理が簡単になります。

月末までの完成予定でしたが、制作時間を確保できず作業が停滞している状態です。
特に中旬は私が別方面での大きなイベントに注力していたこともあってブログすら更新できていませんでした。

今週も来月も同じような状況が続くのでゲーム制作は亀より遅いスピードになりそうです。
ステージ1の完成がいつになるかは見通しが立っていませんが、遅くとも今年中には完成できればいいなあ…と考えています。

[Unity] スクリプトのテンプレートを変更する

Unity上でスクリプトを新規作成するとき、以下のようにあらかじめテンプレートが入力された状態で作成されます。

このような記述はテンプレートファイルとしてUnityのインストールディレクトリ配下に格納されています。

Windows
 (Unityのインストールパス)EditorDataResourcesScriptTemplates
Mac
 (Unityのインストールパス)ContentsResourcesScriptTemplates

この中のテキストファイルを書き換えることで自由なテンプレートに変更できます。
C#用のスクリプトファイルは81-C# Script-NewBehaviourScript.cs.txtです。

#SCRIPTNAME#はスクリプトファイル名に置換されます。
これを含め、以下のような置換シンボルがあります。

#NAME#
 拡張子なしのファイル名
#SCRIPTNAME#
 空白、拡張子なしのファイル名
#SCRIPTNAME_LOWER#
 空白、拡張子なしでキャメルケースのファイル名

たとえば、以下のように書き換えてみます。

この後にNewBehaviourScript.csというスクリプトを新規作成して開いてみると以下のようになります。

スクリプトやクラスのヘッダコメントを自動的に付加したい場合などに重宝するでしょう。

テンプレートファイルはUnity自体のシステムファイルを書き換えることになるので、UnityがインストールされているPC全体に影響します。
また、別PCには影響しないので他のPCでも同じようにテンプレートを適用するためには上記操作をPC台数分だけ行う必要があります。

プロジェクトごとに個別にテンプレートを適用する方法はありますが、これはまた別の機会に解説したいと思います。

コーディングスタイルが既に決められている現場などでは自由にテンプレートを設定できるのはありがたいですね。

■参考サイト
Unityのスクリプトテンプレートを変更する | ワンダープラネットエンジニア Blog
テンプレートファイルにカスタムキーワード追加 – けいごのなんとか
C# Script Template – how to make custom changes? – Unity Answers

[Unity] スクリプトの有効/無効状態にコルーチンを連動させる

GameObjectにアタッチしたスクリプトのenabledフィールドをfalseにした場合(スクリプトを無効にした場合)、Update()などが呼び出されなくなり更新処理が止まります。
しかし、前述のスクリプトから呼び出されたコルーチンは止まりません。
たとえば、以下のようなカウンタ値を1秒ごとに出力するスクリプトでは、スクリプトを無効にしてもコルーチンが動き続け値が表示され続けます。

コルーチンをスクリプトの有効/無効状態すなわちenableの値に連動させるためには、OnDisable()、OnEnable()内でコルーチンを停止/再開させる必要があります。
これを実装すると以下のようになります。

Start()などUnity側から呼び出されるメソッドをコルーチンとしている場合は戻り値を受け取る術が無いので別のメソッド名にしてAwake()内部で呼び出すようにしています。
これでスクリプトが無効になるとコルーチンが停止し、再び有効になるとコルーチンが途中から再開します。
コルーチンを途中から再開させるためにはStartCoroutine()にコルーチンの戻り値を指定します。

これでコルーチンがスクリプトの有効/無効状態に連動して動作/停止するようになりました。

[Unity] MonoDevelopでTODOリストを表示する

コーディングする際、後で実装が必要な箇所にTODOコメントを付ける事はよく行われているのではないでしょうか。
EclipseなどのIDEでは「// TODO」と書くとその箇所をハイライトしてくれます。

MonoDevelopにもこのような機能は存在します。

以下のようにスクリプトにTODOコメントを入れます。

todo-1

そして、画面の右下のTasksをクリックします。

todo-2

すると、上記のようにTODOコメントを付けた箇所が一覧表示されます。
該当箇所をダブルクリックすると、そのTODOコメントの場所までジャンプしてくれます。

ソースのどこをこれから編集すべきかが一目瞭然なので便利です。
TODOコメントを外せば自動で消えてくれます。

上記のほかに自分でTODOリストを作ることも出来ます。
以下リストボックスから「User Tasks」を選択します。

todo-3

そして、「New Tasks」をクリックすると、タスクを追加できます。
「User Tasks」のTODOの場合、TODOコメントのようにソースのコメントと連動していないので、タスクが完了したら左のチェックボックスにチェックを入れます。
これで取り消し線表示となりタスク完了となります。

Google Tasksと同じような感覚で使えます。

TODOの管理の仕方は人それぞれだと思いますが、MonoDevelopにもこんな機能があるという紹介でした。

■参考サイト
MonoDevelop Tips: Task Comments | Michael J Hutchinson

[Departure from the Void] ゲームオーバー画面完成

ゲームの制作日記です。

先月からずっとWindowsからWeb版への移植作業を行っております。

土日から着手していたゲームオーバー画面の実装が完成しました。
以下のような画面です。

dpv-gameover

画面の動きはWindows版とほぼ一緒です。
ゲームオーバーしてから別画面に遷移するまでの時間を短くしてプレイヤーにストレスを感じさせないよう、若干の表示修正を行っています。

現状ではゲームを再開するかタイトル画面に戻るかの2択しかありませんが、後にハイスコアを登録したりTwitterにスコアを記録したりする機能をつけようと考えています。
ひとまず今月中はステージ1の完成を優先させて制作を進めたいと思います。

[Unity] 数字をスプライトで表示

Unityのスプライトで数字を表示させるためのTipsのご紹介です。

num-sprite

Unityで数字を表示するためにはGUITextやuGUIのTextを用いることで実現できます。
しかし、自分で描いたオリジナルの数字を表示させたい場合は数字の絵を並べて表示させる必要が出てきます。
今回はこれを簡単に行うためのスクリプトを用意しました。

宜しければご自由にお使いください。

NumSprite.cs

かなりやっつけで作ったので、汚い部分があることはご了承願います。
今回は左寄せのみに対応しました。

上記スクリプトをGameObjectにアタッチすると、インスペクタから以下のような編集画面が表示されます。

num-sprite-edit

ShowSpriteにスプライトを表示させるのに用いるGameObjectのプレハブ、0~9に各数字に対応したスプライト、Minusにマイナス符号「-」のスプライトを指定します。
Widthには表示する数字の間隔を指定します。
これで、記事の冒頭で示したような数字のスプライトが表示されるようになります。

表示する値はスクリプトからValueプロパティに指定してください。

今回のスプライト表示の考え方は、各数字をスプライトの付いたGameObjectとして並べて表示することです。
スプライトは表示する数字に合わせて変えてやります。
並べるGameObjectは数字の桁数分だけ必要です。

Valueに値を指定するたびにGameObjectの破棄・作成を行う、左寄せしか出来ない、桁数分だけGameObjectが必要などデメリットがありますが、それほどパフォーマンスを求めない場面では使えるのではないかと思います。
パフォーマンス面では大いに改良の余地ありですが、これはまたの機会に考えたいと思います。

[Unity] スプライトのパラパラアニメーション

Unityではデフォルトでアニメーション機能が備わっております。
これを使えばパラパラアニメのような動きも実装できます。

しかし、スプライトのアニメーションを作るたびにUnityのアニメーション設定を行うのが面倒と思われる方もいるかもしれません。(私がそうです)
そのため、簡単な設定で実現できる簡易的なパラパラアニメを行うスクリプトを作成しました。
よろしければご自由にお使いください。

SpriteAnimation.cs

アニメーションはスプライトの切り替えで行っています。
アニメーションさせたいGameObjectに上記スクリプトをアタッチし、インスペクタからClipにアニメーションの各クリップとなるスプライト、Intervalにスプライトの切り替え間隔、IsLoopにアニメーションをループさせるかどうか、DestroyOnFinishedにアニメーションを終了したらGameObjectを消すかどうかの指定を行ってください。

sprite-animation

今回のスクリプトは、スプライト配列に登録されたスプライトを順番に表示していくだけの簡単なアニメーションですが、必要に応じて改良して使っていただければと思います。

[Departure from the Void] ステージ1の制作中…

10月末までのステージ1完成を目指し、ステージをちまちまと作っているところです。

dpv-stage1

まだいまは一種類の敵しか出現しないですが、ひとまず敵出現→自機ショットで破壊ができるようになりました。
自機が敵に当たるとやられたりゲームオーバーになったりする部分の実装はこれからです。
スコアや残機数の表示もまだです。

道のりは長いですが、Unityを用いることによって従来の数倍のパフォーマンスで作業が進んでいます。
数倍になったといっても非常に遅いペースですが…

果たして月末までの完成となるのか!?
計画を立てながら一歩一歩着実に進めていきたいと思います。