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

Unity 2D射击游戏全自动开火功能失效求助

问题分析与解决

你的代码存在两个核心问题:

  • Start()方法仅在游戏启动时执行一次,里面的while循环只会在初始化瞬间检查一次输入,后续无法响应玩家的持续开火操作。
  • while循环会直接阻塞Unity主线程,导致游戏卡死,同时你调用的StartCoroutine(Delay())完全无法正常工作——主线程被循环占用,协程的延迟逻辑没有执行机会,Shoot()会被瞬间调用无数次直至程序崩溃。

正确实现方式

方法1:Update+时间间隔控制(最常用)

public float fireRate = 0.1f; // 控制射速,0.1f代表每秒10发,可自行调整
private float nextFireTime;

private void Update()
{
    // 按住Fire1且到达下一次开火时间时,执行射击
    if (Input.GetButton("Fire1") && Time.time >= nextFireTime)
    {
        Shoot();
        nextFireTime = Time.time + fireRate;
    }
}

Update()每帧都会执行,能持续检测玩家输入;通过nextFireTime变量控制两次射击的间隔,避免射速失控。

方法2:协程实现(适合复杂开火逻辑)

public float fireRate = 0.1f;
private bool isFiring = false;

private void Update()
{
    // 按下Fire1且未处于开火状态时,启动全自动协程
    if (Input.GetButtonDown("Fire1") && !isFiring)
    {
        StartCoroutine(AutoFireCoroutine());
    }
    // 松开Fire1时停止开火
    else if (Input.GetButtonUp("Fire1"))
    {
        isFiring = false;
    }
}

private IEnumerator AutoFireCoroutine()
{
    isFiring = true;
    // 持续开火直到isFiring变为false
    while (isFiring)
    {
        Shoot();
        yield return new WaitForSeconds(fireRate);
    }
}

通过协程的yield return实现延迟,同时用isFiring标记控制协程启停,逻辑更灵活。

注意:确保你的Shoot()方法本身逻辑正常(比如正确生成子弹、播放音效等),否则即使全自动逻辑没问题,射击功能也不会正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:05:15