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
相关产品推荐
相关产品推荐

