Unity3D:使用AnimationCurve动态设置AudioSource音量

时间:2018-10-02 14:45:57

标签: unity3d gameobject

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

Screencap with imported AnimationCurve and evaluated values

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

关键部分在Update()中。最初的tone.volume是正确的,所以我知道它是从GameObject读取该属性的。我还可以在每帧调试日志中看到正确的曲线值,因此我知道曲线评估是有效的。只是没有按我想要的那样更改GameObject的volume属性。

希望这是足够的信息,可以发现问题,但是如果没有,我可以尝试提供测试AnimationCurve的再现性。在此先感谢您的帮助。

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);

    }
}

0 个答案:

没有答案