Unityの公式チュートリアル「マルチプレイヤーネットワーキング」の実習の模様をお送りしております。前回の記事はこちらからどうぞ
死と再生成
公式サイトのチュートリアルページ 死と再生成
今回は、プレイヤーの体力値が無くなったら、プレイヤーの位置と体力値をリセットする処理を追加します。
スクリプト Health の修正
- Health スクリプトを開く
- 新しい関数 Respawn 作成し、[ClientRpc] 属性および Rpc プレフィックスを付ける
- 関数 TakeDamage 内のコードを、プレイヤーの currentHealth が maximum にリセットされるように変更
- Debug.Log ラインを RpcRespawn の呼び出しに置き換える
- スクリプトを保存
修正したスクリプトのコードにコメントを加えたものがこちら。
using System.Collections; using System.Collections.Generic; using UnityEngine; // UIコンポーネント関数を使用するため名前空間の追加 using UnityEngine.UI; // ネットワークコンポーネント関数を使用するため名前空間の追加 using UnityEngine.Networking; public class Health : NetworkBehaviour { // 体力値を格納する変数(定数値 100) public const int maxHealth = 100; // 現在の体力値を格納する変数(ネットワーク同期、初期値は maxHealth) // 変数値が変更されたら関数 OnChangeHealth を実行 // OnChangeHealth の引数 health に currentHealth の値を渡す [SyncVar(hook = "OnChangeHealth")] public int currentHealth = maxHealth; // RectTranform コンポーネントを格納する変数 public RectTransform healthBar; // ダメージ処理(サーバー上のみ) public void TakeDamage(int amount) { // サーバーでない場合 if (!isServer) { // 以降の処理を中断 return; } // 現在の体力値から 引数 amount の値を引く currentHealth -= amount; // 現在の体力値が 0 以下の場合 if (currentHealth <= 0) { // 体力値をリセット(体力最大値を現在値に渡す) currentHealth = maxHealth; // プレイヤーをリセットする処理を実行 //(サーバーで呼び出されクライアントで実行) RpcRespawn(); } } // 体力値ゲージの変更処理 // (引数 health には 変数 currentHealth が渡される ) void OnChangeHealth(int health) { // RectTranform コンポーネントのサイズを体力値に合わせて変更 //(X値に health 値を代入、Y値は RectTranform コンポーネントのY値を代入) healthBar.sizeDelta = new Vector2(health, healthBar.sizeDelta.y); } // サーバーで呼び出されクライアントで実行する属性 [ClientRpc] // プレイヤーをリセットする処理(Rpc プレフィックス) void RpcRespawn() { // プレイヤーが自分自身の場合 if (isLocalPlayer) { // プレイヤーをゼロ地点に戻す transform.position = Vector3.zero; } } }
動作確認
- シーンをスタンドアロンのアプリケーションとして Build and Run を実行
- ゲーム内 UI から[Host]ボタンをクリックしてゲームをホストとして開始
- プレイヤーゲームオブジェクトを動かす
- Unity に戻ってPlay モードを開始
- ゲーム内 UI から[LAN Client]ボタンをクリックしてクライアントとしてホストに接続
- プレイヤーゲームオブジェクトを動かし、どちらのプレイヤーゲームオブジェクトも元の位置にない状態にする
- スタンドアロン・プレイヤーを終了
- Unity に戻ってPlay モードを終了
このステップを終えてゲームを実行。ビルドしたゲームを2つ実行してウィンドウを並べました。画面右側のクライアントが画面左のホスト(サーバー&クライアント)のプレイヤーを攻撃して体力がなくなると…
ホストのプレイヤーはそれぞれの画面中央にリセットされました。
今回のポイントは [ClientRpc] 属性と関数名の前に付ける “Rpc” ですね。チュートリアルでは下記のように解説されています。
- [Command] 属性を使用する関数はクライアント上で呼び出され、サーバー上で実行される
- [ClientRpc] 属性を使用する関数はサーバー上で呼び出され、クライアント上で実行される