如雨露の日記

学んだことを書いていくサイトです。もし誤りがあれば指摘していただけると嬉しいです。

Photon Unity Networking 1.5 を試してみる

Unityでネットワークを簡単に実装する方法としてPhotonがよく使われています。

ネットワーク処理を殆ど書かずにリアルタイム通信ゲームが作れる優れものです。

ただ、色々なサイトでPhotonの記事が書かれているのですが、1.5の記事をあまり見かけなかったので自分で作ってみることにしました。

まずはPhoton Unity NetworkingをダウンロードしてUnityにインポート。

次にシーンを新しく作成して、空のゲームオブジェクトを作成してオブジェクト名をNetworkManagerにしてください。

Scriptフォルダを作成しNetworkManager.csを作成、開いてください。

さて、このNetworkManagerにはオンライン対戦でよく使われるルームの作成、ルームへの入場等を行ってもらいます。

 このスクリプトのPlayerMake()でプレイヤーとなるゲームオブジェクトをInstantiateします。このオブジェクトは相手側にも生成しないといけないのでPhotonNetwork.Instantiate()で生成をしましょう。このスクリプトNetworkManagerにアタッチしてください。

その後にProjectのなかにResourcesフォルダを作成、その中にPrefabを作成し名前をsampleCubeにします。

HierarchyからCubeを作成したらsampleCubeにprefabとして保存してCubeを削除。

Resources/sampleCubeを選択し以下の様にスクリプトとRigidbodyをアタッチ

・Photon VIew ・・・ Observed Componentsに監視するスクリプトを指定する。同期処理が書かれているスクリプトは全てここに。

・Photon Transform View ・・・ アタッチされているゲームオブジェクトのPosition、Rotation、Scaleの同期はこれ1つで大丈夫。

f:id:ninataka_japan:20150702234510j:plain

中身はこのように設定しています。

f:id:ninataka_japan:20150702235221j:plain

 

Synchronize Positionの設定

・Enable teleport for greater distances 同期が一定値以上ずれた場合オブジェクトをテレポートして位置を強制的に変更するか。

・Teleport if distance greater than その値以上同期がずれたらテレポートします。

・Interpolate Option(オブジェクト補間) 補完オプション。設定しないことはないと思う。

  1.  Disable(無効) これを設定することはほとんどないはず。
  2. Fixed Speed(固定速度) 固定されたスピードで動くオブジェクトならこれ。
  3. Estimated Speed(推定速度) 現在の座標と直前の座標から速度を割り出して移動させる。ゆっくり移動するものならこれ。
  4. Synchronize Value(値を使って同期) スクリプトで直接値を設定して同期する。一番スムーズ、けどデータ量増える。
  5. Lerp(線形補完) お手軽に使えるLerp。とりあえず動かしたいときはこれ。

・Extrapolate Option(オブジェクト補外) 補外オプション。過去のデータから現在どこにいるのか推測する。あくまでも推定。

・Draw synchronize position error(同期位置誤差の表示) Sceneに座標が表示される。

 

Synchronize Rotation/Scaleの設定

・Disabled(無効)  新しい値を受信したらオブジェクトに適用

・RotateTowards/MoveTowards オブジェクトがターゲットに向かって回転/スケールする。

・Lerp オブジェクトを指定値に向かって回転/スケールするらしい。

説明は以上です。

今回はLerpで行ってみましょう。

画像のように設定すれば大丈夫かと思います。Photon Viewにのbserved ComponentsにPhoton Transform Viewの設定をするのを忘れずに。

あとは適当にオブジェクトを移動する処理でも書いてsampleCubeにアタッチしてください。こんな感じで。

あとはビルドしてみて同期されるかどうか確認してください。Lerpで移動同期しているので滑らかではありますが、少し反映が遅れているはずです。

次回はSynchronize Valueの方法を試してみようかな。

若干疲れているので書き間違えていたりしたらすみません。