ページ

2014年1月7日火曜日

実際にPhotonCloudを使ってみる~基本編④~

第一回
第二回
第三回

新年あけましておめでとうございます。
本年もどうぞよろしくお付き合い下さい。

それでは、第四回とまいりましょう。

今回は前回スルーしたRPCについてご紹介します。
今回はRPCを用いて、ゲーム内のスコアを同期してみようと思います。

まずは環境づくりから。
GUI Textを追加し、こんな感じに設定します。
ついでに平行光源を追加してオブジェクトを見やすくしました。



スフィア(でも何でもいい)を追加し、適当に配置します。
わかりやすくするために色をつけてみました。



プレイヤーがターゲット(赤い玉)にぶつかると、スコアが1ずつ加算されていき、
それがGUI Textに表示される、というゲームにしたいと思います。
ゲームとして成立していないのはご愛嬌です。

処理として必要になるものは、以下の3つになります。

①衝突判定
②RPCを呼び出す
③呼び出されたRPCがスコアを加算

①について
これはPhotonCloudと関係がないので、さくっと作ります。
moveTarget.csに以下のように追記します。

「moveTarget.cs」

using UnityEngine;
using System.Collections;

public class moveTarget : MonoBehaviour {

private Rigidbody myRigid;
private bool upSw;
private bool downSw;
private bool leftSw;
private bool rightSw;
private PhotonView myPV;
private GameObject scoreText;
private GameObject scoreTarget;

void Start () {
//photonViewを取得し、自分のオブジェクトでなければスクリプト停止
myPV = PhotonView.Get(this);
if(!myPV.isMine){
this.enabled = false;
}
//一応リジッドボディをキャッシュ
myRigid = this.gameObject.GetComponent();
//
scoreText = GameObject.Find("GUI Text");
scoreTarget = GameObject.Find("Sphere");

}

《中略》

void OnCollisionEnter(Collision col){
if(col.gameObject.name == scoreTarget.name){
//衝突時の処理
}
}


}
説明不要ですね。
続きまして、②・・・の前に、呼び出すRPCの作成から行います。

③について
OnCollisionEnterの一連の流れの後に以下のように追記します。

「moveTarget.cs」

using UnityEngine;
using System.Collections;

public class moveTarget : MonoBehaviour {

private Rigidbody myRigid;
private bool upSw;
private bool downSw;
private bool leftSw;
private bool rightSw;
private PhotonView myPV;
private GameObject scoreText;
private GameObject scoreTarget;
private static int nowScore = 0;


《略》

[RPC]
void addScore(int score){
nowScore = score;
scoreText.guiText.text = "nowScore = " + nowScore + "points";
}

}
まずスコア格納用の変数を定義しています。
その後、RPC用の関数を作成していますが、RPC用の関数を作成する場合、
頭に[RPC]と記述する必要があります。
これ以外は基本的に普通の関数と同じです。

続いて②について、RPCの呼び出しを行います。
今回のポイントはここからですよ~。

先ほどの衝突時の処理に記述します。
void OnCollisionEnter(Collision col){
if(col.gameObject.name == scoreTarget.name){
//衝突時の処理
nowScore += 1;
myPV.RPC("addScore",PhotonTargets.All,nowScore);
}
}
◆PhotonView.RPC(実行するRPC名, 実行対象, 渡す変数)
RPCを呼び出し、実行対象のクライアントで実行します。
実行対象には
・PhotonTargets.All
・PhotonTargets.Others
などがあり、Othersの場合は自分で呼び出しているくせに自分では実行しません。
いつ使うんだろうと思っていたんですが、意外と使います。超便利。
「渡す変数」というのは、通常の関数と同様に使えるのですが、最大の特徴は呼び出したクライアントの変数を送信するという部分です。
これと上記のOthersを組み合わせると、自分の変数を相手に送りつけて、その変数を使った処理を相手だけ行う、なんてことが可能です。

今回のサンプルでは、
①衝突する
②自分のスコアを加算
③RPCを呼び出し、自分のスコアを(自身を含めて)他のプレイヤーに一斉送信
④受け取ったスコアを自分のスコアに代入
⑤テキスト更新

という流れになっています。



こんな風になれば成功です。
次回はOnSerialize文による同期か、プレイヤープロパティ辺りを解説できればと思います。

間違いありましたら、是非お教え下さい。

2 件のコメント:

  1. Photonの記事を読ませて頂いてる者です。

    PhotonもUnityも初心者で、特にPhotonは分かんないことだらけなんですが、
    こちらのブログ記事、すごく分かりやすい説明です!
    おかげで色々と疑問が解決しそうです。

    また何かPhoton関連のこと書いてもらえると嬉しいです~

    返信削除
    返信
    1. コメントありがとうございます。
      ところどころ粗があって恐縮ではありますが、お役に立てて光栄です。
      今はちょっとバタバタしているので次回がいつになるか明言できないのですが、PhotonやUnityに関する記事はまだまだ書いていきます。
      のんびりお待ちくだされば嬉しいです。

      削除

状況に応じてご返事できない場合がございます。
予めご了承ください。