Categories: Unity

Unity:死と再生成~マルチプレイヤーネットワーキングのチュートリアルに挑戦

Unityの公式チュートリアル「マルチプレイヤーネットワーキング」の実習の模様をお送りしております。前回の記事はこちらからどうぞ

死と再生成

公式サイトのチュートリアルページ 死と再生成

今回は、プレイヤーの体力値が無くなったら、プレイヤーの位置と体力値をリセットする処理を追加します。

スクリプト Health の修正

  1. Health スクリプトを開く
  2. 新しい関数 Respawn 作成し、[ClientRpc] 属性および Rpc プレフィックスを付ける
  3. 関数 TakeDamage 内のコードを、プレイヤーの currentHealth が maximum にリセットされるように変更
  4. Debug.Log ラインを RpcRespawn の呼び出しに置き換える
  5. スクリプトを保存

修正したスクリプトのコードにコメントを加えたものがこちら。

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;
        }
    }
}

動作確認

  1. シーンをスタンドアロンのアプリケーションとして Build and Run を実行
  2. ゲーム内 UI から[Host]ボタンをクリックしてゲームをホストとして開始
  3. プレイヤーゲームオブジェクトを動かす
  4. Unity に戻ってPlay モードを開始
  5. ゲーム内 UI から[LAN Client]ボタンをクリックしてクライアントとしてホストに接続
  6. プレイヤーゲームオブジェクトを動かし、どちらのプレイヤーゲームオブジェクトも元の位置にない状態にする
  7. スタンドアロン・プレイヤーを終了
  8. Unity に戻ってPlay モードを終了

このステップを終えてゲームを実行。ビルドしたゲームを2つ実行してウィンドウを並べました。画面右側のクライアントが画面左のホスト(サーバー&クライアント)のプレイヤーを攻撃して体力がなくなると…

ホストのプレイヤーはそれぞれの画面中央にリセットされました。

今回のポイントは [ClientRpc] 属性と関数名の前に付ける “Rpc” ですね。チュートリアルでは下記のように解説されています。

  • [Command] 属性を使用する関数はクライアント上で呼び出され、サーバー上で実行される
  • [ClientRpc] 属性を使用する関数はサーバー上で呼び出され、クライアント上で実行される
corevale