Itween制作物体随机移动的效果

用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;
  }
}

你可能感兴趣的:(Itween制作物体随机移动的效果)