Skip to content

201 1 PhotonEngineとは

miuccie miurror edited this page Jan 17, 2020 · 24 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サービスを使用することでサーバー側ロジックは一切書かずとも、標準的なオンラインゲームを制作可能
  • 2018年8月よりVer2への移行が始まっているが、基本的な設計はVer1を踏襲している

2018年8月のVer2のリリースに伴い、以降の講義内容をPUN2に対応させました(2019年1月)。PUN1とは互換性がないことに注意してください。 PUN1のソースコードを参考にしたい場合は、masterリポジトリのPUN1タグのコミットを取得してください


PUNのインストール方法

PUN1: https://www.assetstore.unity3d.com/jp/#!/content/1786
PUN2: https://assetstore.unity.com/packages/tools/network/pun-2-free-119922
(2018年8月にPUN2がリリースされました)

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

PUN1 参考資料

PUN1 - チュートリアル
https://doc.photonengine.com/ja-jp/pun/v1/getting-started/pun-intro https://doc.photonengine.com/ja-jp/pun/current/demos-and-tutorials/pun-basics-tutorial/intro

PUN1 - APIリファレンス
https://photonengine.jp/pun-api/annotated.html

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

PUN2 参考資料

2018年8月にPUN2がリリースされました。主な変更点は下記です。

・ 各種プロパティ名が、PascalCase形式に変更
・ パッケージが、Photon.PunとPhoton.Realtimeの2つに変更
・ Photon.PunBehaviourが、MonoBehaviourPunとMonoBehaviourPunCallbacksに変更
・ MonoBehaviourPunCallbacksに含まれないコールバックがインタフェース形式に変更

PUN2 - 主な変更点
https://doc.photonengine.com/ja-jp/pun/v2/getting-started/migration-notes
https://doc.photonengine.com/en-us/pun/v2/getting-started/migration-notes#callbacks_changes

PUN2 - チュートリアル
https://doc.photonengine.com/ja-jp/pun/v2/getting-started/pun-intro https://doc.photonengine.com/ja-jp/pun/v2/demos-and-tutorials/pun-basics-tutorial/intro

PUN2 - APIリファレンス
https://doc-api.photonengine.com/en/pun/v2/annotated.html


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

まずは今後のマルチプレーヤー実装の雛形となる下記のシーンを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);
	}
}