在我们打游戏的时候可以点击小地图进行导航移动 那么这个导航移动的原理是什么呢?
有2个思路 第一个思路是运用 UI 坐标进行转化
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class MapMove : MonoBehaviour, IPointerClickHandler
{
public static Vector3 navpos;//点击后的地形位置
public Vector2Int pos;//地图块坐标
//点击
public void OnPointerClick(PointerEventData eventData)
{
//计算点击位置相对于当前地图块的位置
Vector2 mypos = (transform as RectTransform).InverseTransformPoint(eventData.position);
//地图块轴心在中间所以加上一半的宽高
mypos += (transform as RectTransform).sizeDelta / 2;
//计算位于地图上的位置 = 点击位置 / 比例尺 + 地图块坐标 * 地形宽高
Vector2 v2 = mypos / PlaneManager.mapp + pos * PlaneManager.wh;
//计算该位置高度
float y = MyPlane.Turbulence(v2.x, v2.y, PlaneManager.wh) * 10;
//点击的位置坐标(静态可在任意位置获取)
navpos = new Vector3(v2.x, y, v2.y);
Debug.Log(navpos);
}
}
一般的情况下面 人物的位置是左下角 0,0 的位置 地图的锚点也就是 左下角
、
第二种也差不多
我们要是想绘制出来导航的路径 在小地图映射出来 就要求拐点
效果
首先存放预制体
GameObject prefab;
List<GameObject> Pool = new List<GameObject>();
private void Update()
{
if (GameManager.Instance.IsMove) //是否可以移动
{
if (meshAgent==null) //有没有导航组件
{
meshAgent = gameObject.AddComponent<NavMeshAgent>();
}
}
if (meshAgent!=null)
{
if (meshAgent.remainingDistance > 0)
{
SetDisMove(meshAgent.pathEndPosition); //设置移动
}
}
}
public void SetDisMove(Vector3 endpos) //点击方法
{
meshAgent.isStopped = false;//停止导航
meshAgent.SetDestination(endpos); //移动
poss = new Vector3[] { transform.position };//计算开始数组
poss = poss.Concat(meshAgent.path.corners).ToArray(); //拼接路径
poss = poss.Concat(new Vector3[] { endpos }).ToArray();
for (int i = Pool.Count - 1; i >= 0; i--)
{
Destroy(Pool[i]);//清除对象
}
Pool.Clear();
List<Vector3> path = new List<Vector3>();
//求拐点
for (int i = 1; i < poss.Length; i++)
{
float num = Vector3.Distance(poss[i - 1], poss[i]) / 10;//具体数量
for (int j = 0; j < num; j++)
{
path.Add(Vector3.Lerp(poss[i - 1], poss[i], (float)j / num));//添加间距位置
}
}
path.Add(poss[poss.Length - 1]); //结尾位置
for (int i = 0; i < path.Count; i++)
{
RectTransform go = Instantiate(prefab.gameObject, MapManager.Instance.MinMap.transform).transform as RectTransform;
go.anchoredPosition = new Vector2(path[i].x, path[i].z);
Pool.Add(go.gameObject);
}
}