2013年12月05日

iOS GameKit Local Multiplayerの使い方

今回3D野球盤DXの通信対戦を実装するにあたり、AssetStoreのprime[31]のiOS GameKit Local Multiplayerを購入しました。
評価も何も無いので若干不安でしたが、基本的な使い方がわかったので備忘録としてこのエントリを残しておきます。
とにかくネット上にはUnityでのBluetooth通信を扱った情報がなかったので役に立てばと思います。
comm0.png

ファイル構成は以下の通りです。
comm1.png

使用するのはGameKitManager.csとGameKitBinding.csです。
これはPluginsに入っているので、特に宣言することなく呼び出せます。

[何が出来るの?]
WiFiまたはBlueToothを使った通信プレイが可能になります。1対多の接続にも対応しています。
GameCenter経由の対戦にも対応しているようです。またボイスチャットの機能もあります。
送受信できるデータは、String型、またはbyte[]型のようです。Float等のやりとりをする場合は一度Stringに変換して送信する方法になりそうです。

大まかな流れとしては、
(1)Start()等の最初に動くスクリプト内で、割り込みイベント(接続、切断等)を定義する。
(2)任意の地点でGameKitBinding.showPeerPickerを使ってピアピッカーを表示、接続を行う。
(3)Update()等のループ内で送信イベントを発生させる。
(4)任意のメソッドを用意してデータを受信する。
(5)必要がなくなったら切断する。


こんな感じです。


[実装方法]
<割り込みイベント>
例えば接続が成立した時に特定のメソッドを呼び出したい場合

    GameKitManager.peerConnectedEvent += onPeerConnected;

これで接続が完了した時にonPeerConnected()が呼び出されます。
なお、アプリケーション終了時などには、

    GameKitManager.peerConnectedEvent -= onPeerConnected;

以上のようにメソッドを開放します。


<ピアピッカーの表示>
ピアピッカーとは接続相手を表示させ、どの端末と接続させるかどうかを選択するダイアログです。
iOS6とiOS7ではかなり表示が違います(どう見てもiOS6の方が見やすいw)

    GameKitBinding.showPeerPicker( true );

trueとfalseですが、trueだとWiFiとBluetoothを表示し、falseだとBluetoothの接続を即時で行います。
呼び出しの方法は以上の1行を書くだけです。カンタンです。


<現在が接続状態か否かを判定する方法>
通信プレイで重要となるオンライン状態を調べる方法ですが、以下のとおりです。

    GameKitManager.isConnected()

これでbool値が返ってきます。もちろん接続時がtrueです。


<データ送信>
データ送信方法は以下のとおりです。

    GameKitBinding.sendData( "相手のGameObjectのname", "相手のGameObject内のメソッド名", string型データ, 必着オプション(bool));

相手のGameObjectのnameは、どのゲームオブジェクトに対してデータを送信するかです。
相手のGameObject内のメソッド名は送信した相手のゲームオブジェクトにアタッチされているスクリプト内のメソッド名です。
この処理が到達するとそのメソッドが割り込みで処理されます。
必着オプションの効果は良く分からないのですが、投げっぱなしか確認できるまで停止するかどうかみたいなオプションだと思います(適当)

<データの受信>
データ受信はデータ送信の項目にあるように、予め受信用のメソッドを用意しておくだけとなります。例えば

    void DataReceive(string rdata){

のような形です。

<切断>
切断というよりは確立している接続セッションを破棄するイメージとなります。

    GameKitBinding.invalidateSession();

基本これだけの処理がわかっていればBluetoothの通信はできると思います。
GameCenterを使った通信プレイはまだ調べてないのでよくわかりませんw
posted by iworks2013 at 01:01| Comment(0) | Unity