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

ビルトインを使用することは大歓迎です。それ以外の場合、より細かく制御したい場合は、調整されたシグモイド関数を使用できます。通常、シグモイド関数は次のようになります: ( 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 は出力ボリュームです。

しかし、どうやって最初のグラフから 2 番目のグラフに移動したのでしょうか? 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 に答える