201 1 PhotonEngineとは

miuccie miurror edited this page Jan 6, 2018 · 6 revisions

VRStudies 第二章 - 空間の共有を実装してみよう


現在、多人数で会話を楽しむソーシャルVRアプリや、VR空間上で共同作業を行う建築設計ツールなど、ネットワークを介して同一のVR空間を共有する機能を持ったアプリが数多く出てきています。

この章では、Unityでのリアルタイム同期アプリ開発のスタンダードとなっているPhotonEngineを使用した、複数人での同一空間の共有とリアルタイムのデータ同期の実装方法を解説します。

201-1 - PhotonEngineとは


Photon Engineとは?

https://www.photonengine.com/en-US/Photon

  • マルチプレイヤーアプリにおけるリアルタイム同期処理の提供に特化したゲームエンジン
  • サーバー側はオンプレミス版とクラウドホスティング版がある / OSはWindowsサーバーのみ
  • クラウド版サーバーを使用することで、端末クライアント間のNAT超えなどを気にしなくてもマルチオンラインを実現可能
  • Unity用にポートされたPUNというアセットが存在する

Photon Unity Network (PUN)とは?

https://www.photonengine.com/en/PUN

  • Photon Realtime EngineをUnity用にポートしたもの
  • Unityの標準ライブラリである、UnityNetwork/UNETを模倣した作りになっている
  • PhotonCloudサービスを使用することでサーバー側ロジックは一切書かずとも、標準的なオンラインゲームを制作可能

PUNのインストール方法

https://www.assetstore.unity3d.com/jp/#!/content/1786

  • UnityAssetストアにて、PUNで検索してインポートする
  • PUN+という有料版も存在しているので注意
  • PUN無料版では同時接続数が20人までサーバー側の費用もかからずお試しが可能
  • 以前は無料版ではモバイルへのビルドができない制限があったが、現在は解除されている

PUN 参考資料

PUN - チュートリアル
https://doc.photonengine.com/ja-jp/pun/current/tutorials/tutorial-marco-polo https://doc.photonengine.com/ja-jp/pun/current/manuals-and-demos/synchronization-and-state

PUN - クラスリファレンス
https://photonengine.jp/pun-api/group__public_api.html#gab84b274b6aa3b3a3d7810361da16170f https://photonengine.jp/pun-api/annotated.html

PUN - サポートしている型
https://doc.photonengine.com/ja-jp/realtime/current/reference/serialization-in-photon


テンプレートシーンの確認

まずは今後のマルチプレーヤー実装の雛形となる下記のシーンをUnityで開いてください。
https://github.com/yumemi-inc/vr-studies/tree/master/vol2/VR-studies/Assets/VR-studies/0_SinglePlayer/SinglePlayer.unity

シーンを開いたら、そのまま実行してみて、その動作と構成を確認してください。
このシーンは、キューブで表現したプレイヤーのアバターを、キーボードの矢印キーで移動できるだけのシンプルなものになっています。

ここにPhotonを使用したマルチプレーヤー対応を実装していきたいと思います。

[ SinglePlayerシーンのオブジェクトの構成 ]

-Stage
  -Player
    -Camera - 自身のアバターに追従するカメラオブジェクト
      -Main Camera
    -Avatar - 自身のアバターを表現するオブジェクト
      -NameUI
- Light
- Floor - ルームの床を表現するオブジェクト
[ SinglePlayerシーンのスクリプトの構成 ]

Player.cs - Playerオブジェクトにアタッチして、アバターとカメラの関係を記述します
Avatar.cs - Avatarオブジェクトにアタッチして、アバターの処理を記述します

// Player.cs

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

	void Start () {

		// カメラをアバターの子にして追従させる
		GameObject avatar = transform.FindChild("Avatar").gameObject;
		GameObject camera = transform.FindChild("Camera").gameObject;
		camera.transform.parent = avatar.transform;
	}
}
// Avatar.cs

using UnityEngine;
using System.Collections;

public class Avatar : MonoBehaviour {

	//------------------------------------------------------------------------------------------------------------------------------//
	void Update () {

		// キーボード入力による移動処理
		var v = Input.GetAxis ("Vertical");
		Vector3 velocity = new Vector3 (0, 0, v);
		velocity = transform.TransformDirection (velocity);
		velocity *= 5f;
		transform.localPosition += velocity * Time.fixedDeltaTime;

		// キーボード入力による回転処理
		var h = Input.GetAxis ("Horizontal");
		transform.Rotate (0, h * 3f, 0);
	}
}
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.