ResourceFrom:http://www.xuanyusong.com/archives/2052
最近项目中需要加入一些模型移动的小动画,学习过程中发现了iTween这个类库。它主要的功能就是处理模型从起始点道结束点之间运动的轨迹。(移动,旋转,音频,路径,摄像机等)它是一个开源的项目并且免费,它们的官网在http://itween.pixelplacement.com/index.php打开官网后点击右上角GetiTween图标即可,或者在AssetStore商店中直接下载。我把iTween的源码仔细读了一遍,我感觉与其说它是处理动画的类,不如说它是处理数学的类。本文的最后,我会向大家总结,请仔细阅读。
移动模型时候用到的几个核心方法如下:
iTween.MoveTo():让模型移动到一个位置,它的底层函数是通过动态的修改模型每一帧的transform.position完成的,所以它会百分之百到达目标点,不会出现误差。
iTween.MoveFrom():它和上面的一样,iTween.MoveTo()是将模型移动到目标位置,而iTween.MoveFrom()是将模型从目标位置移动到原始位置。
iTween.MoveAdd()和iTween.MoveBy()底层实现一样,大家可以去看源码。处理移动时采用的是transform.Translate也就是API的平移,这样在处理移动的时候可能会出现一些误差,但是效果好点。
iTween.MoveUpdate():和iTween.MoveTo()差不多,只是它需要放在循环或者Update()中。
有了核心的移动方法后,我们就来了解iTween强大的核心参数,与事件。移动方法的参数都差不多,所以这里我就以MoveTo来做例子。直接上代码。
Move.cs绑在需要移动的游戏对象身上。
using UnityEngine;
using System.Collections;
public class MoveTT : MonoBehaviour {
// Use this for initialization
void Start () {
//键值对的形式保存iTween所用到的参数
//其实可以用这种方式建哈希表Hashtable hashTable = iTween.Hash(“path", paths, "easetype", iTween.EaseType.linear);
Hashtable args = new Hashtable ();
//这里是设置类型,iTween的类型有很多种,在源码中的枚举EaseType中
//例如移动的特效,先震动再移动、先后退再移动、先加速再变速、等等
args.Add ("easetype", iTween.EaseType.easeInOutExpo);
//移动的速度
args.Add ("speed", 10f);
//移动的整体时间。如果与speed共存那么优先speed
args.Add ("time", 1f);
//这个是处理颜色的。可以看源码的那个枚举
args.Add ("NameValueColor", "_SpecColor");
//延迟执行时间
args.Add ("delay", 0.1f);
//移动的过程中面朝一个点
args.Add ("looktarget", Vector3.zero);
//三个循环类型none loop pingPong(一般,循环,来回)
//args.Add("loopType", "none");
//args.Add("loopType", "loop");
args.Add ("looptype", "pingPong");
//处理移动过程中得事件
//开始发生移动时调用AnimationStart方法,5.0f表示它的参数
args.Add ("onstart", "AnimationStart");
args.Add ("onstartparams", 5.0f);
//设置接受方法的对象,默认是自身接受,这里也可以改成别的对象接受,
//那么就得在接受对象的脚本中实现AniamtionStart方法。
args.Add ("onstarttarget", gameObject);
//移动结束时调用,参数和上面类似
args.Add ("oncomplete", "AnimationEnd");
args.Add ("oncompleteparams", "end");
args.Add ("oncompletetarget", gameObject);
//移动中调用,参数和上面类似
args.Add ("onupdate", "AnimationUpdate");
args.Add ("onupdatetarget", gameObject);
args.Add ("onupdateparams", true);
//x y z 表示移动的位置
args.Add ("x", 5);args.Add ("y", 5);args.Add ("z", 1);
//当然可以写Vector3
//args.Add("position", Vector3.zero);
//最终让对象开始移动
iTween.MoveTo (gameObject, args);
}
//对象移动中调用
void AnimationUpdate (bool f) {
Debug.Log ("update:" + f);
}
void AnimationStart (float f) {
Debug.Log ("start:" + f);
}
void AnimationEnd (string f) {
Debug.Log ("end:" + f);
}
运行输出结果:
再看看iTween中的寻路算法,其实非常非常简单,我们几乎不用做任何事情,如下图所示,我们能清楚的看到编辑了一个简单地寻路,我们通过iTween来实现小人跑步到终点。
Path.cs绑定到主角身上即可
using UnityEngine;
using System.Collections;
public class Path : MonoBehaviour {
//向Inspector中拖入路径寻路中的所有点
public Transform [] paths;
// Use this for initialization
void Start () {
Hashtable args = new Hashtable ();
//设置路径的点
args.Add ("path", paths);
//设置类型为线性,线性效果会好一些
args.Add ("easetype", iTween.EaseType.linear);
//设置寻路的速度
args.Add ("speed", 10f);
//是否先从原始位置走到路径中第一个点的位置
args.Add ("movetopath", true);
//是否让模型始终面朝当前目标的方向,拐弯的地方会自动旋转模型
//如果你发现你的模型在寻路的时候始终都是一个方向那么一定要打开这个
args.Add ("orienttopath", true);
//让模型开始寻路
iTween.MoveTo (gameObject, args);
}
void OnDrawGizmos () {
//在scene视图中绘制出路径与线
iTween.DrawLine (paths, Color.yellow);
iTween.DrawPath (paths, Color.red);
}
}
运行后即可看到主角自动
寻路的效果。
如果你仔细阅读到这里你可能会想到,iTween做的东西有点像Mathf.Lerp()、Vector3.Lerp()、LookAt()等等这类的方法。假设不使用iTween这个类就用原生的API其实也可以实现上述的所有效果。只是iTween帮我们封装的更好些,平滑过渡的效果更好一些,而且还能增加一些特效。只是这些特效与动画全部都是iTween通过数学的方法计算出来的。因为底层它们使用的也是简单的移动旋转API中的方法。我觉得寻路的话可以使用Unity自带的方法(因为是官方提供的),处理一些简单的动画使用iTween还是挺不错的,因为更加形象。
代码下载地址:http://vdisk.weibo.com/s/omt5Q
这几天我还会把剩下的一些iTween的学习心得写在博客中,希望大家踊跃留言互相学习,互相进步。
6968

被折叠的 条评论
为什么被折叠?



