U3D中,常见的移动方法:
1.从a点移动到b点:
①Vector3.MoveToward方法 a.transform.position = Vector3.MoveTowards(a.transform.position, b.transform.position, Time.deltaTime * speed); (Time.deltaTime*speed,时间×速度=每帧移动的距离)
②transfrom.translate方法 瞬间移动(闪现):transform.Translate(b.transform.position - a.transfrom.position); 有过程的移动,有两种: I 匀速移动,原理同MoveToward: transfrom.Translate((b.transform.position-a.transform.position).normalized * Time.detalTime * speed); (向量归一化,用Time.detalTime*speed来表示每帧移动的距离)
II 先快后慢,主要因为a向量-b向量,在a移动过程中会不断变小: transform.Translate((a.transfrom.posiiton-b.transfrom.position) * Time.detalTime *toslow); ((a.transfrom.posiiton-b.transfrom.position) * Time.detalTime代表每帧移动的距离,假如你的机器一秒运行60帧,那么Time.detalTime = 1/60,也就是说,用这个公式,在机器稳定运行的情况下,1s内一定会从a到b。因此后面乘了一个toslow,例如将toslow取0.1、0.01、0.2之类的值,就能让它慢下来,且遵循运动先快后慢的规律,记住,这里的toslow并不代表速度,只是单纯为了把原先的1s内到达,变成好几秒后到达)
③鼠标方法,点哪里到哪里 I 使用射线+Unity自带的寻路组件Nav mesh agent if(Input.GetMouseButtonDown(0)) { ??Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); ??RaycastHit hit; ??//后面两个参数分别是射线长度、只检测Layer为Deafult层的物体 ??if(Physics.Raycast(ray,out hit,100,LayerMask.GetMask(“Default”),)) ??{ ????//根据hit.point可以获得对应点的坐标,这里不详写 ??} } 获得了点之后,在地图上完成Bake,并调整好Navigation Area,接着使用: ??a.SetDestination(hit.point); 这样也可以实现a到b的移动
2.单纯往某个方向移动:
当你理解了上面a到b的方法之后,应该就能够理解Unity中一些常见的移动方式了,基于这里,对上面的代码略微修改,就能达到这个目的了,这里不再赘述。
|