この記事では同期方法の1つであるRPC(リモートプロシージャーコール)について説明いたします。
RPC(リモートプロシージャ―コール)とは
難しい説明でも良い方はどうぞ以下のリンクからPhoton公式文書ページを読んでください。
とても簡単に言うと、RPCとは、あるクライアントが他の(または全ての)クライアント上で呼び出せる関数のようなイメージです。
例えば、ある一人のプレイヤーがオンラインゲームで攻撃をすると、他のプレイヤーからもそのプレイヤーが攻撃をしているように見える必要があります。また、あるプレイヤーが倒れた時には同じように、ほかのプレイヤーから倒れているように見える必要があります。
このようにある一人のプレイヤーがある関数を実行したときに、すべてのクライアント上でもそのプレイヤーが同じ関数を実行している必要があります。
RPCの呼び出し構文
RPCの呼び出し構文は以下の通りです。
PhotonView.RPC("実行する関数名" , 実行させる対象のPhotonPlayer [, 引数1 , 引数2 ...] );
構文の説明
まず同期したいオブジェクトにはPhotonViewが必要です。
同期したい関数があるオブジェクトにはPhotonViewをAdd Componentしましょう。
実行する関数名は文字列で指定してください。
実行させる対象はPhotonPlayerで特定のプレイヤーを指定できます。
またPhotonTargetsという方法を用いて複数のプレイヤーを実行させる対象にすることもできます。
PhotonTargetsについては以下のページでうら干物書き様がわかりやすく解説してくださっています。
ちなみに私がPhotonTargetsでよく使うのは以下の3つです。
-
PhotonTargets.All
→RPC呼出側のクライアントでは先に実行し、他のプレイヤーはサーバ経由で呼び出されるため、少し遅れて実行される。 -
PhotonTargets.AllViaServer
→RPC呼出側のクライアントも他のプレイヤーもサーバ経由で呼び出されるためほぼ同時に実行される。 -
PhotonTargets.MasterClient
→MasterClientでのみ実行される。
引数(必要無い場合は無くても良い)
必要に応じてRPC呼出側から実行側に引数を引き渡すことができます。
しかし引数に指定出来る型と出来ない型がありますので注意してください。
詳しくは以下のページのQiitaにてbokkuri_orz様が説明してくださっています。
RPCで呼び出される関数
RPCとして呼び出したい関数の前には[PunRPC]と記述しておく必要があります。
[PunRPC]と記述された後の関数はRPCとして呼び出される関数として認識されるようになります。
RPC使用例
以下はChapter10のCharacterControlScript.csの攻撃時に実行される処理です。
ボールの生成をRPCを用いて行っています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//ボール攻撃
void AttackControl()
{
if (Input.GetButtonDown("Fire1"))
{
//攻撃ロック開始
AttackLock = true;
StartCoroutine(_ballattack(1f));
}
}
IEnumerator _ballattack(float pausetime)
{
//RPCでボール生成
myPV.RPC("BallInst", PhotonTargets.AllViaServer, transform.position + transform.up, transform.rotation);
//攻撃硬直のためpausetimeだけ待つ
yield return new WaitForSeconds(pausetime);
//攻撃ロック解除
AttackLock = false;
}
[PunRPC]//ボール生成
void BallInst(Vector3 instpos, Quaternion instrot, PhotonMessageInfo info)
{
//ボールを生成
GameObject Ball = Instantiate(BallPrefab, instpos, instrot) as GameObject;
Ball.GetComponent<BallManageScript>().Attacker = info.sender; //ボールに自分のPhotonPlayer情報を乗せる
}
|
自プレイヤーが攻撃した際には全てのクライアントPC上でボールの生成を実行する必要があるので、"BallInst関数"をRPCとして定義しています。
また、球のPrefabを生成する位置と方向を引数として渡しています。