如何让敌人仅在玩家处于可被攻击状态时攻击(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
相关产品推荐
相关产品推荐

