游戏帧的对数淡入淡出

Logarithmic Fade In and Out over Game Frames

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

我目前的线性淡出数学是这样的:

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

作为创建类似 FadeOutBGM(NumberOfFrames) 的函数的简单方法,这种方法效果很好;...但现在我正在研究如何使用此函数创建对数淡出。

看了网上的方程式,我完全不知道该怎么办。

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

然后在淡出 class 中,做这样的事情:

public AnimationCurve FadeCurve;

//...

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

//...

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

非常欢迎您使用内置函数。否则,如果您想要更好的控制,可以使用调整后的 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+to+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--;