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

Unity按键选技能+左键释放功能失效问题求助

问题:技能选择后左键释放功能失效的原因及解决方法

需求:实现玩家通过按键选择技能,左键点击释放,所有技能共享冷却,不同技能对应不同效果。原代码按下技能键直接释放正常,但添加左键释放逻辑后功能失效。

原代码

[SerializeField] private float cooldownTimer;
private float cooldown = 2f;
private int abilityChosen = 0;

void Start()
{

}

void Update()
{
    //每帧减少冷却时间
    cooldown -= Time.deltaTime;

    //不同按键对应不同操作
    if (Input.GetKeyDown(KeyCode.Q))
    {
        abilityChosen = 1;
        Debug.Log("Q");
        CastAbility();
    }
    else if (Input.GetKeyDown(KeyCode.E))
    {
        abilityChosen = 2;
        Debug.Log("E");
        CastAbility();
    }
    else if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        abilityChosen = 3;
        Debug.Log("Left Shift");
        CastAbility();
    }
    else if (Input.GetKeyDown(KeyCode.LeftAlt))
    {
        abilityChosen = 4;
        Debug.Log("Left Alt");
        CastAbility();
    }
    else if (Input.GetKeyDown(KeyCode.Mouse1))
    {
        abilityChosen = 5;
        Debug.Log("Right Click");
        CastAbility();
    }
}

private void CastAbility()
{
    //仅当冷却时间≤0且左键点击时,才可释放技能
    if (cooldown > 0)
    {
        Debug.Log("Ability on cooldown");
    } 
    else if (cooldown <= 0)
    {
            Debug.Log("Ability " + abilityChosen + " Cast");
            cooldown = cooldownTimer;
    }
}

尝试的修改方案

方案1

private void CastAbility()
{
    //仅当冷却时间≤0且左键点击时,才可释放技能
    if (cooldown > 0)
    {
        Debug.Log("Ability on cooldown");
    } 
    else if (cooldown <= 0 && Input.GetKeyDown(KeyCode.Mouse0))
    {
            Debug.Log("Ability " + abilityChosen + " Cast");
            cooldown = cooldownTimer;
    }
}

方案2

private void CastAbility()
{
    //仅当冷却时间≤0且左键点击时,才可释放技能
    if (cooldown > 0)
    {
        Debug.Log("Ability on cooldown");
    } 
    else if (cooldown <= 0)
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Debug.Log("Ability " + abilityChosen + " Cast");
            cooldown = cooldownTimer;
        }
    } 
}

失效原因

你现在的逻辑是按下技能键的同一帧,要求同时按下左键才能触发释放——这几乎不可能实现,玩家不可能精准到同一帧按下两个按键。原来的代码是按技能键直接调用CastAbility释放,现在加的左键判断是在技能键按下的那一帧检测,自然永远满足不了条件,导致功能失效。

解决方法

把技能选择和技能释放拆成两个独立的逻辑:

  1. 按技能键时,只完成「选中技能」的操作,不触发释放
  2. 单独监听左键点击事件,当左键按下时,再检查冷却和是否有选中的技能,满足条件才释放

修改后的完整代码:

[SerializeField] private float cooldownTimer;
private float cooldown = 2f;
private int abilityChosen = 0;

void Start()
{

}

void Update()
{
    // 每帧更新冷却时间,确保不会小于0
    cooldown -= Time.deltaTime;
    cooldown = Mathf.Max(cooldown, 0f);

    // 第一部分:处理技能选择(只选技能,不释放)
    if (Input.GetKeyDown(KeyCode.Q))
    {
        abilityChosen = 1;
        Debug.Log("选中技能1(Q)");
    }
    else if (Input.GetKeyDown(KeyCode.E))
    {
        abilityChosen = 2;
        Debug.Log("选中技能2(E)");
    }
    else if (Input.GetKeyDown(KeyCode.LeftShift))
    {
        abilityChosen = 3;
        Debug.Log("选中技能3(Left Shift)");
    }
    else if (Input.GetKeyDown(KeyCode.LeftAlt))
    {
        abilityChosen = 4;
        Debug.Log("选中技能4(Left Alt)");
    }
    else if (Input.GetKeyDown(KeyCode.Mouse1))
    {
        abilityChosen = 5;
        Debug.Log("选中技能5(右键)");
    }
    // 第二部分:处理左键释放技能
    else if (Input.GetKeyDown(KeyCode.Mouse0))
    {
        CastAbility();
    }
}

private void CastAbility()
{
    // 检查冷却和是否选中了技能
    if (cooldown > 0)
    {
        Debug.Log("技能冷却中");
    }
    else if (abilityChosen == 0)
    {
        Debug.Log("请先选择技能");
    }
    else
    {
        Debug.Log("释放技能" + abilityChosen);
        cooldown = cooldownTimer;
        // 这里可以根据abilityChosen添加对应技能的效果逻辑
        // 例如:
        // switch(abilityChosen)
        // {
        //     case 1: 
        //         // 执行Q技能效果
        //         break;
        //     case 2: 
        //         // 执行E技能效果
        //         break;
        //     // ...其他技能分支
        // }
    }
}

关键改动说明

  • 技能按键仅设置abilityChosen,不再调用CastAbility
  • 单独在Update中监听左键点击事件,触发技能释放逻辑
  • 增加了「未选中技能」的判断,避免无意义的释放尝试
  • 给冷却时间加了Mathf.Max(cooldown, 0f),防止冷却时间变成负数(可选但推荐)

内容的提问来源于stack exchange,提问作者EPiedrahita

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:09:54