小地图导航

在我们打游戏的时候可以点击小地图进行导航移动 那么这个导航移动的原理是什么呢?

有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);
        }



    }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值