AnimationCurve

关于animationCurve的使用总结
1 创建,可以新建脚本,创建animationCurve变量,然后直接在脚本上手动拖动可视化创建曲线,也可以用代码创建(这种比较不直观)

2 使用,anim.Evaluate(Time.time)

3 存储,编辑器手动创建曲线,然后代码中读取各项key数据,二进制保存起来,用的时候再读取

第一部分:介绍

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

 

第二部分:基本使用

第一步:创建物体

第二步:创建脚本

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

 

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

第三步:绘制曲线

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

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


双击任意区域内地方,创建关键点。对关键点点鼠标邮件,则出如下界面.

 

基本操作:

创建关键点:左键双击

删除关键点:

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

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

 

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

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

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

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

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

 

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

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

Linear:线性曲线

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

 

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

 

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

Loop:曲线循环

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

Clamp:一直为端点的值。



 

第四步:使用曲线

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

 using UnityEngine;  

  1. using System.Collections;  
  2.   
  3. public class AnimationCurveTutor : MonoBehaviour {  
  4.  public AnimationCurve anim;  
  5.  public void Update()  
  6.  {  
  7.   transform.position = new Vector3(Time.time, anim.Evaluate(Time.time), 0);  
  8.  }  
  9. }  

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

第三部分:脚本创建AnimationCurve

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

一:键序列

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

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

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

添加单键: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。创建如下脚本,拖到任意物体运行即可。

 using UnityEngine;  

  1. using System.Collections;  
  2.   
  3. public class CreateRuntime : MonoBehaviour {  
  4.     public AnimationCurve anim = new AnimationCurve();  
  5.     void Start() {  
  6.         Keyframe[] ks = new Keyframe[3];  
  7.         ks[0] = new Keyframe(0, 0);  
  8.         ks[0].inTangent = 0;  
  9.         ks[1] = new Keyframe(4, 0);  
  10.         ks[1].inTangent = 45;  
  11.         ks[2] = new Keyframe(8, 0);  
  12.         ks[2].inTangent = 90;  
  13.         anim = new AnimationCurve(ks);  
  14.     }  
  15.     void Update() {  
  16.         transform.position = new Vector3(Time.time, anim.Evaluate(Time.time), 0);  
  17.     }  
  18. }  

第四部分:编辑器的AnimationCurve

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

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


 

    1. using UnityEngine;  
    2. using System.Collections;  
    3. using UnityEditor;  
    4.   
    5. public class EditorCurves :EditorWindow {  
    6.  AnimationCurve curveX = AnimationCurve.Linear(0,0,10,10);  
    7.  [MenuItem("Examples/Mine")]  
    8.  static void Init()  
    9.  {  
    10.   EditorWindow window = GetWindow(typeof(EditorCurves));  
    11.   window.position = new Rect(0,300,200,100);  
    12.   window.Show();  
    13.  }  
    14.  void OnGUI()  
    15.  {  
    16.   curveX = EditorGUI.CurveField(new Rect(3,3,position.width-6,15), "Animation on X", curveX);  
    17.   if(GUI.Button(new Rect(3,60,position.width-6,30),"Generate Curve"))  
    18.             AddCurveToSelectedGameObject();  
    19.  }  
    20.  void AddCurveToSelectedGameObject()  
    21.  {  
    22.  if(Selection.activeGameObject) {  
    23.             FollowAnimationCurveMine comp  = Selection.activeGameObject.AddComponent<FollowAnimationCurveMine>();  
    24.             comp.SetCurves(curveX);  
    25.         } else {  
    26.             Debug.LogError("No Game Object selected for adding an animation curve");  
    27.         }  
    28.  }  
    29. }   
    30.  
      1.  using System.Collections;  
      2.   
      3. public class FollowAnimationCurveMine : MonoBehaviour {  
      4. public AnimationCurve curveX;  
      5. public void SetCurves(AnimationCurve tmpCurve)  
      6. {  
      7.  curveX = tmpCurve;  
      8. }  
      9. void Update () {  
      10.  if(curveX != null)  
      11.     transform.position = new Vector3(1f*Time.time, curveX.Evaluate(Time.time) * 0.3f,0);  
      12. }  
      13. }                                                                                                                                                                                                                                                                                                                                                                 参考链接:https://blog.csdn.net/m0_37283423/article/details/70751545
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值