-
Notifications
You must be signed in to change notification settings - Fork 18
201 1 PhotonEngineとは
現在、多人数で会話を楽しむソーシャルVRアプリや、VR空間上で共同作業を行う建築設計ツールなど、ネットワークを介して同一のVR空間を共有する機能を持ったアプリが数多く出てきています。
この章では、Unityでのリアルタイム同期アプリ開発のスタンダードとなっているPhotonEngineを使用した、複数人での同一空間の共有とリアルタイムのデータ同期の実装方法を解説します。
https://www.photonengine.com/en-US/Photon
- マルチプレイヤーアプリにおけるリアルタイム同期処理の提供に特化したゲームエンジン
- サーバー側はオンプレミス版とクラウドホスティング版がある / OSはWindowsサーバーのみ
- クラウド版サーバーを使用することで、端末クライアント間のNAT超えなどを気にしなくてもマルチオンライン機能を実現可能
- Unity用にポートされた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タグのコミットを取得してください
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 - チュートリアル
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
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);
}
}