Monthly Archives: 1月 2015

[Unity][C#] XMLファイルとしてデータを保存する

ゲームで使用しているオブジェクトのデータをファイルに保存する方法のメモ書きです。

ファイルに保存する方法はいろいろありますが、C#に備わっているシリアライズ/デシリアライズの機能を用いると便利です。
.NET FrameworkにてXMLとしてシリアライズ/デシリアライズできるXmlSerializerクラスが用意されています。
今回はこれを用いてゲームデータの保存・読み出しを行ってみたいと思います。

シリアライズ/デシリアライズ

XmlSerializerを用いてシリアライズ/デシリアライズする処理は以下のようになります。

XmlSerializerはnewでインスタンス化することで使えるようになります。

XMLへのシリアライズはXmlSerializer.Serialize()により行います。

第1引数にシリアライズされたXMLデータを出力するストリーム、第2引数にシリアライズするデータを指定します。
ここで、dataのデータ型はシリアライズ可能な型でなければなりません。
構造体やArray、Listなどはシリアライズできますが、Dictionaryはシリアライズできません。

デシリアライズはXmlSerializer.Deserialize()により行います。

引数にはシリアライズされたXMLデータを受け取るストリームを指定します。
このメソッドを実行するとデシリアライズされたデータが返却されます。

使ってみる

実際にXMLにゲームデータを保存してみましょう。
構造体変数のデータをシリアライズ/デシリアライズする処理は以下のようになります。

Sキーでシリアライズ、Dキーでデシリアライズします。
シリアライズしたデータを開いてみると、以下のようにきちんとXML形式でデータが保存されていることが確認できます。

あらゆる型の変数に対応しているため、簡単なファイル保存用途にはこの方法で十分対応できるでしょう。

[Unity] WWWリクエストのタイムアウトを実装する

UnityのWWWクラスには元々タイムアウトの機能が実装されていません。
そこで、何とかして簡単にタイムアウト機能を実装して使えないかどうか考えました。

あまり良い方法が思いつきませんでしたが、以下のようにMonoBehabiourを継承したクラスを実装し、GameObjectにアタッチして使えばひとまずは実現できます。

上記スクリプトを任意のGameObjectにアタッチすると使えるようになります。
実際の使い方は以下のようになります。

タイムアウトになったときにはConnectionManager.isTimeOutがtrueとなります。
WWWにてサーバにリクエストを出すときは毎回ConnectionManager.Request()メソッドを呼び出すようにすればOKです。

理想を言うとWWWクラスを継承したいところですが、出来ないため上記のような方法を取るようにしています。
WWWクラスを直接利用せず、通信の管轄クラスを実装して使うようにするのが無難と言えそうです。

[Unity][LeapMotion] 付属のジェスチャーを試してみる

LeapMotionのAPIを用いてあらかじめ用意されているジェスチャーを行ってみたいと思います。
シーンの作成から実際にジェスチャーを検知するまでの手順をメモ書き程度にまとめました。

前提条件

LeapMotionSDKがUnity上で動くことが前提です。
上記を満たしていない場合、こちらにセットアップ手順を記しておりますのでご参照ください。

オブジェクトの配置

空のGameObjectを作成し、そこにHandControllerスクリプトをアタッチします。
手を表示したい場合はHandGraphicsModelにハンドモデルとなるプレハブを指定します。
ハンドモデルはAssets/LeapMotion/Prefabs/配下にあるHandModelsHumanとHandModelNohuman配下に格納されています。
例ではロボットの手の一種であるGlowRobotLeftHandを指定しました。

leapgesture-1

これで実際にゲームを起動すると、手が表示されます。
・・・と思いきや、手があまりにも小さく表示されたり表示されなかったりするかもしれません。
これはカメラの位置関係しています。
ここは自力で調整してやっとのこと表示されるようにする必要があります。

leapgesture-2

カメラワークの調整の末、何とか表示されるようになりました。

スクリプトの実装

オブジェクトの配置が出来たら次はジェスチャーを検知するスクリプトを作成します。
SDKではあらかじめ以下の4種類のジェスチャー検知が用意されています。

 ・円を描く
 ・キーをタップする(下に指を素早く振る)
 ・スクリーンをタップする(前に指を素早く振る)
 ・スワイプする

上記4種類を検知して結果を表示するスクリプトは以下のようになります。

これを配置したオブジェクトに適用します。

leapgesture-3

uGUIのTextに出力できるようにしているため、必要ならLabelにTextオブジェクトを指定してください。
これで実際に動かしてみた結果が以下です。

4種類同時に検知すると他のジェスチャーとバッティングしやすくなり、あまり精度がよくありません。
不要なジェスチャーを無効にしたりして対応する必要がありそうです。

[nginx] htmlファイルをphpファイルとして実行する

nginxはApache同様、デフォルトでは.htmlや.htmlを.phpとして動作させる設定にはなっていません。
しかし、設定ファイルの編集で.phpファイルとして動作させることが可能です。

設定手順

/etc/nginx/nginx.confファイルのserverブロック内に以下を記述します。

/etc/php-fpm.d/www.confファイルのsecurity.limit_extensionsを以下のように編集します。

上記ファイルを編集したら、nginxとphp-fpmを再起動します。

以上で.htmlと.htmファイルが.phpファイルとして動作するようになるはずです。

[Unity][LeapMotion] UnityでLeapMotionのサンプルを動かす

休日はずっとLeapMotionとOculusRiftDK2で遊んでばかりいた管理人です・・・
今日は動作報告程度にLeapMotionのセットアップからUnity上でサンプルを動かすところまでを書きたいと思います。

ドライバのインストール

LeapMotionのサイトにアクセスし、インストーラをダウンロードします。
Windowsの場合、「Windows Download」をクリックします。

ダウンロードが終了したらインストーラを実行してインストールを進めます。
基本的に「次へ」をクリックしていけばドライバのインストールが完了します。
インストールが完了したらLeapMotionをPCに接続します。
これでLeapMotionが使えるようになります。

SDKのダウンロード

Unityで開発するためのSDKをダウンロードします。
注意点としてはUnityの無料版とPro版では導入方法が異なることです。
導入の仕方は以下ページに集約されていますので、そちらにしたがって進めていけば問題ないでしょう。
https://developer.leapmotion.com/getting-started/unity

Unity Pro版でSDKを使う場合、こちらのSDKダウンロードページにアクセスし、「Download Unity Pro Asset v2.2.1.24116」をクリックしてSDKをダウンロードします。
(v以降の数字はバージョンによって変化します)

ダウンロードが完了したら、Unityの新規プロジェクトを作成し、上記でダウンロードした.unitypackageファイルをインポートします。
これでサンプルを動かす準備は完了です。

サンプルを動かしてみる

実際にサンプルシーンを起動してLeapMotionで遊んでみましょう。
サンプルシーンはAssets/LeapMotion/Scenes配下に集約されています。

今回は「AllHandModels」シーンを開いて起動してみます。

leapmotion-sample

お、動いた~!

他にもブロックをつかんだり花をつまんだりするサンプルがありますので、ぜひ試してみてください。

インストールから導入までは比較的簡単に出来ます。
ぜひUnityとLeapMotionで新しいデバイスライフを満喫してはいかがでしょうか。

[お知らせ] Webサイトの整備について

現在運用しているWebサイト「from the void」ですが、サイトデザインを改修したいと考えています。
主な理由はコンテンツが見づらい、ゲームをどんどん公開していくにつれてレイアウトが窮屈になってしまうことです。
今月は作業時間をあまり割けそうに無いため、来月か再来月以降に実施する予定です。

そのときは、サイトのメンテナンスが入る可能性がありますので何卒ご了承願います。
具体的な案は、ブログとWebサイトのデザインを統一させる、文字数を極力減らしてアイコンの比率を多くする、HTML5を使った動的な表示にする等です。
案が固まり次第少しずつデザインの作成を行っていきたいと思います。

また進展がありましたらお知らせいたします。

[Departure from the Void] ステージ1完成

Webサイトに公開中のWindowsゲームDeparture from the VoidのWeb版への移植作業の進捗です。
ステージ1の初めからボスまで一通り移植が終わりました。

以下のような感じに仕上がりました。

上記の動画は以前アップしたWindows版のものです。
移植後のゲーム動画を新たにアップしようかと思いましたが、動きは全く変わらないので以前の動画の使い回しとしました。

ステージ1が一通り終わったので次はステージ2の移植作業に移る予定です。
今月下旬は創作時間がなかなか取れそうにないので、2月以降に開始することになりそうです。

ステージ2は以下のような夕暮れの工場をモチーフにしたものとなっています。

こちらもWindows版のプレイ動画ですが、動きに若干の修正が入る予定です。
(公開済みのバージョンにはその修正が反映されています)

のんびりとしたペースでの作業となりそうですが、気長にお待ちくださいませ。

[Unity] Random.Range()を使う場合の注意点

UnityのRandom.Range()メソッドの使い方のメモ書きです。

Random.Range(min, max)は指定された範囲の乱数を返却するメソッドです。
min、maxにはそれぞれ乱数の取り得る最小値、最大値を指定します。

Random.Range()メソッドは以下2つにオーバーロードされています。

そして、戻り値の取り得る範囲はそれぞれ以下のようになっています。

public static float Range(float min, float max);
 →範囲はmin≦戻り値≦max

public static int Range(int min, int max);
 →範囲はmin≦戻り値<max

2つ目のint型のほうは最大値maxを含まないことに注意です。
すなわち、0~10のいずれかの整数を取得したい場合はRandom.Range(0, 11)としなければなりません。
公式ドキュメントにも記載されていますが、オーバーロードによって最大値を含んだり含まなかったりする点に注意が必要です。

■参考サイト
Unity – Scripting API: Random.Range

[Unity] レーザー距離計を作ってみた

今回はUnityのネタ的なTipsです。

物体との距離を測る距離計を実装してみました。
Unityで自律移動ロボットのシミュレータを作りたいと思ったのがきっかけです。

実装方針

ある点から物体までの距離はRaycastにより計算できます。
自分の位置、計測方向のベクトルを指定すれば距離を取得できます。
物体にはあらかじめコライダーを設定しておく必要があります。
より正確な距離を計測する場合はMeshColliderが良いでしょう。

また、距離計測には直結しないがレーザーっぽく見せるために計測方向に照射するSpotLightを設置することにします。

作ってみる

毎フレームごとに前方の物体との距離計算を行うスクリプトを実装します。
今回は以下のようなスクリプトを実装してみました。

transform.TransformDirection(Vector3.forward)がGameObjectの前方を表すベクトルです。
Vector3.forwardは(0,0,1)のローカル座標系における前方ベクトルです。
これをワールド座標系に変換するためにTransformDirection()メソッドを使っています。

Physics.Raycast(transform.position, fwd, out hit, maxDistance)でRaycastを飛ばして距離計算を行っています。
引数にはそれぞれ計測位置、向きベクトル、Raycastのヒット情報、計測可能範囲の距離を指定します。
物体にRaycastが当たればtrueが返り、hit.distanceに計測距離が格納されます。

上記スクリプトを距離計としたいGameObjectにアタッチします。
MaxDistanceには測定可能な最大距離を指定します。

同時に、Lightもアタッチします。
LightのTypeをSpot、SpotAngleを1、ColorをRGB=(255,0,0)、Intensityを8にすればレーザーっぽいライトが出来ます。

distance-sensor

ひとまずこれでレーザー距離計は完成です。
これを操作可能なプレイヤーに持たせて動かすと以下のように距離が測定できます。

需要があるかどうか分かりませんが、こんなことも出来るという紹介でした。

[Unity] イメージエフェクトを使ってみる

Unity Pro専用の標準アセットであるイメージエフェクトの使い方の紹介です。
ゲーム画面全体に写真加工ソフトのような演出を与えたい場合に便利です。
 

前準備

イメージエフェクトはアセットなので使う前にプロジェクトにインポートする必要があります。
プロジェクト作成時に「Image Effects(Pro Only).inityPackege」を選択するか、メニューの「Assets」→「Import Package」→「Image Effects(Pro Only)」を選択してインポートを行います。

imageeffect-import1
imageeffect-import2

これで準備完了です。
 

使ってみる

画面をモノクロにするエフェクト「グレースケール / Grayscale」を適用してみたいと思います。
適用したいカメラがアタッチされているGameObjectにスクリプトGrayscaleを追加します。

imageeffect-grayscale1

ここで、カメラはRenderTextureが指定されていなくても構いません。
例ではメインカメラに設定しています。

これで以下のように画面全体がモノクロになるのが確認できます。

imageeffect-grayscale2

イメージエフェクトは他にも色々あります。
リファレンスマニュアルにエフェクトの一覧が載っています。
例えば、ブルーム / Bloomを使えば光が溢れ出るような効果を演出できます。

imageeffect_bloom

エッジ検出エフェクト 法線マップ / Edge Detect Effect Normalsを使えば漫画のような演出も可能です。

imageeffect_edge

他にもまだまだありますので、リファレンスマニュアルよりお好みのエフェクトをみつけて使ってください。
エフェクトは複数組み合わせることも可能です。

3Dのゲーム画面に対して質感を出したり、雰囲気を一転させる画面全体演出が出来たりと非常に便利な機能なので紹介させていただきました。