Unity--AnimationCurve动画曲线

一、编辑切线

基本操作:

创建关键点:左键双击

删除关键点:

(1)鼠标移动至关键点上,右键->Delete Key。

(2)左键单击关键点,然后按键盘上的delete

 

一个键有两个切线 - 左侧一个用于进入坡度,另一个用于出口坡度。切线控制键之间的曲线形状。您可以从许多不同的切线类型中进行选择,以控制曲线离开一个键并到达下一个键的方式。右键单击某个键以选择该键的切线类型。

要使动画值在传递键时平滑变化,左右切线必须是共线的。以下切线类型可确保平滑度:

  • Clamped Auto:这是默认切线模式。切线自动设置为使曲线顺利通过键。编辑键的位置或时间时,切线会调整以防止曲线“超出”目标值。如果在Clamped Auto模式下手动调整键的切线,则会切换到Free Smooth模式。在下面的示例中,切线自动进入斜率并在移动键时趋于平稳:

  • Auto:这是传统切线模式,仍然是与旧项目向后兼容的选项。除非您有特定原因要使用此模式,否则请使用默认的Clamped Auto。当某个键设置为此模式时,将自动设置切线以使曲线顺利通过该键。但是,与Clamped Auto模式相比有两个不同之处:
    1. 当编辑键的位置或时间时,切线不会自动调整; 它们仅在最初将键设置为此模式时进行调整。
    2. 当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);
    }
}

 

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值