Unity游戏开发——新发教你做游戏(五):导航系统Navigation

一、前言

文章列表
Unity游戏开发——新发教你做游戏(一):打开游戏开发新世界的大门
Unity游戏开发——新发教你做游戏(二):60个Unity免费资源获取网站
Unity游戏开发——新发教你做游戏(三):3种资源加载方式
Unity游戏开发——新发教你做游戏(四):角色移动控制
Unity游戏开发——新发教你做游戏(五):导航系统Navigation
Unity游戏开发——新发教你做游戏(六):教你2个步骤实现摇杆功能
Unity游戏开发——新发教你做游戏(七):Animator控制角色动画播放
在这里插入图片描述
本工程Demo我已上传到GitHub,感兴趣的同学可以下载下来学习。
GitHub工程地址:https://github.com/linxinfa/Unity-RpgGameDemo
在这里插入图片描述
嗨,大家好,我是新发,上一篇文章我们讲了角色移动控制。最后提出了个问题,限制角色在地图中移动,而不会超出地图外面?这篇文章我就来说下实现方案:Unity导航系统Navigation

二、通过Navigation实现角色移动区域的限制

NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术,将游戏中复杂的结构组织关系简化为带有一定信息的网格,在这些网格的基础上通过一系列的计算来实现自动寻路。

2.1、烘焙地面,生成NavMesh

将带有 MeshRendererCollider组件的地形设置为 Navigation Static
在这里插入图片描述
然后点击菜单Window - AI - Navigation
在这里插入图片描述
此时会打开Navigation窗口,点击Bake分页,再点击Bake按钮即可开始烘焙地面。
在这里插入图片描述
烘焙成功,即可看到地面上出现一个蓝色的网格,场景目录中也可以看到生成了一个NavMesh(导航网格)文件。
在这里插入图片描述
我可以添加一些Cube作为障碍物,然后重新烘焙。(注意Cube也要设置为 Navigation Static
在这里插入图片描述

2.2、主角挂上NavMeshAgent

我们在主角上挂上NavMeshAgent主角,移动主角,会发现主角只能被限制在NavMesh网格中移动。
在这里插入图片描述
由于我们是通过摇杆来控制角色移动,所以没有用到自动寻路,只是用NavMeshAgent来限制角色的移动范围。
不过也还是顺带说一下自动寻路的具体操作。

三、通过Navigation实现自动寻路

角色身上挂了NavMeshAgent组件,我们就可以调用NavMeshAgentSetDestination的方法实现自动寻路了。
例:

navAgent.SetDestination(targetPos);

如何实现鼠标点击某个点,让角色走过去呢。

思路
鼠标点击,从摄像机处发出射线检测,与地面碰撞得到一个目标坐标,然后调用SetDestination接口。

具体代码
如下,将脚本挂在主角身上

//AutoPathFinding.cs 挂在角色的gameobject上
using UnityEngine;
using UnityEngine.AI;

public class AutoPathFinding : MonoBehaviour
{
    private NavMeshAgent m_navAgent;
    private Transform m_selfTrans;
    private Vector3 m_targetPos;
    private bool m_isMoving = false;
    
    void Awake()
    {
    	// 给角色挂上NavMeshAgent组件
        m_navAgent = gameObject.GetComponent<NavMeshAgent>();
        m_selfTrans = transform;
    }
    
    void Update()
    {
        if(input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit))
            {
                m_targetPos = hit.point;
                // 自动寻路移动到目标点
                m_navAgent.SetDestination(m_targetPos);
                m_isMoving = true;
            }
        }
        
        if(Vector3.Distance(m_selfTrans.position, m_targetPos) <= 0.1f)
        {
            m_isMoving = false;
        }
    }
}

效果如下
在这里插入图片描述
好了,下一篇我将讲讲UGUI摇杆的具体实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林新发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值