pppboy 发表于 2023-5-6 20:55:40

【转载】AnimationCurve

本帖最后由 pppboy 于 2023-5-6 21:07 编辑

### 原创文章如需转载请注明:转载自风宇冲博客

               AnimationCurve

第一部分:介绍

第二部分:基本使用

第三部分:脚本创建AnimationCurve

第四部分:编辑器里的AnimationCurve

第一部分:介绍

AnimationCurve是Unity3D里一个非常实用的功能。作用是编辑一条任意变化的曲线用在任何你想用在的地方。 如曲线地形,曲线轨迹等。也被用在了模型动画播放时的碰撞盒缩放及重力调节。AnimationCurve 曲线的绘制方法和Ragespline中的物体轮廓勾勒的方法类似。

**第二部分:基本使用**

第一步:创建物体

第二步:创建脚本

创建AnimationCurveTutor.cs的脚本并添加到物体上。代码如下。

1. using UnityEngine;
2. using System.Collections;
3. public class AnimationCurveTutor : MonoBehaviour {
4. public AnimationCurve anim;
5. }

第三步:绘制曲线

把脚本添加到物体上后,物体的Inspector面板下看到如下界面。

!(data/attachment/forum/202305/06/210257i28wwjero7wwk8mm.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "47113292gd4cd7182ee86&690.jpg")

双击上图红色区域即进入曲线编辑界面(下图)。

!(data/attachment/forum/202305/06/210307poo3vwbqgqysfogk.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "47113292gd4cd719f9711&690.jpg")

双击任意区域内地方,创建关键点。对关键点点鼠标邮件,则出如下界面.
!(data/attachment/forum/202305/06/210316stti1pqb8ua8pw7p.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "47113292gd4cd9ab9fcf3&690.jpg")

基本操作:

创建关键点:左键双击

删除关键点:

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

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

设置曲线类型:鼠标移动至关键点上,右键->

Auto:根据关键点自动设置曲线。

Free Smooth:统一设置入切线和出切线

Flat:入切线和出切线为水平

Broken:分别设置入切线和出切线

也可以选Left Tangent(入切线)或者Right Tangent(出切线)或者Both Tangents(两切线)。

Free:自由曲线,与Broken效果基本一样。

Linear:线性曲线

Constant:之前一直是上个点的值,然后瞬间变为这个点的值。

其中Auto最简单,Broken调整空间最大。曲线效果以绿线为准。

编辑好一条曲线后,在曲线的左右两端会有一个下拉菜单,点击设置两端各自重复的方式。

Loop:曲线循环

!(data/attachment/forum/202305/06/210401imjmwqg1j3qa13aw.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "47113292gd4cde3aae87b&690.jpg")

Pingpong: 曲线和该曲线上下翻转后的曲线循环

!(data/attachment/forum/202305/06/210410zn9g68wwn9u2g2dq.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "47113292gd4cde3b921cc&690.jpg")

Clamp:一直为端点的值。

!(data/attachment/forum/202305/06/210443nn0mmte6fnttf6x4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "47113292gd4cde3d3d6e2&690.jpg")

第四步:使用曲线

在上面的脚本里,再添加几行代码,如下

```csharp
* using UnityEngine;
* using System.Collections;
*
* public class AnimationCurveTutor : MonoBehaviour {
* public AnimationCurve anim;
*public void Update()
*{
*    transform.position = new Vector3(Time.time, anim.Evaluate(Time.time), 0);
*}
* }
```

运行后,物体会按曲线轨迹向右移动。

**第三部分:脚本创建AnimationCurve**

AnimationCurve可以理解为2部分。(1)键序列(2)左右循环模式(又作左右包裹模式)

一:键序列

创建键序列:Keyframe[] ks = new Keyframe;

曲线中加入键序列:AnimationCurve curve = new AnimationCurve(ks);

获取曲线中的键序列:curve   或者 curve.keys

添加单键: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;

用脚本动态实时创建AnimationCurve。创建如下脚本,拖到任意物体运行即可。

```csharp
using UnityEngine;
using System.Collections;

public class CreateRuntime : MonoBehaviour {
public AnimationCurve anim = new AnimationCurve();
void Start() {
   Keyframe[] ks = new Keyframe;
   ks = new Keyframe(0, 0);
   ks.inTangent = 0;
   ks = new Keyframe(4, 0);
   ks.inTangent = 45;
   ks = new Keyframe(8, 0);
   ks.inTangent = 90;
   anim = new AnimationCurve(ks);
}

void Update() {
   transform.position = new Vector3(Time.time, anim.Evaluate(Time.time), 0);
}
}
```

**第四部分:编辑器的AnimationCurve**

创建EditorCurves.cs及FollowAnimationCurveMine.cs脚本如下。

使用时,先选中物体,再点击Unity菜单栏Examples->Mine,编辑好曲线后点击Generate Curve,之后运行即可。

!(data/attachment/forum/202305/06/210527zz89uddvu72vaul9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "47113292gd4ce4e263607&690.jpg")

```csharp
using UnityEngine;
using System.Collections;
using UnityEditor;

public class EditorCurves :EditorWindow {
AnimationCurve curveX = AnimationCurve.Linear(0,0,10,10);

static void Init()
{
   EditorWindow window = GetWindow(typeof(EditorCurves));
   window.position = new Rect(0,300,200,100);
   window.Show();
}
void OnGUI()
{
curveX = EditorGUI.CurveField(new Rect(3,3,position.width-6,15), "Animation on X", curveX);
if(GUI.Button(new Rect(3,60,position.width-6,30),"Generate Curve"))
      AddCurveToSelectedGameObject();
}
void AddCurveToSelectedGameObject()
{
      if(Selection.activeGameObject) {
         FollowAnimationCurveMinecomp=Selection.activeGameObject.AddComponent();
         comp.SetCurves(curveX);
      } else {
         Debug.LogError("No Game Object selected for adding an animation curve");
      }
}
}


using UnityEngine;
using System.Collections;

public class FollowAnimationCurveMine : MonoBehaviour {
public AnimationCurve curveX;
public void SetCurves(AnimationCurve tmpCurve)
{
   curveX = tmpCurve;
}
void Update () {
if(curveX != null)
   transform.position = new Vector3(1f*Time.time, curveX.Evaluate(Time.time) * 0.3f,0);
}
}
```
页: [1]
查看完整版本: 【转载】AnimationCurve