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

Unity OnMouseDrag旋转雕像时音频无法正常停止问题求助

问题分析与解决方法

你的问题核心在于**OnMouseDrag方法的执行时机限制**,以及浮点精度导致的判断误差:

  1. OnMouseDrag仅在按住鼠标拖动的每帧执行,一旦松开鼠标停止拖动,这个方法就不再触发。如果最后一帧满足音效开启条件,音效会保持开启状态无法自动关闭。
  2. Input.GetAxis("Mouse X")返回浮点值,用!= 0判断时,可能因为微小的浮点残留(比如0.0001)被误判为非0,导致音效错误开启。

修复方案

方案1:补充鼠标松开时的处理逻辑

添加OnMouseUp方法,在用户松开鼠标时强制关闭音效,从根源解决拖动停止后方法不执行的问题:

KeyCode pickUpKey = KeyCode.LeftControl; 
float rotationSpeed = 0.5f;
AudioSource idolMoving;

void Awake()
{
    idolMoving = GetComponent<AudioSource>();
    idolMoving.enabled = false; // 初始化关闭音效
}

void OnMouseDrag()
{
    if (Input.GetKey(pickUpKey))
    {
        float yAxisRotation = Input.GetAxisRaw("Mouse X") * rotationSpeed;
        transform.Rotate(Vector3.up, yAxisRotation, Space.Self);
        
        // 用GetAxisRaw避免浮点精度问题,仅当鼠标真正移动时开启音效
        idolMoving.enabled = Input.GetAxisRaw("Mouse X") != 0;
    }
    else
    {
        idolMoving.enabled = false;
    }
}

// 松开鼠标时强制关闭音效
void OnMouseUp()
{
    idolMoving.enabled = false;
}

方案2:改用Play()/Stop()精准控制播放状态

相比启用/禁用组件,直接调用音频源的播放/停止方法更可靠,也能避免组件状态残留问题:

KeyCode pickUpKey = KeyCode.LeftControl; 
float rotationSpeed = 0.5f;
AudioSource idolMoving;

void Awake()
{
    idolMoving = GetComponent<AudioSource>();
}

void OnMouseDrag()
{
    if (Input.GetKey(pickUpKey))
    {
        float yAxisRotation = Input.GetAxisRaw("Mouse X") * rotationSpeed;
        transform.Rotate(Vector3.up, yAxisRotation, Space.Self);
        
        bool isMouseMoving = Input.GetAxisRaw("Mouse X") != 0;
        if (isMouseMoving && !idolMoving.isPlaying)
        {
            idolMoving.Play();
        }
        else if (!isMouseMoving && idolMoving.isPlaying)
        {
            idolMoving.Stop();
        }
    }
    else
    {
        if (idolMoving.isPlaying)
        {
            idolMoving.Stop();
        }
    }
}

void OnMouseUp()
{
    if (idolMoving.isPlaying)
    {
        idolMoving.Stop();
    }
}

关键修改点说明

  • Input.GetAxisRaw替代Input.GetAxis:返回整数(-1/0/1),彻底避免浮点精度导致的误判,确保只有鼠标真正移动时才触发音效。
  • OnMouseUp方法:覆盖松开鼠标的场景,强制关闭音效,解决OnMouseDrag停止执行后的状态残留问题。
  • 精准控制播放状态:用isPlaying判断音频是否在播放,避免重复调用Play()或Stop()带来的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:26:17