用ITween这个插件制作物体的各种运动效果很方便,而且可以描述的运动种类很多,下面是一个用它实现某个物体随机运动的例子,可以调节的参数有物体运动的速度,物体主要朝哪个方向运动,物体随机的范围,运动的坐标系。
public class RandomMove:MonoBehaviour
{
public float intervalTime;//每次移动间隔的时间
public Vector3 dir;//运动的主方向
public Vector3 bounds;//随机运动的边界
[Tooltip("Dont modify at runtime")]
public bool localPos=true;//Itween 的一个参数,是否是本地坐标
public Itween.EaseType easeType=Itween.EaseType.easeInOutQuad;
private bool move=false,stopped=true;
private Vector3 initialPos;//记录物体的初始位置
void Start()
{
initialPos=getPos();
}
void ItweenMove(Vector3 nextPos)
{
Hashtable ha=new Hashtable();
ha.Add("position",nextPos);//运动的目标位置
ha. Add("islocal",localPos);
ha.Add("time",intervlTime);//每次运动的时间
ha.Add("eastype",easeType);
iTween.MoveTo(gameObject,ha);
}
//重置物体的位置
//这个函数是在Inspector的脚本中加一个触发事件,就是Inspector上脚本右侧那个小下拉菜单中
[ContexMenu("Reset Pos")]
public void ResetPos()
{
if(localPos)
{
transform.localPosition=initialPos;
}
else
{
transform.position=initialPos;
}
}
void OnEnable()
{
move=true;
if(stopped)
StartCoroutine(MoveToPos());
}
void OnDisable()
{
move=false;
}
IEnumerator MoveToPos()
{
stopped =false;//用stopped判断协程是否开始,结束,如果stopped为false,说明协程正在运行,此时不能再startCoroutine(),否则会发生错误。
Vector3 nextPos=getPos();
while(move)
{
float randomX=Random.Range(-bounds.x,bounds.x);
float randomY=Random.Range(-bounds.y,bounds.y);
float randomZ=Random.Range(-bounds.z,bounds.z);
nextPos+=new Vector3(randomX,randomY,randomZ);
ItweenMove(nextPos);
yield return new WaitForSeconds(intervalTime);
}
stopped=true;
}
//返回物体的localPosition||position
Vector3 getPos()
{
return localPos?transform.localPosition:transform.position;
}
}