zoukankan      html  css  js  c++  java
  • AnimationCurve

    http://blog.sina.com.cn/s/blog_471132920101f8nv.html

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

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

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




    创文章如需转载请注明:转载自风宇冲Unity3D教程学院


                       AnimationCurve

    第一部分:介绍
    第二部分:基本使用
    第三部分:脚本创建AnimationCurve
    第四部分:编辑器里的AnimationCurve

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

    第二部分:基本使用
    第一步:创建物体
    第二步:创建脚本
    创建AnimationCurveTutor.cs的脚本并添加到物体上。代码如下。
    using UnityEngine;
    using System.Collections;
    public class AnimationCurveTutor : MonoBehaviour {
     public AnimationCurve anim;
    }


    第三步:绘制曲线
    把脚本添加到物体上后,物体的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;
    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[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;
    using System.Collections;
    
    public class CreateRuntime : MonoBehaviour {
        public AnimationCurve anim = new AnimationCurve();
        void Start() {
            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;
            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,之后运行即可。


     

    1. using UnityEngine;
      using System.Collections;
      using UnityEditor;
      
      public class EditorCurves :EditorWindow {
       AnimationCurve curveX = AnimationCurve.Linear(0,0,10,10);
       [MenuItem("Examples/Mine")]
       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) {
                  FollowAnimationCurveMine comp  = Selection.activeGameObject.AddComponent<FollowAnimationCurveMine>();
                  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);
      }
      }


      

  • 相关阅读:
    DVWA——Brute Force(暴力破解)
    Sqli-Labs 闯关 less 54-65
    C#静态构造函数和析构函数片段化认知
    for、foreach和MoveNext循环效率粗比较
    实现一次请求加载多个js或者css
    asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度
    C#向文件写、读数据
    计算机管理cmd命令行
    有二级目录的IIS配置
    WIN7 64位系统安装JDK并配置环境变量
  • 原文地址:https://www.cnblogs.com/nafio/p/9137157.html
Copyright © 2011-2022 走看看