问题:有个镜头移动的动画,需要获取镜头3秒之后的位置,从而进行逻辑处理。
解决方案:1、根据 动画的总时间,获取当前动画的播放时间,
2、遍历动画的所有属性,从而读取目标属性的在指定时间的设定值
void Awake(){
m_Anim = m_Camera.GetComponent<Animation>();
foreach (AnimationState state in m_Anim)
{
m_CameraAnimName = state.name;
}
m_AnimClip = m_Anim.GetClip(m_CameraAnimName);
m_FrameRate = m_AnimClip.frameRate;
m_AnimTotalTime = m_AnimClip.length;
m_AnimTotalFrame = (int)(m_AnimTotalTime * m_FrameRate);
}
public Vector3 CureEvaluateVaule(float time)
{Vector3 temp = Vector3.zero;
Vector3 test = Vector3.zero;
if (time > m_AnimTotalTime )
{
return temp;
}
time += m_Anim[m_CameraAnimName].normalizedTime * m_AnimTotalTime;
foreach (var curveBinding in AnimationUtility.GetCurveBindings(m_AnimClip))
{
AnimationCurve curve = AnimationUtility.GetEditorCurve(m_AnimClip, curveBinding);
if (curveBinding.path.Equals("cam 1"))//cam1是镜头对象在动画中的名字
{
switch (curveBinding.propertyName)//本案例中的动画镜头位置属性,可以先通过遍历属性,查看自己动画的成员属性名
{
case "m_LocalPosition.x"://镜头对象的动画属性名
{
temp.x = curve.Evaluate(time);
test.x = curve.Evaluate(Time.time);
}
break;
case "m_LocalPosition.y":
{
temp.y = curve.Evaluate(time);
test.y = curve.Evaluate(Time.time);
}
break;
case "m_LocalPosition.z":
{
temp.z = curve.Evaluate(time);
test.z = curve.Evaluate(Time.time);
}
break;
default:
break;
}
}
}
return temp;
}