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

Unity相机抖动脚本启动即触发且无法停止问题求助

相机抖动脚本问题修复

问题根源

  1. 赋值运算符误用:Explosion脚本的Update方法中,if (GameOver = true)是赋值操作而非相等判断,导致游戏启动时GameOver被强制设为true,直接触发抖动。
  2. 计时器重复重置:每次Update调用ShakeCamera都会重置_shakeTimer = shakeDuration,使得计时器永远无法归0,抖动无法停止。
  3. 碰撞逻辑执行顺序错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:03:24