You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让敌人仅在玩家处于可被攻击状态时攻击(Unity C#实现)

实现Unity中敌人仅攻击可被攻击状态的玩家

1. 玩家状态管理脚本

先给玩家添加状态管理脚本,用来标记并控制是否处于可被攻击状态:

using UnityEngine;

public class PlayerStatus : MonoBehaviour
{
    // 标记玩家是否可被攻击
    public bool isVulnerable = true;

    // 外部调用切换无敌/可攻击状态
    public void SetVulnerable(bool state)
    {
        isVulnerable = state;
    }

    // 示例:受伤后触发短暂无敌逻辑
    public void TakeDamage()
    {
        if (!isVulnerable) return;
        
        // 此处编写扣血、受伤特效等逻辑
        Debug.Log("玩家受到伤害");
        
        // 开启2秒无敌
        SetVulnerable(false);
        Invoke(nameof(ResetVulnerable), 2f);
    }

    private void ResetVulnerable()
    {
        SetVulnerable(true);
    }
}

2. 敌人攻击逻辑实现

在敌人的攻击脚本中,先获取玩家状态组件,攻击前检查玩家是否处于可被攻击状态:

using UnityEngine;
using System.Collections;

public class EnemyAttack : MonoBehaviour
{
    [SerializeField] private float attackRange = 2f;
    [SerializeField] private float attackCooldown = 1.5f;
    
    private Transform player;
    private PlayerStatus playerStatus;
    private bool canAttack = true;

    private void Start()
    {
        // 通过标签获取玩家对象(需确保玩家标签设为"Player")
        player = GameObject.FindGameObjectWithTag("Player").transform;
        playerStatus = player.GetComponent<PlayerStatus>();
    }

    private void Update()
    {
        if (player == null || playerStatus == null) return;
        
        float distanceToPlayer = Vector3.Distance(transform.position, player.position);
        
        // 满足攻击距离、冷却完成、玩家可被攻击三个条件时发起攻击
        if (distanceToPlayer <= attackRange && canAttack && playerStatus.isVulnerable)
        {
            StartCoroutine(DoAttack());
        }
    }

    private IEnumerator DoAttack()
    {
        canAttack = false;
        
        // 执行攻击动作:播放攻击动画、触发伤害判定等
        Debug.Log("敌人发起攻击");
        // 若要直接造成伤害,可调用 playerStatus.TakeDamage();
        
        yield return new WaitForSeconds(attackCooldown);
        canAttack = true;
    }
}

3. 补充优化方案

  • 如果用触发器检测攻击范围,可将Update中的距离判断替换为触发器回调:
private void OnTriggerStay(Collider other)
{
    if (other.CompareTag("Player") && canAttack && playerStatus.isVulnerable)
    {
        StartCoroutine(DoAttack());
    }
}
  • 玩家触发无敌技能时,直接调用SetVulnerable(false)即可,技能结束后再调用SetVulnerable(true)恢复可攻击状态。

内容的提问来源于stack exchange,提问作者Nhật Quang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:30:58