Unity3D:使用AnimationCurve动态设置音频源音量

问题描述 投票:0回答:1

Unity 新人。对于这个项目,我正在读取外部动画曲线,并尝试使用它来调整更新函数中每一帧的游戏对象的音量。我找到了有关如何访问 AudioSource GameObject 组件音量的文档(这是有效的),但我不知道如何使用我的评估曲线来更新音量。

带有导入的动画曲线和评估值的屏幕截图

我的cs脚本包含在下面。抱歉,如果它有点不透明。这是一个神经科学实验,所以我需要仔细控制动画曲线。它读取时间和值(存储在 currentCurveData 中),用于将关键帧添加到 SetAnimationFrames() 函数中的新 AnimationCurve (curveThisTrl)。

关键部分在Update()中。初始的tone.volume是正确的,所以我知道它正在从游戏对象读取该属性。我还可以在每帧的调试日志中看到正确的曲线值,因此我知道曲线评估正在工作。它只是没有像我想要的那样改变游戏对象的体积属性。

希望这些信息足以发现问题,但如果没有,我可以尝试提供测试动画曲线以实现可重复性。预先感谢您的任何帮助。

public class AnimationControl : MonoBehaviour {

    private DataController dataControllerRef;
    private CurveDataSingleTrial currentCurveData;
    private float initTime;

    public AnimationCurve curveThisTrl;
    AudioSource tone;

    void Awake()
    {
        initTime = Time.time;
    }

    // Use this for initialization
    void Start ()
    {
        // Get references to key objects in scene
        dataControllerRef = FindObjectOfType<DataController>(); // Has values from JSON
        tone = GetComponent<AudioSource>();
        Debug.Log(tone.volume);

        // query the DataController for the current curve data
        currentCurveData = dataControllerRef.GetCurrentCurveData();

        SetAnimationFrames();
    }

    void SetAnimationFrames()
    {
        int numKeyFrames = currentCurveData.keyframeTimes.Length;

        for (int c = 0; c < numKeyFrames; c++)
        {
            curveThisTrl.AddKey(currentCurveData.keyframeTimes[c], currentCurveData.keyframeVals[c]);
        }
    }

    // Update is called once per frame
    void Update ()
    {
        float currTime = Time.time - initTime;
        tone.volume = curveThisTrl.Evaluate(currTime);
        Debug.Log(tone.volume);

    }
}
unity-game-engine gameobject
1个回答
0
投票

哟兄弟,我读到你无法做一个简单的动画曲线来控制简单游戏对象的音量,但因为我只是一个圣人兄弟,我会帮助你,不,只是开玩笑,你在你的yee yee屁股代码上吸了imma flex。我添加了一个声音剪辑,但这很简单,你需要知道如何自己做到这一点。总而言之,不知道你必须将浮动限制到动画曲线的极限,这只是一个很大的技能问题,这不可能是我的问题。这段代码毫不费力地对动画曲线进行了评估,所以也许您可以通过复制这段真正出色的代码来解决您的技能问题。像我一样制作你自己的循环也许可以拯救你无法挽救的屁股无论如何,稍后见 aligator

void Start()
{
  rb = rb.GetComponent<Rigidbody>();
  StartCoroutine(loop()); 
}

private IEnumerator loop()
{
x = Move.ReadValue<float>();
Debug.Log(x);
volume = Mathf.Clamp(TankDriveSound.volume, 0f, 1f);
curtime = Mathf.Clamp(curtime, 0f, 0.8f);
//Controls Volume 
if (x != 0)
{
   
    curtime += 0.5f * Time.deltaTime;
    volume = anim.Evaluate(curtime);
    TankDriveSound.volume = volume;
}
else
{
   
    curtime -= 1f * Time.deltaTime;
    volume = anim.Evaluate(curtime);
    TankDriveSound.volume = volume;

}
yield return new WaitForSeconds(0.01f);
StartCoroutine(loop()); 
}
© www.soinside.com 2019 - 2024. All rights reserved.