欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity AI导航寻路系统

程序员文章站 2024-03-19 18:27:40
...

第一步搭建场景

两个平面,一个立方体,一个胶囊,一座桥(立方体)

Unity AI导航寻路系统

让这个胶囊自主找立方体

将除胶囊外其他场景中物体设为静态 Unity AI导航寻路系统

Unity AI导航寻路系统

打开AI导航

Unity AI导航寻路系统

烘培一个导航网格

Unity AI导航寻路系统

Unity AI导航寻路系统

给胶囊添加智能体

Unity AI导航寻路系统

Unity AI导航寻路系统

Unity AI导航寻路系统

编辑AI寻路脚本

Unity AI导航寻路系统

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class AINavigation : MonoBehaviour
{
    public GameObject target;
    private NavMeshAgent agent;

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.destination = target.transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

脚本绑定胶囊上

指定cube

效果

Unity AI导航寻路系统

Unity AI导航寻路系统

现在要实现另一个功能,就是鼠标点击哪儿,物体就往哪儿走。

这个功能在游戏中很常用。

发射一个射线,射线和地板相交的点,就是要走到的位置。

代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class AINavigation : MonoBehaviour
{
    public GameObject target;
    private NavMeshAgent agent;

    // Start is called before the first frame update
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.destination = target.transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButton(0))
        {
            RaycastHit hit;
            if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit))
            {
                agent.destination = hit.point;
            }
        }
    }
}

效果

鼠标点击哪就走到哪儿,有内味儿了

而且还可以自动避障哦

Unity AI导航寻路系统

按下图修改场景

桥*2、胶囊*2

Unity AI导航寻路系统

新增的桥设置静态

场景已改变,自主导航网格需要重新烘培

Unity AI导航寻路系统
效果

默认走最短路径

Unity AI导航寻路系统

面板解释

Unity AI导航寻路系统

跳跃不超过0.4m,坡度不超过45°

自动导航的相关限制参数

Unity AI导航寻路系统

现在让一个胶囊指定走一个桥,不能走另一个

Unity AI导航寻路系统

选择胶囊,设置智能寻路属性

能走哪些区域,不能走哪些区域,设置好

Unity AI导航寻路系统

指定两个桥的导航所属区域,一个front,一个back

Unity AI导航寻路系统

一定要记住,修改参数后要重新烘焙

区域图

Unity AI导航寻路系统

效果

Unity AI导航寻路系统

搭建场景然后烘培

Unity AI导航寻路系统

正常情况下,这两个胶囊会在墙下面停下来,够不着立方体

现在要实现让两个胶囊走天路,去够它

把导航网格不连接的区域把它link起来

给那个cube添加off mesh link组件

Unity AI导航寻路系统

Unity AI导航寻路系统

再烘培一下

已连接

Unity AI导航寻路系统

但是现在还是原样,不能够着

要设置烘培高度

Unity AI导航寻路系统

烘培后区域变化

Unity AI导航寻路系统

效果

Unity AI导航寻路系统

这个cube只是作为一个连接物,并不从上面过(逻辑有点奇怪)

导航障碍组件

修改场景

Unity AI导航寻路系统

为桥添加导航障碍组件

Unity AI导航寻路系统

编写脚本

Unity AI导航寻路系统

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class NMOCtrl : MonoBehaviour
{
    private NavMeshObstacle obs;
    // Start is called before the first frame update
    void Start()
    {
        obs = this.GetComponent<NavMeshObstacle>();
        obs.enabled = true;
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetButtonDown("Fire1"))
        {
            if (obs)
            {
                obs.enabled = false;
                this.GetComponent<Renderer>().material.color = Color.green;
            }
        }
        if (Input.GetButtonUp("Fire1"))
        {
            if (obs)
            {
                obs.enabled = true;
                this.GetComponent<Renderer>().material.color = Color.red;
            }
        }
    }
}

绑定到桥上即可

修改参数

高度要大于1,不然没有阻碍效果!

Unity AI导航寻路系统

效果

Unity AI导航寻路系统

Unity AI导航寻路系统

Unity AI导航寻路系统

固定路线巡航

创建一个空对象

创建n个立方体做路径点

Unity AI导航寻路系统

创建脚本

Unity AI导航寻路系统

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class AIPath : MonoBehaviour
{
    public NavMeshAgent nma;
    public Transform[] pathpoints;
    int currentpointindex;
    // Start is called before the first frame update
    void Start()
    {
        nma.SetDestination(pathpoints[0].position);
    }

    // Update is called once per frame
    void Update()
    {
        if(nma.remainingDistance<nma.stoppingDistance)
        {
            currentpointindex = (currentpointindex + 1) % pathpoints.Length;
            nma.SetDestination(pathpoints[currentpointindex].position);
        }
    }
}

Unity AI导航寻路系统

AI(胶囊)

胶囊智能体指定N.M.A.

把路径点拖入下面的数组

Unity AI导航寻路系统

往这个字样上拖

Unity AI导航寻路系统

场景静态化并烘培

运行

效果

无限循环

Unity AI导航寻路系统

有限路径代码(停在最后一个路径点)

if(nma.remainingDistance<nma.stoppingDistance && currentpointindex<(pathpoints.Length-1))

效果

Unity AI导航寻路系统

相关标签: Unity 游戏设计