【问题标题】:Change audio pitch based on rigidbody speed根据刚体速度更改音频音高
【发布时间】:2017-04-14 10:02:59
【问题描述】:

当玩家移动或滚动时,我们会发出一些声音,因为玩家是一个球。我们希望球跑得越快,音频的音高就越大。我尝试了下面的代码,但它没有做任何事情。我认为这是因为 p 的值太小了。 我记得在某处读到有内置的东西可以处理这个问题,但我想不出我在哪里看到的或者它叫什么。

提前致谢!

     void FixedUpdate()
    {
#if UNITY_EDITOR || UNITY_STANDALONE
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
         Vector3 move = new Vector3(-moveHorizontal, 0.0f, -moveVertical);            
        move = move * (speed / 15f);
        //maxSpeed = maxSpeed / 5;
#else
        // Player movement in mobile devices
        // Building of force vector             
        Vector3 move = new Vector3(-Input.acceleration.x, 0.0f, -Input.acceleration.y);
        // Adding force to rigidbody
        move = move * (speed / 15f);
        //move = movement * speed * Time.deltaTime;            
#endif
        rigidbdy.AddForce(move);
        var p = rigidbdy.velocity.magnitude / speed;
        audio.pitch = Mathf.Clamp(p, 1.0f, 2.0f); // p is clamped to sane values

        //Limits the max speed
        if (rigidbdy.velocity.magnitude > maxSpeed)
        {
            rigidbdy.velocity = rigidbdy.velocity.normalized * maxSpeed;               
        }
    }

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    您可以使用map 函数轻松控制音高值。

    float mapValue(float mainValue, float inValueMin, float inValueMax, float outValueMin, float outValueMax)
    {
        return (mainValue - inValueMin) * (outValueMax - outValueMin) / (inValueMax - inValueMin) + outValueMin;
    }
    

    您将AudioSource.pitch 传递给mainValue 参数。


    对于inValueMin 值,您传入Rigidbody.velocity.magnitude 的默认/MIN 值,即0。


    对于inValueMax 值,您传入您的球可以走的最大值。 您可以使用Debug.Log("RB: " + ballRigidbody.velocity.magnitude); 轻松确定此数字并运行游戏。 10 似乎对此很好。你必须确定自己的价值。


    AudioSource.pitch默认值是1,所以outValueMin参数应该是1。


    outValueMax 参数将是您认为可以接受的最大音高。我发现1.5 可以,所以1.5 将用于outValueMax。


    无论您从 mapValue 函数获得什么,都是您分配给 AudioSource.pitch 的内容。这使您可以更好地控制声音的音高。您可以在 Arduino site 上阅读有关此功能的更多信息。

    删除您当前的音频代码并将其替换为:

    float rigidBodyMangintude = rigidbdy.velocity.magnitude;
    float pitch = mapValue(rigidBodyMangintude, 0f, 10f, 1f, 1.5f);
    
    audio.pitch = pitch;
    Debug.Log("Pitch: " + pitch);
    

    mapValue 函数位于此答案的顶部。

    【讨论】:

    • 谢谢。我会在今天晚些时候试一试并报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2015-11-09
    • 2015-08-15
    相关资源
    最近更新 更多