設計に基づいて、EnemyController スクリプトに追加されている EnemyDataSO.EnemyData クラスの情報を利用して、
エネミーの攻撃力分だけ拠点の耐久力の値を減算する処理に書き替えます。
UpdateDurability メソッドには EnemyController の情報が引数で届いていますので、これをそのまま利用します。
EnemyDataSO.EnemyData クラスに設定されている power の値が攻撃力になります。
この情報は public 修飾子で宣言されている変数ですので、 EnemyDataSO.EnemyData クラスを扱えるスクリプトであれば
そのまま参照をすることが出来ます。
// EnemyController スクリプトの情報を代入する変数
EnemyControler enemy;
// EnemyController スクリプトの情報を利用して、EnemyDataSO.EnemyData クラスの情報から、power の値を参照する(ピリオドの処理を理解する)
enemy.enemyData.power;
またエネミーごとの攻撃力の値を参照できているか確認するため、Debug.Log メソッドを利用して、
Console ビューにエネミーごとの攻撃力の値を表示するように処理を追加しておきます。
DefenseBase.cs
<= クリックすると開きます
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
[RequireComponent(typeof(Rigidbody2D))]
public class DefenseBase : MonoBehaviour {
[Header("拠点の耐久力")]
public int durability;
[SerializeField]
private GameObject enemyAttackEffectPrefab;
private int maxDurability; // 耐久力の最大値を代入しておく
private GameManager gameManager; // GameManager スクリプトの情報を代入するための変数
/// <summary>
/// DefenseBaseの設定
/// </summary>
public void SetUpDefenceBase(GameManager gameManager) {
// 引数を利用して、GameManager スクリプトの情報を受け取って、用意しておいた変数に代入
this.gameManager = gameManager;
// ゲーム開始時点の耐久力の値を最大値として代入
maxDurability = durability;
// 耐久力の表示更新
gameManager.uiManager.DisplayDurability(durability, maxDurability); // <= UIManager には durability と maxDurability の情報がありませんので、引数として渡します
}
private void OnTriggerEnter2D(Collider2D col) {
if (col.gameObject.tag == "Enemy") {
// 侵入してきたコライダーのゲームオブジェクトに EnemyController スクリプトがアタッチされていたら取得して enemy 変数に代入して、if 文の中の処理を行う
if (col.gameObject.TryGetComponent(out EnemyController enemy)) {
// 耐久力の更新処理を呼び出す
UpdateDurability(enemy);
}
// エネミーの攻撃演出用のエフェクト生成
GenerateEnemyAttackEffect(col.gameObject.transform);
// エネミーのゲームオブジェクトを破壊する
Destroy(col.gameObject);
}
}
/// <summary>
/// 耐久力の更新
/// </summary>
private void UpdateDurability(EnemyController enemy) {
////* ここから処理を修正 *////
// 耐久力の値をエネミーの攻撃力分だけ減算する(右辺の値を変更する)
durability -= enemy.enemyData.power;
// エネミーの攻撃力を反映しているか確認
Debug.Log("エネミーの攻撃力 : " + enemy.enemyData.power);
////* ここまで *////
// 耐久力の値を上限・下限値の範囲内に収まるか確認し、それを超えた場合には上限・下限値に置き換えて制限する
durability = Mathf.Clamp(durability, 0, maxDurability);
// 減算結果の値を Console ビューに表示して計算されているか確認
//Debug.Log("残りの耐久力 ; " + durability); // <= ☆ 不要になったのでコメントアウトするか、削除してください
// 耐久力の表示更新
gameManager.uiManager.DisplayDurability(durability, maxDurability); // <= UIManager には durability と maxDurability の情報がありませんので、引数として渡します
// 耐久力が 0 以下になっていないか確認し、かつ、すでに isGameUp 変数が true になっていないかも確認(すでに isGameUp 変数が true なら処理しない)
if (durability <= 0 && gameManager.isGameUp == false) {
Debug.Log("Game Over");
// 耐久力が 0 以下なら、ゲーム終了とする判定を行う。ここで isGameUp 変数が true に切り替わるので、上の if 文の条件を満たさなくなり、この分岐内は1回しか処理されなくなる
gameManager.SwitchGameUp(true);
// ゲームオーバーの準備
gameManager.PreparateGameOver();
}
}
/// <summary>
/// エネミーが拠点に侵入した際の攻撃演出用のエフェクト生成
/// </summary>
private void GenerateEnemyAttackEffect(Transform enemyTran) {
// 拠点の位置(画面の中央)にエフェクトを生成
GameObject enemyAttackEffect = Instantiate(enemyAttackEffectPrefab, enemyTran, false);
// 生成されたエフェクトを TemporaryObjectContainerTran の子オブジェクトにする(引数に GetTemporaryObjectContainerTran メソッドの戻り値を利用)
enemyAttackEffect.transform.SetParent(TransformHelper.GetTemporaryObjectContainerTran());
// 3秒後にエフェクトを破壊する
Destroy(enemyAttackEffect, 3.0f);
}
}
スクリプトを修正したらセーブします。
新しく宣言した変数はありませんので、インスペクターは以前と変わりない状態で問題ありません。
DefenseBase ゲームオブジェクト インスペクター画像
続いて、EnemyController スクリプトを修正します。