Monthly Archives: 2月 2015

[Departure from the Void] モーションエディタ本格導入中・・・

前回の更新からだいぶ間が空いてしまいました・・・
自作ゲームの制作状況についての日記です。

今月初めからゲーム上で動くキャラの動きを管理するツールを作成していました。
Unityのエディタ拡張として動くツールです。
以下のようにキャラの軌道をシーン上で視覚的に表示できるようにしたのが特徴です。

easy-motion-editor

本ツールは第三者でも使用できるようにGitHubにてオープンソースで公開しています。

 https://github.com/ftvoid/EasyMotion

まだ不具合が多かったり、自作ゲームの補助ツール用に作成していることもあり使いづらかったりする点が多く改良が必要ですが、今後も引き続き作成を続けていくつもりです。
ゲーム制作で実際に使いながら機能追加や操作性の改善を行っています。

こんなツール、いつか誰かに使ってもらえる日は来るのでしょうか・・・
そんな気持ちですが、モチベーション維持という意味でも積極的に成果物をアウトプットしていきたいと思います。

[Departure from the Void] モーションエディタ作成中

制作中のゲームDeparture from the Voidですが、ステージ制作を中断してツール整備を行っています。
今後は新しいステージを実装する予定があるためです。

整備したツールはGitHubにてオープンソースで公開していきたいと考えています。
現在整備中のツールは敵キャラの動きを簡単に実装可能にするためのモーションエディタです。
Unityのエディタ拡張として実装しています。

作り始めでほとんど何も出来ていませんが、一応GitHubに反映しています。
Unityエディタ上で編集できるようにしたいと考えていますが、Unity以外のツールからも編集できるようにすることも考えています。
ステージ上に配置する敵や障害物は格子状に配置したりするので、Excel上で配置したデータをそのままUnity上のシーンに取り込んだり出来るツールを考えています。
OpenXMLを用いれば技術的には実現可能です。

メンテのことを考えると、仕様書からゲームデータに自動変換できる仕組みが欲しいところです。

ここ暫くはツール整備に徹することになると思います。
整備に目処が立ったらステージ2の制作を再開する予定です。

[Unity] プロパティをインスペクタから編集できるようにする

UnityのC#スクリプトにて、シリアライズ可能なフィールドはインスペクタから編集することができますが、プロパティはpublicにしても[SerializeField]属性を指定しても編集できません。
プロパティはフィールドとは違い、内部的にはメソッドとして扱われるためです。
メソッドはシリアライズできないため、プロパティも必然的にシリアライズできないことになります。

しかし、擬似的にプロパティをインスペクタから編集可能にする手段は存在します。

実装方針

今回は任意のタイミングでプロパティの値を編集可能にする方針で実装したいと思います。

エディタ拡張を用いれば値を編集するGUIを自由に配置できます。
プロパティに対して値表示や値指定を行うGUIを独自に配置すれば、本題の目的は実現できます。

プロパティを持ったEnemyクラスを例に具体的なスクリプトを記します。

Enemy.cs

EnemyEditor.cs

EnemyクラスにはSpeed、Nameの2つのプロパティがpublicで定義されていますが、インスペクタには表示されません。
そこで、Enemyクラス用のエディタ拡張クラスEnemyEditorクラスを定義し、次に示す部分にて動的にGUIを配置しています。

EnemyEditor.cs

プロパティの型に対応したGUI配置メソッドを呼び出す必要があります。
Speedはint型なのでEditorGUILayout.IntField()、Nameはstring型なのでEditorGUILayout.TextField()で呼び出しています。

これで以下のように編集できるようになりました。

property-edit-1
property-edit-2

最後に

今回の方法を用いれば、多少手間ではありますがプロパティとGUIを連動させることができます。
しかし、ゲームを実行・停止するごとに値がリセットされてしまうひとつのプロパティの値を編集(set)するたびに他の編集可能なプロパティのsetが呼び出されるなど、問題点も存在します。

これらの問題を解決する方法は今のところ思いつきません・・・
より良い方法がありましたら改めてご紹介させていただきます。

[Unity] インスペクタから編集可能なprivateフィールドにアクセスする

Unityではシリアライズ可能なフィールドは以下のようにインスペクタから編集することが出来ます。

private-editor-access1

MonoBehaviourを継承したクラスには[Serializable]属性が指定されているため、シリアライズすることが出来ます。
シリアライズ可能なクラスでは、publicまたは[SerializeField]属性が指定されたフィールドがインスペクタ上に表示され、編集可能になります。
すなわち、[SerializeField]属性が指定されていればprivateなフィールドでも編集可能になります。

では、エディタ拡張などで[SerializeField]属性が指定されたprivateフィールドにアクセスする場合はどうすればよいでしょうか?
例えば、以下のようなEnemyクラスを実装したとします。

ここでエディタ拡張するために以下のようなEnemyEditorクラスを定義します。

しかし、Enemyクラスのフィールドは皆privateであるため、外側からアクセスできません。
したがって、上記のEnemyEditorクラスはコンパイルエラーとなります。
フィールドをpublicにすればアクセス可能になりますが、エディタ拡張のためにわざわざフィールドを公開してしまうのは好ましくありません。

このようにシリアライズされたフィールドにアクセスするためには、SerializedObjectを用います。
具体的な使い方は以下の通りです。

これでEnemyEditorクラスからEnemyクラスのフィールドにアクセスすることが出来ます。
インスペクタを表示してみると以下のようにEnemyEditorによってスライダーにより値が編集できるようになっていることを確認できます。

private-editor-access2

エディタ拡張でシリアライズ可能なフィールドにアクセスする場合は、基本的にSerializedObjectを通じてアクセスする習慣をつけておけば問題無いかと思います。

[お知らせ] 2月になりました

今年ももう2月になりました。
今月のfrom the voidとしての活動目標は以下の通りです。

 ・Departure from the VoidのWeb版移植
 ・ゲームのソフトウェア部品整備

以上です。

Departure from the VoidのWeb版移植は先月からの継続で進めます。
ステージ1までの移植が完了したため、ステージ2の移植を進めていく予定です。

以下、ステージ2の完成図です。

今月中にステージ2を完成させられれば理想です。

ゲームのソフトウェア部品整備は、前述の移植作業である程度固まってきたシステムの土台部分を他のゲーム開発でも使いまわせるように部品化していく作業です。
実は、今日からひそかに敵キャラの動きを管理するためのソフトウェア部品をGitHubに反映していました。
部品化したものはGitHubに公開し、誰でも利用できる形に整備したいと考えています。

その他、時間があればUnrealEngineにも少し触れてみたいと思ってます。
もしかしたら、そのことをブログ記事として投稿していくかもしれません。

今月はどれだけ活動時間を確保できるかまだ見通しが立っていませんが、無理しない程度に作業を進めていきたいと思います。