目的
Unityでオンラインマルチプレイを実装するために、StrixCloudを使用しての開発を開始した。前回、最低限度のゲーム機能の行ったので、今回はそのプロジェクトをベースにRPC機能を実装する。
RPCとは
リモートプロシージャコールというプレイヤー間で送信されるメッセージであり、ここでは、
- 自分の画面に表示されている自分のキャラクター
- 他プレイヤーの画面に表示されている自分のキャラクター
の間での通信を目的とする。
RPCを使用しない場合、自分の画面に表示されている自分のキャラクターに変化が置きた時に、他プレイヤーの画面に表示されている自分のキャラクターに変化が置きないというゲーム上の矛盾が発生する。
RPC機能作成
RPC機能概要
ゲーム終了時に勝利プレイヤーの操作キャラクターの色を変更する。
ゲーム開始時のプレイヤー色:青
ゲーム処理時のプレイヤー色:黄
プロジェクト作成
- 前回のプロジェクトを開く
- マテリアル[MaterialIngame]と[MaterialWin]を作成
- PlayerControllerにRPC関連処理の追加
- インスペクタからアタッチする項目のアタッチ
PlayerController
PlayerControllerの追加項目は、保持するマテリアル、スタート時の初期マテリアル設定、Clear接触時のRPC送信、勝利マテリアル設定処理のRPC登録。
PlayerController.cs
using UnityEngine; using SoftGear.Strix.Unity.Runtime; public class PlayerController : StrixBehaviour { public GameObject clear; public Material materialIngame; public Material materialWin; float speed = 3.0f; void Start() { GetComponent().material = materialIngame; } void Update() { if (!isLocal) return; if (Input.GetKey(KeyCode.W)) { transform.position += speed * transform.forward * Time.deltaTime; } if (Input.GetKey(KeyCode.S)) { transform.position -= speed * transform.forward * Time.deltaTime; } if (Input.GetKey(KeyCode.D)) { transform.position += speed * transform.right * Time.deltaTime; } if (Input.GetKey(KeyCode.A)) { transform.position -= speed * transform.right * Time.deltaTime; } } private void OnTriggerEnter(Collider other) { if (isLocal) { clear.GetComponent().GameFinish(true); } else { clear.GetComponent().GameFinish(false); } RpcToAll("GameWinEffect"); Destroy(other.gameObject); } [StrixRpc] public void GameWinEffect() { GetComponent().material = materialWin; } }
動作チェック
想定通り、RPCの呼び出しが成功し、勝利側プレイヤーの色が変わった。
コメント