Skip to content

リアルタイム同期

アバターの位置やアニメーションをリアルタイムに同期することで、プラットフォームにまたがる複数人同時参加型の体験を構築できます。

photon の利用

マルチプレイヤープラットフォーム photon との連携する方法を、デモを参照しながら説明します。アバタープレハブに photon のコンポーネントを割り当てることで、photon を使った一般的なリアルタイム同期を実装できます。このページでは、photon の一般的な説明は割愛します。

デモ

photon をインポートした後、 Assets > AvatarPlay Demo Photon > 01. Photon Demo > Scenes 以下のシーンを実行してください。見た目は単純なアバターロードですが、photon を通してリアルタイム同期された状態となっています。

Info

photon のデモは基本のSDKパッケージに含まれていません。Avatar Play 担当者から別途入手してください。

実装

アバタープレハブの設定

アバターは動的にインスタンス化します。アバタープレハブを Resources 以下にコピーし、photon のコンポーネントを割り当てています。

Photon Avatar

デモでは、位置/回転/スケール/アニメーションを同期するよう設定しています。

GameController.cs

各クライアントで実行される、ゲームロジックの実装です。photon の設定時に、アバターIDがリアルタイム同期するクライアント間で共有されるよう、プレイヤーのカスタムプロパティに設定しておきます。

// アバターIDの設定
var customProps = new ExitGames.Client.Photon.Hashtable ();
customProps.Add ("avatarID", AvatarSDK.avatarID);
PhotonNetwork.player.SetCustomProperties (customProps);

クライアントがルームに入室すると OnJoinedRoom メソッドが呼ばれますので、そこでクライアント自身のアバターをインスタンス化します。このインスタンス化処理は、ルームに接続している各クライアントで実行されます。

// Photonアバターのインスタンス化
var myAvatar = PhotonNetwork.Instantiate ("PhotonAvatar", Vector3.zero, Quaternion.identity, 0);

Avatar.cs

個々のアバターでの実装です。リアルタイム同期の対象となるオブジェクトであるため、 Photon.MonoBehaviour を継承したスクリプトに実装します。アバターがインスタンス化された後、クライアントのアバターIDでコーデをロードします。

public class PhotonAvatar : Photon.MonoBehaviour
{
    void Start()
    {
        var avatarID = (long)photonView.owner.CustomProperties ["avatarID"];
        var avatarCoordinator = GetComponent<AvatarCoordinator> ();
        StartCoroutine(avatarCoordinator.LoadByAvatarIDAsync (avatarID));
    }
}

同期の確認

複数の端末が必要となるため、Unityエディタ上でデモを通して確認することは難しいです。複数の実機に配備するなどして確認してみてください。

ルーム内コーデ

リアルタイム通信におけるルームなど、一時的な空間内でのみ有効となるコーデ(以後、ルーム内コーデ)を作成可能です。ルーム内コーデは自社アプリ側で着せ替え処理できるため、例えばシーン内にスピードアップ効果を持つ服アイテムを配置し、それを取得し着用したユーザは移動スピードがアップする、といった体験を実現できます。

In Room Coord

Room.cs

スクリプト Room.cs にはルーム内コーデを作成・更新する API が収録されています。リアルタイム通信の API と同じように利用する想定で設計されています。

// ルームの作成と入室
// PhotonNetwork.JoinOrCreateRoom と同じタイミングで呼ぶ想定。ルーム名も合わせると良い。
yield return Room.JoinOrCreate("myRoom");

// アイテムIDを渡して、ルーム内アイテムを変更する
yield return Room.SetItem("myRoom", itemID);

// ルーム内コーデをメインコーデに戻す
yield return Room.ResetCoord("myRoom");

// ルームを退室する
// PhotonNetwork.LeaveRoom と同じタイミングで呼ぶ想定。
yield return Room.Leave("myRoom");

Info

自社アプリ内で利用可能なアイテムは、Avatar Play 担当者に確認してください。

デモ

Assets > AvatarPlay Demo > 07. In Room Coordination Demo > Scenes 以下のシーンを実行してください。アバターを十字キーで操作し、アバターが触れた服アイテムに着替えます。中央のキューブに触れると、メインアバターに戻ります。

ルーム内コーデの有効期限

ルームは作成から一定期間経過すると削除されます。作成から1時間以上経過したルームの利用は避けるようお願いします。