Unityの公式チュートリアル「マルチプレイヤーネットワーキング」の実習の模様をお送りしております。前回の記事はこちらからどうぞ
公式サイトのチュートリアルページ 死と再生成
今回は、プレイヤーの体力値が無くなったら、プレイヤーの位置と体力値をリセットする処理を追加します。
修正したスクリプトのコードにコメントを加えたものがこちら。
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;
}
}
}
このステップを終えてゲームを実行。ビルドしたゲームを2つ実行してウィンドウを並べました。画面右側のクライアントが画面左のホスト(サーバー&クライアント)のプレイヤーを攻撃して体力がなくなると…
ホストのプレイヤーはそれぞれの画面中央にリセットされました。
今回のポイントは [ClientRpc] 属性と関数名の前に付ける “Rpc” ですね。チュートリアルでは下記のように解説されています。