Monthly Archives: 11月 2014

[Unity] インスペクタ上からオリジナルのメソッドを実行する

インスペクタのコンポーネントの以下歯車アイコンをクリックすると、コンテキストメニューが表示されます。

contextmenu-1

ここに以下のように独自の項目を追加し、項目をクリックすると自前のメソッドを実行させるようにすることができます。

contextmenu-2

手順は至って簡単です。
項目に表示したいメソッドの前に以下のようなContextMenu属性を記述します。

属性記述[ContextMenu(項目名)]を追加することでコンテキストメニューの項目に追加されます。
項目を実際に選択すると、以下のようにコンソールに結果が出力されます。

contextmenu-3

まぎれもなく上記メソッドが出力した結果です。
デバッグ時などでは重宝するかもしれませんね。

[Departure from the Void] キーコンフィグ機能実装中

Departure from the VoidのWeb版移植の開発状況についての日記です。

今週あたりからキーコンフィグ機能の機能設計・内部設計について考えていました。
ゲームパッドに対応するため、ユーザから自由にボタンの割り当てを出来るようにしたいというのが狙いです。
ユーザが設定したキーコンフィグ情報は保存して保持しておけるようにしておくつもりです。

Webブラウザのクッキーに保持しておければと考えています。

Unityでキーコンフィグ情報をどのような形で保持すべきかどうか悩んでおり、実現可能な方法は2~3通りくらい思い浮かんでいます。
実装方法がまとまったら備忘録として記事にまとめようと思います。

今回行ったことはここまでです。

話が変わりますが、今月中にはUnity5 Proを購入しようと考えています。
そのため、最終的にはゲーム起動時にUnityロゴが表示されなくなる予定です。

[C#] C/C++相当の共用体(union)を扱う

C/C++ではメンバのメモリ領域を共有できる共用体が存在しますが、C#には存在しません。
しかし、属性を駆使して共用体を実装することは可能です。

具体的なコードは以下のようになります。

structの頭に付けている属性[System.Runtime.InteropServices.StructLayout(LayoutKind.Explicit)]はstructを共用体として定義するためのおまじないと思って良いでしょう。
これは外部のアンマネージコード側からC#のクラスを扱いたい場合などにフィールドのオフセットを厳密に指定したい場合などに使用します。

フィールドのオフセットは[System.Runtime.InteropServices.FieldOffset(0)]で指定しています。
0の部分がオフセット値となり、構造体の先頭アドレスを指します。
すべてのフィールドにこの属性記述をしているので、これらが先頭アドレスに配置されることになります。
まさに共用体そのものですね。

この構造体に値を入れて表示すると以下のようになります。

■サンプル

■実行結果

共用体の実装が煩雑になるのが残念ですが、使う側は今まで通りの記述でできるので良いですね。

■参考サイト
方法: 属性を使用して C/C++ の共用体を作成する (C# および Visual Basic)
LayoutKind 列挙体 (System.Runtime.InteropServices)
アンマネージドコードとは 「アンマネージコード」 (unmanaged code): – IT用語辞典バイナリ

[Unity] キーコンフィグの動的変更についての考察

ゲーム制作でキーコンフィグをユーザ側から設定する機能を実装しようと思うようになりました。
たとえばメニューの決定ボタンや弾を発射するボタンの割り当てをゲーム内の設定画面から変更できるようにする機能です。

Unityの機能でこれらを実現できないかどうかを調べてみました。
結論から言うとそのような機能は無いです。
ただし、UnityEditor上から設定情報を取得することは可能です。

Unityのキーコンフィグに相当する設定は、メニューの「Edit」→「Project Settings」→「Input」から開かれるInputManager画面から行えます。

inputmanager

この設定情報は以下ファイルに格納されています。

 (Unityプロジェクトフォルダ)/ProjectSettings/InputManager.asset

したがって、上記ファイルをUnityEditor上から開いてテキストを読み込んで解析すれば設定情報を一通り取得できます。
取得したInputManagerの設定情報はエディタ拡張を使ってStreamingAssetsフォルダ配下に別ファイルとして保存しておけば、ゲーム中でも自由に設定情報を読み書きできるようになるはずです。
その場合、Unityで標準サポートされているInput系のAPIは使用できなくなり独自にラッパー用のAPIを実装して取得することとなります。

やや面倒な方法ですが、その辺については後日紹介できればと考えてます。

■参考サイト
入力マネージャ / Input Manager
入力 / Input

11月の目標

月初めということで今月の活動予定について記しておきます。

まず、先月の活動のまとめから。

 ・Departure from the VoidのWeb版制作
 ・ブログ更新

Departure from the Voidはゲームシステムの基本的な部分を実装しました。
そして、ゲームの肝であるステージ制作はまだ着手したばかりでそれほど進展ありません。
制作時間をあまり出来なかったこともあり、全体的にあまり進んでいません。

ブログ更新も同様です。
10月半ばに私生活方面で時間を確保できなかったこともあり、11記事のみの更新です…

そして、今月の目標。

 ・Departure from the Voidのステージ1完成・動画公開
 ・ブログ更新

10月とほぼ一緒です。
毎日取れる活動時間がせいぜい1~2時間程度なので、作業効率を上げる方法を模索しつつ制作を進められたらと考えています。
ブログも先月よりは多く更新したいです。
ほんの些細なことでも良いので、定期的に更新することを目指そうと思います。
Unityでゲーム制作をやっているので、Unity関連がメインとなるでしょう。

そんなこんなで今月もよろしくお願いいたします。