1

我在 Unity3d 中创建了一个静态函数,可以在一定数量的帧上淡出音乐。该函数被放置在 Unity3d 的 FixedUpdate() 中,以便它根据现实世界的时间进行更新(或者至少希望关闭)。

我目前的线性淡出数学看起来像这样:

if (CurrentFrames > 0) { 
    AudioSourceObject.volume = ((CurrentFrames / TotalFrames) * TotalVolume);
} 
if (CurrentFrames <= 0) { 
    AudioSourceObject.volume = 0.00f;
    return 0;
}
CurrentFrames--;

这可以作为一种简单的方法来创建类似于 FadeOutBGM(NumberOfFrames);...但现在我正在研究如何使用此函数创建对数淡出。

看着网上的方程式,我完全不知道我应该做什么。

4

2 回答 2

1

您可以使用 Unity 内置的AnimationCurve类轻松完成此操作。在您的班级中定义它并使用 Unity 检查器绘制对数曲线。

然后在淡出类中,执行以下操作:

public AnimationCurve FadeCurve;

//...

if (CurrentFrames > 0) { 
    float time = CurrentFrames / TotalFrames;
    AudioSourceObject.volume = FadeCurve.Evaluate(time) * TotalVolume;
} 

//...

它对于制作各种缓动效果非常有用,只需尝试使用不同的曲线即可。

于 2016-11-01T03:55:16.767 回答
0

非常欢迎您使用内置函数。否则,如果您想要更好的控制,您可以使用调整后的 sigmoid 函数。通常,sigmoid 函数如下所示:(https://www.wolframalpha.com/input/?i=plot+(1%2F(1%2Be%5E(t)))+from+-5+to+5

在此处输入图像描述

但是您希望您的淡出功能看起来更像这样:(https://www.wolframalpha.com/input/?i=plot+(1%2F(1%2Be%5E(3t-4))+from+-5 +至+5)

在此处输入图像描述

其中 x 是 (CurrentFrames / TotalFrames) * 3 的比率,y 是输出量。

但是我是如何从第一张图到第二张图的呢?尝试使用 wolfram alpha 中的指数输入 (e^(play with this)) 的缩放器(即 3x 或 5x)和偏移量(即 (3x - 4) 或 (3x - 6)),以了解您的感受希望曲线看起来。您不必将曲线的交点与具有特定数字的轴对齐,因为您可以在代码中调整函数的输入和输出。

因此,您的代码如下所示:

if (CurrentFrames > 0) { 
    // I'd recommend factoring out and simplifying this into a  
    // function, but I have close to zero C# experience.
    inputAdjustment = 3.0
    x = ((CurrentFrames / TotalFrames) * inputAdjustment);
    sigmoidFactor = 1.0/(1.0 + Math.E ^ ((3.0 * x) - 4.0));
    AudioSourceObject.volume = (sigmoidFactor * TotalVolume);
}

if (CurrentFrames <= 0) { 
    AudioSourceObject.volume = 0.00f;
    return 0;
}
CurrentFrames--;
于 2016-11-01T04:26:34.717 回答