iTween研究院之学习笔记Move移动篇

摘要:
它的基本功能是通过动态修改模型每一帧的变换位置来完成的。在处理移动时,它使用transform.Translate,即API转换,使用System.Collections;MonoBehavior{voidStart(){//保存参数Hashtableargs=newHashtable();args.Add(“speed”,

         最近项目中需要加入一些模型移动的小动画,学习过程中发现了iTween这个类库。它主要的功能就是处理模型从起始点到结束点之间运动的轨迹。(移动,旋转,音频,路径,摄像机等)它是一个开源的项目并且完全免费,它们的官网在这里 http://itween.pixelplacement.com/index.php 打开网之后点击右上角Get iTween图标即可,或者在AssetStores商店中直接下载。 我把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 Move : MonoBehaviour
{	
 
	void Start()
	{
 
		//键值对儿的形式保存iTween所用到的参数
		Hashtable args = new Hashtable();
 
		//这里是设置类型,iTween的类型又很多种,在源码中的枚举EaseType中
		//例如移动的特效,先震动在移动、先后退在移动、先加速在变速、等等
		args.Add("easeType", iTween.EaseType.easeInOutExpo);
 
		//移动的速度,
		args.Add("speed",10f);
		//移动的整体时间。如果与speed共存那么优先speed
		args.Add("time",1f);
		//这个是处理颜色的。可以看源码的那个枚举。
		args.Add("NamedValueColor","_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.0表示它的参数
		args.Add("onstart", "AnimationStart");
		args.Add("onstartparams", 5.0f);
		//设置接受方法的对象,默认是自身接受,这里也可以改成别的对象接受,
		//那么就得在接收对象的脚本中实现AnimationStart方法。
		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",Vectoe3.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 来实现小人跑步到终点。

 

iTween研究院之学习笔记Move移动篇第1张

 

 

Path.cs  绑在主角身上即可。

usingUnityEngine;
usingSystem.Collections;
 
publicclassPath:MonoBehaviour{
 
//路径寻路中的所有点
publicTransform[]paths;
 
voidStart()
{
    Hashtableargs=newHashtable();
    //设置路径的点
    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);
    }
 
    voidOnDrawGizmos()
    {
    //在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研究院之学习笔记Move移动篇》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#中怎样将数组的顺序打乱随机排序转载:pyqt线程间通过 信号/槽 通信下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

jQuery.ajax() datatype:“json" 转换失败

当使用jQuery.ajax() 时,如果设置dataType:"json",如果返回的字符转换出错则不会调用success方法,而进入error方法,控制台中也不会出现错误信息 如果没有定义error方法,则$.ajax()会默默的结束。 为了避免这种现象出现:   1.写$.ajax()时定义error方法,对错误进行处理。   2.服务器端生成jso...

MacBookPro磁盘空间不够

256G的SSD还是快被占满了,剩余12G,本来一切运行正常。 要往U盘里拷点资料,突然电脑就罢工了,cleanMyMac 显示磁盘容量剩余 1.8G。 finder 罢工,无法重启,无法强退。 无法拷贝,无法删除文稿,无法删除应用,无法清空废纸篓。 用CleanMyMAC 卸载应用无效。 按照系统提示清理空间,资源浏览器中的内容无法删除(估计底层还是调用...

【菜鸟学php】小菜鸟由帝国备份王在Wamp环境下打开500错误浅谈PHP程序员

===================问题情况描述=================== 小弟一直在玩discuz论坛开源程序,这个论坛程序经常涉及到论坛搬家的问题。 今天我在本地Wamp环境下,用开源软件帝国备份王2010进行数据库备份数据,结果打开发现报错500! 这真是坑爹了,回想下以前自己使用这个开源程序进行备份也不下于十几次了,大部分都正常成功,...

解决JS文件页面加载时的阻塞

关于页面加载时的时间消费,许多书中都做出了介绍,也提出了很多种方法。本文章就详细介绍XHR注入。 概述:JS分拆的方法 1.XHR注入:就是用ajax异步请求同域包含脚本的文件,然后将返回的字符串转化为脚本使用,该方法不会造成页面渲染和onload事件的阻塞,因为是异步处理,推荐使用。 2.iframe注入:加载一个iframe框架,通过使用iframe框...

java中的“空格”用trim()无法去除?原来是这样!

1、原因:   从txt文件中读取一些数据导入mysql数据库,导入数据库之后发现有一个字段的前面有两个“空格”,后来在代码里我尝试用trim()、replace()等方法去除,发现怎么也去不掉,于是我将字符串里的这个“空格”的ASCII码输出,输出12288,查询资料后发现这个字符是全角空格,用trim()、replace()等方法是无法去除的,采用如下...

Groovy 学习手册(5)

8. 函数式编程 函数式编程(FP)是一种编程风格,侧重于函数和最小化状态的变化(使用不可变的数据结构)。它更接近于用数学来表达解决方案,而不是循序渐进的操作。 在函数式编程里,其功能应该是“无副作用”(不会改变外部功能),参考透明的(一个函数每次传递相同的参数,返回相同的值)。 函数式编程可以被看作是一种更常见的命令式编程的替代,它更接近告诉计算机遵循每...