「xRもくもく会 vol.01」に参加しました

HoloMagiciansさん主催の初のもくもくイベント?「xRもくもく会 vol.01」に参加しました。

## xRもくもく会vol.01 一人で自宅作業するのもよいですが、たまには他の開発者の方と同じ場で、 時には談笑しながら開発出来たら素敵だと思いませんか? xRもくもく会では、xR関連でもくもくしたい方を大募集中です! 是非ご参加ください! ## ■イベント概要 日時: 2017/11/25(土) ...
もくもく会のいいところは、その時間集中して開発ができることと、他の参加者の皆さんの進捗が聞けたり、成果物を見せてもらったりできるところです。
今回もHoloLensの先進的なコラボレーションツール(まさにCollaborative Computing)や、Holoなのに没入感のある迷路アプリなどを体験させてもらい、とても刺激になりました。
自分は今回はHoloLensではなく、作成中だったARアプリを進めました。
もくもく会の最後に進捗報告させてもらいましたが、作成中のARアプリは、
・Vuforiaを使って、アナログゲームの素材(カードやサイコロなど)を読み取り進行する
・1対1の対戦をインターネット越し(ローカルネットワークではなく)で行う(アプリストア前提)
というのをコンセプトに作っています。

まずVuforiaについては、マーカーを認識してオブジェクトを出現させるだけならノーコーディングでできます。今回は、認識したマーカーによって出現したオブジェクトをタップすることにより、マーカー(オブジェクト)毎に別の動きにしたいと思いました
ImageTargetの子オブジェクト(マーカーを認識すると表示されるオブジェクト)にColliderをつけておいて、そこから親であるImageTargetのオブジェクトを判別します。
スマホのタップのスクリーン座標からワールド座標に変換してRaycastし、hitのColliderを取る、というよくある流れになります。(HoloLensならCamera.mainからのRay、またはGazeManagerを使用)

var phase = GodTouch.GetPhase ();
if (phase == GodPhase.Began)
{
	Vector3 touchPosScreen = GodTouch.GetPosition ();
	Ray ray = Camera.main.ScreenPointToRay (touchPosScreen);
	RaycastHit hit;
	if (Physics.Raycast (ray.origin,ray.direction, out hit,Mathf.Infinity)) {
		GameObject target = hit.collider.gameObject;
		print ("Parent(ImageTarget):" + hit.collider.transform.parent.gameObject.name);
	}
}

※デバッグをしやすくするため、GodTouch(Input.TouchesとInput.Mouseをラッピングしてくれる便利なアセット)を使用しています。

また、通信対戦部分では、ニフティクラウド Mobile Backend(NCMB)を使用しています。
一般的なREST APIなので、UNETのようなリアルタイム同期はできませんが、今回はターン制のゲームということで、ステータスを管理するデータストアを5秒に1回ポーリングする仕組みにしてみました。ただNCMBはプランによってAPI呼び出し数に制限があるので、実際にアプリストアに出す場合はいろいろと考えなければいけないですね。
ポーリングの仕組みとしては、NCMBObjectを変数にキャッシュしておき、コルーチンでNCMBObjectをリロードするという単純なものです。

IEnumerator WaitForMyTurn()
{
	while (true) {
		print ("WaitForMyTurn");
		yield return new WaitForSeconds (5);
		yield return ReloadObject (hogeDataStoreObject);
		myTurn = (int)System.Convert.ToInt64 (hogeDataStoreObject [NCMBDataStoreKey.MYTURN]) == 1;
	}
}
public IEnumerator ReloadObject(NCMBObject obj)
{
	bool isConnecting = true;
	obj.FetchAsync ((NCMBException e) => {
		if (e != null) {
			print ("FetchAsync Error:" + e.Message);
		}
		isConnecting = false;
	});
	while (isConnecting) {
		yield return null;
	}
}

ひとまずプロトタイプとしての形はできたので(もくもく会すごい!)、足りないゲーム性を追加しつつ形にしていきたいと思います。
本当はARKitも使いたかったのですが、VuforiaとARKitを同時に使用するのは現状では難易度が高そうなのと、Androidにも対応させたいため、ひとまずは見送る方針です(ARハッカソンのネタになるかと思ったんですが残念・・)
ということで、とても有意義な「もくもく会」でした。主催者・スタッフの皆様ありがとうございました。
(家庭の事情で早く帰ってしまい、片付けに参加できなくて申し訳ありません)

スポンサーリンク

シェアする

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

フォローする

スポンサーリンク