Categories: Unity

Unity:敵の破壊~マルチプレイヤーネットワーキングのチュートリアルに挑戦

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

敵の破壊

公式サイトのチュートリアルページ 敵の破壊

今回は敵キャラクターの体力値がゼロになったらシーンから削除する制御を追加します。

スクリプト Health の修正

  1. スクリプト Health を開く
  2. 判定用のパブリック変数 Destroy On Death を追加
  3. 関数 TakeDamage 内で、Current Health が 0 になった時に、再生成(respawn)の前に Destroy On Death の判定処理を追加
  4. スクリプトを保存

修正したスクリプトのコードにコメントを加えたものがこちら。黄色いマーカー行が追加した部分です。

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;
    // キャラクター破壊のフラグ変数
    public bool destroyOnDeath;
    // 現在の体力値を格納する変数(ネットワーク同期、初期値は 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)
        {
            // 破壊フラグが True の場合
            if (destroyOnDeath)
            {
                //オブジェクトを破壊 
                Destroy(gameObject);
            }
            // 条件に当てはまらない場合
            else
            {
                // 体力値をリセット(体力最大値を現在値に渡す)
                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;
        }
    }
}

プレハブ Enemy の設定

  1. Unity に戻って[Project]ウィンドウからプレハブ Enemy を選択
  2. Destroy On Death のチェックボックスを オン に設定
  3. プロジェクトを保存

Health コンポーネントはこのようになっています。

動作確認

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

このステップを終えてゲームを実行。ビルドしたゲームを2つ実行してウィンドウを並べました。画面右側がホスト(サーバー&クライアント)で画面左がクライアントです。同じ位置に敵キャラクターが4体表示されています。

敵キャラクターは破壊フラグがオンになっているので、撃たれて体力がゼロになると破壊されます。

corevale