目的
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の呼び出しが成功し、勝利側プレイヤーの色が変わった。


コメント