Unity相机抖动脚本启动即触发且无法停止问题求助
相机抖动脚本问题修复
问题根源
- 赋值运算符误用:
Explosion脚本的Update方法中,if (GameOver = true)是赋值操作而非相等判断,导致游戏启动时GameOver被强制设为true,直接触发抖动。 - 计时器重复重置:每次
Update调用ShakeCamera都会重置_shakeTimer = shakeDuration,使得计时器永远无法归0,抖动无法停止。 - 碰撞逻辑执行顺序错误:
GameOver脚本中先销毁对象再设置触发标记,可能导致后续代码不执行。
修正方案
1. 修复Explosion脚本的Update方法
将赋值操作改为相等判断,并直接调用抖动逻辑,避免重复重置计时器:
void Update() { if (GameOver == true) { StartCameraShakeEffect(); } }
2. 调整ShakeCamera方法逻辑
仅在触发时初始化计时器,无需每次调用都重置:
public void ShakeCamera() { _shakeTimer = shakeDuration; GameOver = true; }
3. 修正GameOver脚本的碰撞执行顺序
先触发抖动再销毁对象,确保触发逻辑执行完成:
void OnCollisionEnter2D (Collision2D coll) { Debug.Log("Collision!"); if (coll.gameObject.tag == "platform") { shake.ShakeCamera(); Destroy(gameObject); } }
完整修正代码
Explosion 脚本
public class Explosion : MonoBehaviour { public Transform cameraTransform; private Vector3 orignalCameraPos; public float shakeDuration; public float shakeAmount; public bool GameOver = false; private float _shakeTimer; void Start() { orignalCameraPos = cameraTransform.localPosition; GameOver = false; _shakeTimer = 0; } void Update() { if (GameOver == true) { StartCameraShakeEffect(); } } public void ShakeCamera() { _shakeTimer = shakeDuration; GameOver = true; } private void StartCameraShakeEffect() { if (_shakeTimer > 0) { cameraTransform.localPosition = orignalCameraPos + Random.insideUnitSphere * shakeAmount; _shakeTimer -= Time.deltaTime; } else { _shakeTimer = 0f; cameraTransform.position = orignalCameraPos; GameOver = false; } } }
GameOver 脚本
public class GameOver : MonoBehaviour { public Explosion shake; void OnCollisionEnter2D (Collision2D coll) { Debug.Log("Collision!"); if (coll.gameObject.tag == "platform") { shake.ShakeCamera(); Destroy(gameObject); } } }
修改后,相机抖动只会在碰撞触发时启动,并在设定的shakeDuration时长后自动停止,符合预期逻辑。
内容的提问来源于stack exchange,提问作者Thieme de Boer
相关产品推荐
相关产品推荐

