C# 如何使用Unity 2019.1.0f2中的动画修复音调移动中的不一致性

C# 如何使用Unity 2019.1.0f2中的动画修复音调移动中的不一致性,c#,unity3d,C#,Unity3d,我有一个汽车行驶在道路上的动画,我试图通过音频源组件调整发动机声音的音调。问题是,每次我在unity编辑器中运行我的应用程序时,音高值都会出现峰值,并且在播放之间不一致 这是给C#和Unity3d的。我试图根据最近的三帧平均音高,并将音高值限制在1到3之间。当我平均音高时,我会确保它在一个最大差异阈值内,以对抗已经发生的尖峰。动画不是基于根运动的,所以我不能使用动画速度场。为了解决这个问题,我使用当前帧和输入到距离公式中的最后一帧的X和Z位置来计算在帧上移动的距离。然后,我将该值乘以一个缩放数,

我有一个汽车行驶在道路上的动画,我试图通过音频源组件调整发动机声音的音调。问题是,每次我在unity编辑器中运行我的应用程序时,音高值都会出现峰值,并且在播放之间不一致

这是给C#和Unity3d的。我试图根据最近的三帧平均音高,并将音高值限制在1到3之间。当我平均音高时,我会确保它在一个最大差异阈值内,以对抗已经发生的尖峰。动画不是基于根运动的,所以我不能使用动画速度场。为了解决这个问题,我使用当前帧和输入到距离公式中的最后一帧的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;
公共浮点定标器;
[范围(0,0.7f)]
公共交通差异;
公共动画;
公共音频源;
向量3-lastPos;
浮动尾距;
浮球2;
浮球3;
var位置=变换位置;
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;
中频(音频源音高<1)
{
audiosource.pitch=1;
}
if(Mathf.Abs(audiosource.pitch-(lastPitch+lastPitch2+lastPitch3)/3f)>maxDifference
&&!carStart)
{
audiosource.pitch=(lastPitch+lastPitch2+lastPitch3)/3f;
}
中频(audiosource.pitch>3f)
audiosource.pitch=3f;
lastPos=位置;
lastPitch3=lastPitch2;
lastPitch2=lastPitch;
lastPitch=audiosource.pitch;

我希望音高值保持一致,但每次运行时,音高值都会发生变化。值也会不断尖峰。

当当前节距尾随平均值太远时,应将其钳制到尾随平均值的某个距离,而不是将其精确设置为尾随平均值

为了简化事情,可以使用
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;

尝试使用Mathf.Clamp:
audiosource.pitch=Mathf.Clamp(deltaPosition*scaler+1,1f,3f)
float runningAverage=(lastPitch+lastPitch2+lastPitch3)/3f
如果(!carStart)
{
lastPitch3=lastPitch2
lastPitch2=lastPitch
lastprotch=audiosource.pitch好的,非常感谢!它工作得很好!