Unity でクラッシュ・オブ・クランのようなゲームを作成するパート 3

チュートリアル シリーズのこの第 3 部では、プレイヤーが他のプレイヤーや AI と交戦できるようにする戦闘システムを実装します。これには、部隊の相互作用、体力、戦闘アニメーション、および全体的な戦闘メカニズムの管理が含まれます。

部隊クラスの強化

戦闘をより適切に処理するために、既存の Troop クラスを強化する必要があります。これには、体力の追跡と、プレイヤーと AI の両方からの攻撃の処理が含まれます。

using UnityEngine;

public class Troop : MonoBehaviour
{
    public float movementSpeed = 2f;
    public int health = 50; // Added health property
    public int damage = 10;
    public float attackRange = 1f;
    private GameObject target;

    void Update()
    {
        if (target != null)
        {
            MoveTowardsTarget();
        }
    }

    public void SetTarget(GameObject newTarget)
    {
        target = newTarget;
    }

    private void MoveTowardsTarget()
    {
        float step = movementSpeed * Time.deltaTime;
        transform.position = Vector2.MoveTowards(transform.position, target.transform.position, step);

        if (Vector2.Distance(transform.position, target.transform.position) < attackRange)
        {
            Attack();
        }
    }

    private void Attack()
    {
        // Attack the target
        Building building = target.GetComponent();
        if (building != null)
        {
            building.TakeDamage(damage);
            Debug.Log(name + " attacked " + target.name);
        }
    }

    public void TakeDamage(int damage)
    {
        health -= damage;
        Debug.Log(name + " takes " + damage + " damage.");
        
        if (health <= 0)
        {
            Destroy(gameObject);
            Debug.Log(name + " destroyed!");
        }
    }
}

戦闘マネージャーの作成

部隊が攻撃範囲内にいることを検知し、そのターゲットを管理するなど、部隊間のやり取りを処理する CombatManager を作成します。

using UnityEngine;
using System.Collections.Generic;

public class CombatManager : MonoBehaviour
{
    public List playerTroops;
    public List enemyTroops;

    void Update()
    {
        foreach (Troop troop in playerTroops)
        {
            FindTarget(troop, enemyTroops);
        }

        foreach (Troop troop in enemyTroops)
        {
            FindTarget(troop, playerTroops);
        }
    }

    private void FindTarget(Troop troop, List enemyTroops)
    {
        foreach (Troop enemy in enemyTroops)
        {
            if (Vector2.Distance(troop.transform.position, enemy.transform.position) < troop.attackRange)
            {
                troop.SetTarget(enemy.gameObject);
                return; // Exit after setting the first target
            }
        }

        troop.SetTarget(null); // No target found
    }
}

AI動作の実装

戦闘をより魅力的にするために、敵軍に基本的な AI 動作を実装できます。

public class EnemyAI : MonoBehaviour
{
    public float patrolRange = 5f;
    private Vector2 startPosition;

    void Start()
    {
        startPosition = transform.position;
    }

    void Update()
    {
        // Simple patrol logic
        transform.Translate(Vector2.right * Mathf.Sin(Time.time) * Time.deltaTime);

        // Check if the troop is in range to attack
        Troop troop = GetComponent();
        if (troop != null && troop.target == null)
        {
            // Find a new target
            CombatManager combatManager = FindObjectOfType();
            combatManager.FindTarget(troop, combatManager.playerTroops);
        }
    }
}

戦闘アニメーションの作成

戦闘の視覚的な魅力を高めるために、部隊に簡単なアニメーションを追加することができます。Unity の Animator コンポーネントを使用して、基本的な攻撃アニメーションを設定できます。

  1. 部隊アニメーションを Unity にインポートします。
  2. Troop クラスで、パブリック Animator 変数を作成します。
  3. Attack メソッド中にアニメーションをトリガーします。
public class Troop : MonoBehaviour
{
    public Animator animator; // Add this line

    private void Attack()
    {
        animator.SetTrigger("Attack"); // Trigger attack animation
        // ... rest of the attack logic
    }
}

戦闘UIの作成

部隊の体力バーやその他の関連する戦闘情報を表示するためのシンプルな UI を実装します。

  1. Hierarchy で、新しい UI > Canvas を作成します。
  2. 各部隊のヘルスバーを表す UI > Image 要素を追加します。
  3. スクリプトを使用して、部隊の体力に基づいて体力バーを更新します。
using UnityEngine;
using UnityEngine.UI;

public class HealthBar : MonoBehaviour
{
    public Troop troop;
    public Image healthBar;

    void Update()
    {
        float healthPercentage = (float)troop.health / 50; // Assuming max health is 50
        healthBar.fillAmount = healthPercentage;
    }
}

結論

このチュートリアルでは、プレイヤーが他のプレイヤーや AI と交戦できる戦闘システムを追加しました。部隊のインタラクション、ヘルス管理、戦闘アニメーション、ヘルス ステータスの UI を実装しました。これにより、Clash of Clans のようなゲームで、よりインタラクティブで戦略的なゲームプレイ エクスペリエンスを実現するための基礎が築かれます。

次のステップ