查看: 3285|回复: 3
打印 上一主题 下一主题

[教程] Unity3D教程宝典之 AnimationCurve

[复制链接]

1557

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
454
精华
31

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2013-10-14 16:57:36 |只看该作者 |倒序浏览
第一部分:介绍
第二部分:基本使用
第三部分:脚本创建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,之后运行即可。

  • 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);
  • }
  • }

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏2 支持支持0 反对反对0
回复

使用道具 举报

2

主题

1

听众

1143

积分

助理设计师

Rank: 4

纳金币
350
精华
0
沙发
发表于 2013-10-28 10:16:12 |只看该作者
感谢楼主分享~
回复

使用道具 举报

74

主题

2

听众

3549

积分

中级设计师

Rank: 5Rank: 5

纳金币
-100
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2013-11-17 20:59:06 |只看该作者
重力调节这块没有了解,希望有更细的教程
回复

使用道具 举报

115

主题

3

听众

5676

积分

高级设计师

Rank: 6Rank: 6

纳金币
7268
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-10-31 17:42:02 |只看该作者
Thanks for sharing this one !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-23 11:27 , Processed in 0.102343 second(s), 30 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部