使用 Unity 创建类似部落冲突的游戏 Pt. 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

我们将实现一个简单的用户界面来显示部队的生命值条和其他相关的战斗信息。

  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。这为类似《部落冲突》的游戏提供更具互动性和战略性的游戏体验奠定了基础。

下一步