接下来我们布置场景,我们的预期结果(功能分析)是:
? ? ? ? 坦克沿路径循环移动?
首先进入资源商店准备下载角色模型资源,
搜索Rocket
选择场景里的Desert_land_2场景模板 放入Hierarchy,完全解压缩后再拖拽至场景中,
移动资源场景物体后,将导入场景删除,
选择地形中第50块砖ctrl + d 后将空缺连接成循环回路,
我们通过使小球作为引导使坦克进行导航,所以先创建3D小球作为预制体引导,
并起名字叫WayPoint
?为了防止小球本身带的碰撞器使坦克产生力的作用,将碰撞器组件在小球身上移除,
将小球位置归零,
创建预制体文件夹Prefabs,并将路径点WayPoint放进预制体文件夹,删除场景中的WayPoint,
将坦克物体的子物体摄像机Camera拖拽出来,
删除坦克物体自带脚本,
删除坦克组件里血条组件,
将坦克对象起名字为Tank,
将小球预制体添加Material组件设置为红色红,拖拽至场景中,
?将小球改名为WayPoint0
ctrl + d 复制 ?改名为WayPoint1
ctrl + d 复制 ?改名为WayPoint2
ctrl + d 复制 ?改名为WayPoint3
ctrl + d 复制 ?改名为WayPoint4
ctrl + d 复制 ?改名为WayPoint5,构成循环回路
在WayPoint0路径点0右键创建空父物体命名为PathA路径A,
将其他路径点1-5拖拽至PathA作为子物体,
命名为PathA路径A,
新建脚本命名为导航Navigation
双击脚本编写代码:
using UnityEngine;
public class Navigation : MonoBehaviour{
????//路径点数组
????public Transform[] waypointArray;
? ? public float speed = 0.015f; ??//坦克移动速度
????public int currentIndex = 0; ??//当前路径下标
????void Start(){
????????//全局查找物体
????????Transform path = GameObject.Find("PathA").transform;
? ? ? ? if (path != null){
????????????//print(path.childCount);
????????????//给数组开辟内存
????????????waypointArray = new Transform[path.childCount];
????????????//将每一个路径点保存到数组中
????????????for (int i = 0; i < waypointArray.Length; i++)
? ? ? ? ? ? ? ? waypointArray[i] = path.GetChild(i);
? ? ? ? }
? ? ? ? else
? ? ? ? ? ? Debug.LogError("查找路径点父物体失败,仔细检查父物体名字");
? ? }
? ? void Update(){
????????//transform.Translate(Vector3.forward * Time.deltaTime * 2f);
????????//通过算法给坦克纠正方向
????????//方向向量
????????Vector3 direction = waypointArray[currentIndex].position - transform.position;
? ? ? ? transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(direction), 0.1f);
? ? ? ? transform.Translate(Vector3.forward * speed);
? ? ? ? if (direction.sqrMagnitude < 0.1f){
? ? ? ? ? ? currentIndex++;
? ? ? ? ? ? if (currentIndex > waypointArray.Length - 1)
? ? ? ? ? ? ? ? currentIndex = 0;
? ? ? ? }
? ? }
}
将导航脚本挂载在Tank物体上,
观察PathA路径是否0-5顺序进行,
注意:WayPoint路径点由上至下执行,注意摆放顺序
最后关闭路径点的渲染,
运行即按照规定路径导航,
End.