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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:15:34