一、使用了以下几个小功能:
- 预制件,用来制作障碍物。
- 使用AI导航,制作导航网格。
- 加载Nav Mesh Agent组件使用导航算法。
- 鼠标点击射线。
- 将普通图片转换为sprite图片。点击图片在inspector中选择Texture Type->Sprite
- 通过计算每两个导航点之间的距离和角度,设置箭头的方向。
注意:
1.预制件的修改一定要对层次途图中的物对象点击apply.。
2.将障碍物和地形都设置为nav static。
3.制作箭头预制件,首先新建一个空的物体,将名字修改为方便识别的名字,然后在该空物体下再新建一个空物体,并添加sprite render组件。然后将sprite箭头图片拖入Sprite其中。记住如果添加进去的sprite图片的箭头方向要与Z轴保持一致,如果不一致,在子物体中调整。然后保存,拖入预制件中。
3.其实最开始是准备用linerender画箭头,但是后来发现linerender画的线不好看,用预制件画好看些。
4.还有就是人物不会一定严格按照画的线走,感觉有点动态走的样子。
代码:
(1)仅仅只有自动导航的代码,不包含使用预制件或者lineRender画路线。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class UseNavAgent : MonoBehaviour {
private Transform playerTF;
private GameObject player;
private NavMeshAgent aiNav;
private Vector3 desPositon;
private NavMeshPath navPath;
// Use this for initialization
void Start () {
player = this.gameObject;
//AnchorManager.Instance.Init(player);
playerTF = GetComponent<Transform>();
aiNav = playerTF.GetComponent<NavMeshAgent>();
aiNav.speed = 0.5f;
navPath = new NavMeshPath();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
//Debug.Log("pre_num :" + AnchorManager.Instance.GetChildrensNum().ToString() );
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity))
{
aiNav.SetDestination(hit.point);
aiNav.CalculatePath(hit.point, navPath);
}
}
}
}
(2)使用linerender画出路线,同时使用在路线的关键点放置圆球。
这个需要两个文件,一个负责导航,一个负责画线和放置关键点圆球。
AnchorManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AnchorManager : MonoBehaviour {
// Use this for initialization
private GameObject anchorPoint;
private GameObject parentsObject;
private LineRenderer lineRenderer;
private static AnchorManager anchorPoints;
public List<Transform> m_allPoints;
public int SEGMENT_COUNT = 20;
public static AnchorManager Instance
{
get
{
if (anchorPoints == null)
anchorPoints = new AnchorManager();
return anchorPoints;
}
}
public int GetChildrensNum()
{
if(parentsObject == null)
{
Debug.Log("parent object null !");
return 0;
}
//parentsObject.GetComponentsInChildren<Transform>().Length;
Transform[] gameObjects = parentsObject.GetComponentsInChildren<Transform>();
foreach (Transform gameObject in gameObjects)
{
if (gameObject.name == "ParentsObject")
{
continue;
}
Debug.Log("ObjectName = " + gameObject.name);
}
return gameObjects.Length - 1;
}
private</