Unity 显示AI导航路线

本文介绍了在Unity中实现AI导航的方法,包括创建导航网格、使用Nav Mesh Agent组件、鼠标点击交互以及显示导航路线。重点讲解了如何利用预制件绘制路径,克服linerender的视觉效果问题,并提供了相关代码示例。同时,文中提到了一些注意事项,如障碍物和地形的设置、预制件的创建以及使用linerender或预制件显示路线的优缺点。
摘要由CSDN通过智能技术生成

一、使用了以下几个小功能:

  1. 预制件,用来制作障碍物。
  2. 使用AI导航,制作导航网格。
  3. 加载Nav Mesh Agent组件使用导航算法。
  4. 鼠标点击射线。
  5. 将普通图片转换为sprite图片。点击图片在inspector中选择Texture Type->Sprite
  6. 通过计算每两个导航点之间的距离和角度,设置箭头的方向。

注意:
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</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

城墙郭外斜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值