Как исправить несоответствие в Pitch Shifting с помощью анимации в Unity 2019.1.0f2 - PullRequest
2 голосов
/ 24 июня 2019

У меня есть анимация автомобиля, едущего по дороге, и я пытаюсь отрегулировать высоту звука двигателя через компонент Audio Source. Проблема заключается в том, что каждый раз, когда я запускаю свое приложение в редакторе единиц, значения высоты тона резко возрастают и не согласовываются между играми.

Это для C # и Unity3d. Я пытаюсь усреднить высоту тона, основываясь на трех самых последних кадрах, и фиксирую значения тона между 1 и 3. Когда я усредняю ​​высоту тона, я проверяю, что он находится в пределах порога maxDifference для борьбы с возникающими всплесками. Анимация не основана на корневом движении, поэтому я не могу использовать поля скорости анимации. Чтобы исправить это, я вычисляю расстояние, пройденное по кадру, используя координаты X и Z текущего кадра и последний кадр, введенный в формулу расстояния. Затем я умножаю это значение на масштабирующее число, чтобы определить, к чему мои значения высоты тона должны быть близки. Это значение можно изменить с помощью редактора, и значение, которое я использовал чаще всего, равно 12.

public float scaler;

[Range(0, 0.7f)]
public float maxDifference;
public Animator anim;
public AudioSource audiosource;

Vector3 lastPos;
float lastPitch;
float lastPitch2;
float lastPitch3;  

var position = transform.position;

float deltaPosition = Mathf.Abs(Mathf.Sqrt(Mathf.Pow((lastPos.z - position.z), 2) + Mathf.Pow((lastPos.x - position.x), 2)));
audiosource.pitch = deltaPosition * scaler + 1;

if (audiosource.pitch < 1)
{
    audiosource.pitch = 1;
}

if (Mathf.Abs(audiosource.pitch - (lastPitch + lastPitch2 + lastPitch3) / 3f) > maxDifference 
    && !carStart)
{
    audiosource.pitch = (lastPitch + lastPitch2 + lastPitch3) / 3f;
}

if (audiosource.pitch > 3f)
    audiosource.pitch = 3f;

lastPos = position;
lastPitch3 = lastPitch2;
lastPitch2 = lastPitch;
lastPitch = audiosource.pitch;

Я ожидал постоянных значений высоты тона, но каждый раз, когда я запускаю его, значения меняются каждый раз. Значения также постоянно возрастают.

1 Ответ

2 голосов
/ 24 июня 2019

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

Для упрощения вещей вы можете использовать Mathf.Clamp:

audiosource.pitch = Mathf.Clamp(deltaPosition * scaler + 1, 1f, 3f); 

float runningAverage = (lastPitch + lastPitch2 + lastPitch3) / 3f;
if (!carStart) 
{ 
    audiosource.pitch = Mathf.Clamp(audiosource.pitch, 
                                    runningAverage - maxDifference,
                                    runningAverage + maxDifference); 
} 

lastPos = this.transform.position; 

lastPitch3 = lastPitch2; 
lastPitch2 = lastPitch; 
lastPitch = audiosource.pitch;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...