第 4 章 システムの概要 23
4.2 システム全体の構成
4.2.2 クライアント側アプリケーション
Unity Mobile Streamingサーバ化されたアプリケーションを遊ぶためには専用の クライアントアプリを用いる.このアプリはサーバのIPアドレスとポートを指定し 接続する(図4.9)ことで,そのサーバで稼働しているアプリケーションを遊ぶ(図
図 4.10: Unity Mobile Streamingクライアントアプリのゲーム画面
4.10)ことが出来る.クライアントアプリ自体は操作入力情報のサーバへの送信と,
サーバから送られてきた映像の描画しか行わないため,1つのクライアントアプリで Unity Mobile Streamingサーバ化されたアプリケーションは全て遊ぶことが出来る.
Unity Mobile Streamingの動作を図4.11に示す.クライアントアプリは初期画面 で接続先サーバのIPアドレスとポート番号を指定する.接続ボタンが押されると ゲーム画面へ遷移し,サーバとの接続をリクエストする.この時,接続に失敗した 場合は再び初期画面へ戻る.ゲーム画面では,メインスレッドで画面の描画とセン サ値やタッチ情報の取得を行い,通信はそれぞれ専用のスレッドで非同期的に行う.
操作入力情報を送信するスレッドでは,UDPによるソケット通信を用いて定期的に サーバに各種センサ値とタッチ情報をバイナリ列に変換し送信する.画面情報の通 信を行うスレッドでは,まずTCPによる接続をサーバと確立する.接続を確立した 後は,クライアントとサーバでヘッダ情報をやりとりしたのちサーバから画像を受 信,を繰り返し行う.ヘッダ情報は受信する画像の解像度,およびファイルサイズ が含まれた16バイトのバイナリ列である.画像はpng形式の静止画としてエンコー ドされたデータで送られてくるため,受信したバッファをそのまま描画する事で画 面の表示ができる.ゲーム画面は元のアスペクト比を維持して表示するか端末側に 合わせてフルスクリーンで表示するかが選べる.
Javaによる実装
まず,クライアントアプリをJavaとAndroidSDKによってAndroidアプリとし て実装した(図4.12).アプリそのものの動作が軽快である点,画像をソケットの ストリームから直接ビットマップとして描画可能でありメモリ効率が優れているな どの利点がある.しかし,取得できるセンサ値の形式やタッチ情報の扱いがUnity 内で取得する場合と異なるためUnityの形式に合わせて変換が必要であり,それら
図 4.11: Unity Mobile Streamingの動作フローチャート
図 4.12: JavaによるUnity Mobile Streamingクライアントアプリ
の入力情報を扱う際にゲーム開発者が通常のUnityアプリケーションと同じように は使用出来ないという問題があった.
Unityによる実装
そこで,クライアントアプリ自体もUnityによって実装を行い,Androidアプリと してビルドした(図4.9,図4.10).Unityで実装しているため,センサ値やタッチ情 報の変換は必要なく,そのまま値を送信すれば良いという利点がある.Javaでの実 装と比較すると,画像を表示する際に,一度バッファに保持してからテクスチャを 生成・描画するためメモリ効率は落ちてしまうが,実行速度に大きな差は見られな かった.ここで,Unityスクリプトでソケット通信を行う場合.NETフレームワーク のソケット通信を使うことになるが,この機能をAndroid向けにビルドして使う場 合,UnityProライセンスおよびUnity Android Proライセンスが必要になる.その ため,ソケット通信部分だけJavaコードのAndroidプラグインとして実装し,Unity から外部Javaコード呼び出し機能を使って通信を行わせた.しかし,外部呼び出し にはその度に1フレームの遅延が発生するため,通信の遅延がJavaでの実装よりも 大きくなってしまう問題がある.この問題はUnityPro環境での開発なら容易に解決 できると考えられる.
Windowsタブレット向けクライアントアプリ
Unityで実装したクライアントアプリはAndroidプラグイン部分を除き,他はそ
のままでマルチプラットフォームに対応できる.そこで,OSにWindows8.1を搭載 したタブレット端末向けのクライアントアプリの開発も行った(図4.13).Windows のスタンドアローンアプリケーションであれば.NETフレームワークのソケット通
図 4.13: Windows8.1向けUnity Mobile Streamingクライアントアプリ
信が利用できるため,通信部分をAndroidプラグインからUnityスクリプトでの実 装に書き換えた.しかし,現時点のUnity4ではWindows8.1タブレットのタッチ入 力やセンサ情報を取得することが出来なかったため,操作入力が出来ずクライアン トアプリとしては動作しなかった.この問題は,将来的にUnityのアップデートに よって解決する可能性がある.