Unity角色点击鼠标无攻击反应问题求助(附代码)
Unity连击攻击无响应问题解决
问题描述
我是Unity和编程新手,完全不清楚问题所在。为制作连击攻击,参考了相关教程视频,但左键点击时角色毫无攻击动作(配图:角色攻击无动作截图)。几乎完全跟着教程操作,为何角色仍不攻击?
以下是我的PlayerCombat脚本代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCombat : MonoBehaviour { public static PlayerCombat instance; public Animator animator; public Transform AttackPoint; public float AttackRange = 0.5f; public LayerMask enemyLayers; public int attackDamage = 40; public bool canReceiveInput; public bool inputReceived; private void Awake() { instance = this; } void Start() { } // Update is called once per frame void Update() { Attack(); } public void Attack() { if (Input.GetButtonDown("Fire1")) { if (canReceiveInput) { inputReceived = true; canReceiveInput = false; } else { return; } } } public void InputManager() { if (!canReceiveInput) { canReceiveInput = true; } else { canReceiveInput = false; } } }
问题排查与修复
- 初始输入权限未开启:
canReceiveInput是bool类型,默认值为false,导致第一次点击左键直接跳过逻辑。在Start()方法中添加canReceiveInput = true;,确保游戏启动时允许接收攻击输入。 - 未触发攻击核心逻辑:代码仅标记了
inputReceived,但没有调用动画播放、敌人检测与伤害逻辑。在Attack()方法的有效分支中添加:- 播放攻击动画:
animator.SetTrigger("Attack");(需确保Animator控制器中存在同名触发器) - 敌人检测与伤害:使用
Physics2D.OverlapCircleAll检测攻击范围内的敌人并调用伤害方法
- 播放攻击动画:
- InputManager方法未执行:该方法用于切换输入权限以实现连击,但从未被调用。需要在攻击动画的帧事件中绑定此方法,确保攻击动作结束后重新允许输入。
- 简化冗余逻辑:将
Attack()中的嵌套判断简化,提升代码可读性:public void Attack() { if (Input.GetButtonDown("Fire1") && canReceiveInput) { inputReceived = true; canReceiveInput = false; // 攻击核心逻辑写在这里 } }
修复后完整代码示例
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerCombat : MonoBehaviour { public static PlayerCombat instance; public Animator animator; public Transform AttackPoint; public float AttackRange = 0.5f; public LayerMask enemyLayers; public int attackDamage = 40; public bool canReceiveInput; public bool inputReceived; private void Awake() { instance = this; } void Start() { // 初始允许接收攻击输入 canReceiveInput = true; } void Update() { Attack(); } public void Attack() { if (Input.GetButtonDown("Fire1") && canReceiveInput) { inputReceived = true; canReceiveInput = false; // 触发攻击动画 animator.SetTrigger("Attack"); // 检测并攻击范围内的敌人 Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackPoint.position, AttackRange, enemyLayers); foreach(Collider2D enemy in hitEnemies) { // 注意:Enemy脚本和TakeDamage方法需自行实现 enemy.GetComponent<Enemy>().TakeDamage(attackDamage); } } } public void InputManager() { // 简化权限切换逻辑 canReceiveInput = !canReceiveInput; } }
内容的提问来源于stack exchange,提问作者abnormal
相关产品推荐
相关产品推荐

