一、编辑切线
基本操作:
创建关键点:左键双击
删除关键点:
(1)鼠标移动至关键点上,右键->Delete Key。
(2)左键单击关键点,然后按键盘上的delete
一个键有两个切线 - 左侧一个用于进入坡度,另一个用于出口坡度。切线控制键之间的曲线形状。您可以从许多不同的切线类型中进行选择,以控制曲线离开一个键并到达下一个键的方式。右键单击某个键以选择该键的切线类型。
要使动画值在传递键时平滑变化,左右切线必须是共线的。以下切线类型可确保平滑度:
- Clamped Auto:这是默认切线模式。切线自动设置为使曲线顺利通过键。编辑键的位置或时间时,切线会调整以防止曲线“超出”目标值。如果在Clamped Auto模式下手动调整键的切线,则会切换到Free Smooth模式。在下面的示例中,切线自动进入斜率并在移动键时趋于平稳:
- Auto:这是传统切线模式,仍然是与旧项目向后兼容的选项。除非您有特定原因要使用此模式,否则请使用默认的Clamped Auto。当某个键设置为此模式时,将自动设置切线以使曲线顺利通过该键。但是,与Clamped Auto模式相比有两个不同之处:
- 当编辑键的位置或时间时,切线不会自动调整; 它们仅在最初将键设置为此模式时进行调整。
- 当Unity计算切线时,它不会考虑避免键的目标值“过冲”。
- Free Smooth:拖动切线控制柄以自由设置切线。它们被锁定为共线以确保平滑。
- Flat:切线设置为水平(这是自由平滑的特殊情况)。
有时您可能不希望曲线在通过键时是平滑的。要在曲线中创建急剧变化,请选择 Broken 切线模式。
使用Broken的切线时,可以单独设置左右切线,也可以一起设置左右切线。左右切线中的每一个都可以设置为以下类型之一:
- Broken - Free:拖动切线控制柄以自由设置切线。
- Broken - Linear:切线指向相邻键。要制作线性曲线段,请将两端的切线都设置为Linear。在下面的示例中,所有三个键都设置为Broken - Linear,以实现从键到键的直线。
- Broken - Constant:曲线在两个键之间保持恒定值。左键的值确定曲线段的值。
Broken - Weighted:根据句柄的长度设置曲线切线。
当设置曲线后,起点和终点,会出现一个下拉按钮,出现三种方式:
Loop:循环
Ping Pong:曲线和源曲线上下翻转后的曲线循环。
Clamp:一直为端点的值。
当左边选择Loop循环,右边设置Clamp:
二、在代码中使用曲线
AnimationCurve包括:(1)键序列 (2)左右循环模式
一:键序列
创建键序列:Keyframe[] ks = new Keyframe[3];
曲线中加入键序列:AnimationCurve curve = new AnimationCurve(ks);
获取曲线中的键序列:Keyframe key = curve[2];或者 Keyframe key = curve.keys[2];
添加单键:curve.Addkey(time,value)
删除单键:curve.RemoveKey(index)
二:左右循环
anim.preWrapMode = WrapMode.Loop;
anim.postWrapMode = WrapMode.Once;
三:键
Keyframe kf = new Keyframe(time,value);
设置入切线:kf.inTangent = 45;
设置出切线:kf.outTangent = 45;
using UnityEngine;
public class AnimationCurveTest : MonoBehaviour
{
public AnimationCurve curve;
void Start()
{
// 代码控制曲线,也可以在Curve控制器中生成曲线
Keyframe[] ks = new Keyframe[3];
ks[0] = new Keyframe(0, 0);
ks[0].inTangent = 0;
ks[1] = new Keyframe(4, 0);
ks[1].inTangent = 45;
ks[2] = new Keyframe(8, 0);
ks[2].inTangent = 90;
curve = new AnimationCurve(ks);
}
void Update()
{
// 使用曲线,调用curve.Evaluate
transform.position = new Vector3(Time.time, -curve.Evaluate(Time.time) * 0.5f, 0);
}
}