2016-11-01 22 views
1

Я создал статическую функцию в Unity3d, которая исчезает из-за определенного количества кадров. Функция помещается в Unity3d's FixedUpdate(), так что она обновляется в соответствии с реальным мировым временем (или, по крайней мере, с надеждой).Логарифмический Fade In и Out Over Game Frames

Моей текущая математика для линейного затухать выглядит следующим образом:

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

Это хорошо работает как простой способ создать функцию, которая, как FadeOutBGM (NumberOfFrames) ... но теперь я ищу на том, как я создаю логарифмическое исчезновение, используя эту функцию.

Оглядываясь на равные возможности онлайн, я совершенно смущен относительно того, что я должен делать.

+0

Не стесняйтесь, чтобы отметить ответ как правильный. – Ralph

ответ

0

Вы более чем можете использовать встроенные функции. В противном случае, если вы хотите более тонкое управление, вы можете использовать настроенную сигмовидную функцию. Как правило, функция сигмовидной выглядит следующим образом: (https://www.wolframalpha.com/input/?i=plot+(1%2F(1%2Be%5E(t)))+from+-5+to+5)

enter image description here

Но вы хотите, чтобы ваш Fade Out функция выглядеть следующим образом: (https://www.wolframalpha.com/input/?i=plot+(1%2F(1%2Be%5E(3t-4))+from+-5+to+5)

enter image description here

Где х ваше отношение (CurrentFrames/TotalFrames) * 3, а y - выходной объем.

Но как я получил от первого до второго графика? Попробуйте поэкспериментировать с скальперов (т.е. 3x или 5x) и смещения (т. Е. (3x - 4) или (3x - 6)) экспоненциального входа (e^(игра с этим)) в вольфрам альфа, чтобы понять, как вы хотите, чтобы кривая выглядела. Вам необязательно выстраивать линию пересечения вашей кривой и оси с определенным номером, так как вы можете настроить ввод и вывод вашей функции в своем коде.

Итак, ваш код будет выглядеть следующим образом:

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--; 
+0

Спасибо, nateslager, я попробую! :) –

+0

Вы в итоге преуспели? – Ralph

1

Вы можете сделать это легко, используя Unity, встроенный в класс AnimationCurve. Определите его в своем классе и используйте инспектор Unity для построения логарифмической кривой.

Тогда в классе гаснуть сделать что-то вроде этого:

public AnimationCurve FadeCurve; 

//... 

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

//... 

Его очень полезно для выполнения всех видов ослабления эффектов, попробуйте поиграть с различными кривыми.

+0

Я просто предложил это. Я собираюсь попробовать это наверняка. –

 Смежные вопросы

  • Нет связанных вопросов^_^