Unity使用NaveMesh实现第一人称视角移动

这篇具有很好参考价值的文章主要介绍了Unity使用NaveMesh实现第一人称视角移动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

Navemesh寻路系列文章


文章目录

目录

系列文章目录

文章目录

前言

一、NavMeshPath是什么?

二、使用步骤

1.引入库

2.读入数据

总结



前言

navemesh已经大量使用到游戏中,但大部分寻路都是使用SetDestination函数,给予一个目标点移动,第一人称直接操控移动的文章很少。

为了解决这个问题,特此出了这篇文章。


这篇博客主要使用NavMeshPath,通过得到移动数组,最终实现正确移动。

一、NavMeshPath是什么?

由导航系统计算的路径。

路径以路标列表的形式表示,存储在 corners 数组中。这些路标不是由用户脚本直接设置的,但 NavMesh.CalculatePath 函数和 NavMeshAgent.path 属性会返回分配有正确路标的 NavMeshPath。

corners 路径的角点。(只读)
status 路径状态。(只读)

二、使用步骤

1.引入库

代码如下:

using UnityEngine;
using UnityEngine.AI;

2.读入数据

代码如下(示例):

  NavMeshAgent.CalculatePath(_pos, m_NavMeshPath);

该处可以获取到navemesh的寻路路径。

然后使用位移实现点到点之间的移动,目前的写法可以适用于上下坡等不平整地图。

完整代码如下:

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


/// <summary>
/// 人物平滑移动器
/// </summary>
public class AgentMove : MonoBehaviour
{

    public float speed = 0.5f;


    // Start is called before the first frame update
    void Start()
    {
        NavMeshAgent = transform.gameObject.GetComponent<NavMeshAgent>();
        m_NavMeshPath = new NavMeshPath();      
    }



    private NavMeshAgent NavMeshAgent;

    private NavMeshPath m_NavMeshPath;

    /// <summary>
    /// 前一个路径点索引
    /// </summary>
    private int m_previousIndex = 0;

    /// <summary>
    /// 后一个路径点索引
    /// </summary>
    private int m_currentIndex = 1;

    private bool isUpdate = false;

    void GetNav(Vector3 _pos)
    {
        isUpdate = true;
        Debug.LogError(transform.position + "  " + _pos);
        transform.LookAt(_pos);
        //计算NavMeshPath
        NavMeshAgent.CalculatePath(_pos, m_NavMeshPath);
        //初始化路径点索引
        m_previousIndex = 0;
        m_currentIndex = 1;

        //if (m_NavMeshPath.corners.Length>1)
        //transform.position = m_NavMeshPath.corners[m_CurrentPathPointIndex];
        //Debug.Log(m_NavMeshPath.corners[m_CurrentPathPointIndex]+"  "+ m_NavMeshPath.corners.Length);

    }

    /// <summary>
    /// 移动到目标点(NavMeshPath.corners第0个路径点是当前游戏物体所在位置,以此类推)
    /// </summary>
    public void RunToTarget()
    {
        isUpdate = m_currentIndex <= m_NavMeshPath.corners.Length - 1;
        //防止数组越界
        if (!isUpdate) return;

        var _pos = transform.position;
        _pos.y = m_NavMeshPath.corners[m_currentIndex].y;
        //如果游戏物体坐标与当前路径点坐标距离小于0.1即可认为已抵达,可以向下一个路径点导航
        if ((_pos - m_NavMeshPath.corners[m_currentIndex]).magnitude <= 0.1f)
        {
            //递增路径点索引
            m_previousIndex++;
            m_currentIndex++;
            //防止数组越界
            if (m_currentIndex > m_NavMeshPath.corners.Length - 1)
            {
                //Debug.LogError(m_NavMeshPath.corners[m_CurrentPathPointIndex]);               
                //处理动画切换,请无视
                return;
            }

            //处理人物转向,请无视
        }

        //匀速运动。计算出前一个路径点到当前路径点方向,然后移动
        transform.Translate(
            ((-m_NavMeshPath.corners[m_previousIndex] +
              m_NavMeshPath.corners[m_currentIndex]).normalized) *
            (/*Time.deltaTime **/ speed/* *2f*/), Space.World);

        Debug.Log(transform.position + "  " + m_NavMeshPath.corners[m_currentIndex]);
    }


    public void Update()
    {
        var _fx = 1;
        if (Input.GetKey(KeyCode.W))
        {
            GetNav(transform.position + Vector3.forward * _fx);
        }
        if (Input.GetKey(KeyCode.A))
        {
            GetNav(transform.position - Vector3.right * _fx);
        }
        if (Input.GetKey(KeyCode.S))
        {
            GetNav(transform.position - Vector3.forward * _fx);
        }
        if (Input.GetKey(KeyCode.D))
        {
            GetNav(transform.position + Vector3.right * _fx);
        }

        if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D))
        {
            isUpdate = false;
        }

        //开始导航
        if(isUpdate)RunToTarget();
    }
}

实现效果截图:

Unity使用NaveMesh实现第一人称视角移动

Unity使用NaveMesh实现第一人称视角移动

Unity使用NaveMesh实现第一人称视角移动

使用WASD即可控制移动。 


总结

 以上就是今天要讲的内容,本文仅仅简单介绍了NavMeshPath的使用,而NavMeshPath提供了大量能使我们快速便捷地处理数据的函数和方法。(吐槽下~官方总结)文章来源地址https://www.toymoban.com/news/detail-436713.html

到了这里,关于Unity使用NaveMesh实现第一人称视角移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】第一人称实现键盘移动WASD

    背景:开发影院场景 环境:Unity2021.3 功能:WASD键实现移动、鼠标左右平滑实现转向 代码:挂载在相机的父物体上(好像是因为相机本身不支持移动?如有误望指正)

    2024年02月12日
    浏览(40)
  • Unity实现第一人称移动(胎教级教学)

    第一步 需要一个场景和一个player作为操作角色,并且 在player子目录创建一个camera 作为视角 这里演示我就随便 创建一个plane 作为 地面 和 一个sphere 作为 player 然后调整好player的位置不要与地面镶嵌就像这样 然后需要给地面(你们自己的场景)和player添加一个Collider组件 在属性

    2024年04月13日
    浏览(34)
  • 【Unity】第一人称视角开发

    我的需求是在Unity构建一个第一人称视角,实现移动跳跃功能。 主要参考的是这篇博文提供的方案,不过该方案为了只允许一次跳跃,单独在人物底部构建了一个空对象,我无需此限制,因此对其进行了简化。 创建场景对象如下: Ground 地形对象 Player 胶囊体视作人物 Cube 参

    2023年04月21日
    浏览(39)
  • Unity 第一人称视角 角色控制脚本

    使用方法 WSAD 控制四个方向的移动 鼠标 控制角色的水平、竖直朝向 空格 控制角色跳跃 配置 需要指定玩家的第一人称摄像头    效果 代码 解析 Move函数 控制角色前后左右移动,改变的是位置,并不会改变角色朝向 View函数 控制角色左右旋转,朝上或朝下看 注意:在水平方

    2023年04月19日
    浏览(34)
  • Unity例子——第一人称视角的角色控制器

    本文是为了前文Unity四元组的举例示范,为了让读者更好地理解。 效果是实现一个可以由鼠标进行方向操作,键盘进行移动操作的任务。 此为效果视频: 1687597097844 下面进行教学: 新建一个场景,放置一个plane作为地板,尺寸自定 创建一个新的material挂在plane上 再地板上放置

    2024年02月10日
    浏览(50)
  • Unity3D中实现Player的第一人称视角

    效果,上面为Scene场景,下面为Game场景 0创建地形,当然可以先简单的创建一个空白的Terrain。这里我已经对地形进行了初步的编辑和渲染。 1.在Hierarchy视图中右键创建一个胶囊体(Capsule)作为Player,添加好后重置胶囊体的位置,并且调整胶囊体在一个合适的位置。  2.将Main

    2023年04月08日
    浏览(51)
  • Unity3D中实现人物的第一人称视角

    打开unity创建一个场景地图可以添加一个Plane作为地面 在Hierarchy视图中右键创建一个胶囊体(Capsule)作为Player,添加好后重置胶囊体的位置,并且调整胶囊体在一个合适的位置。 将Main Camera拖拽到到player内作为子对象,重置一下Main Camera的transform,并且再调整一下它在player中

    2024年02月11日
    浏览(73)
  • 【0到1学习Unity脚本编程】第一人称视角的角色控制器

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :【0到1】Unity脚本游戏开发宝典 将摄像机变为胶囊体的子物体,按住 ctrl +shift +F 调整视野。让他变成胶囊体的眼睛 判断要前进时按照哪个

    2024年02月05日
    浏览(42)
  • 【游戏开发实战】Unity手游第一人称视角,双摇杆控制,FPS射击游戏Demo(教程 | 含Demo工程源码)

    一、前言 嗨,大家好,我是新发。 有同学私信我,问我能不能写一篇Unity手游第一人称视角控制的教程, 那么,今天就来做个 Demo 吧~ 注: Demo 工程源码见文章末尾 最终效果如下: 二、实现方案 1、无主之地,第一人称视角 第一人称视角的游戏大家应该不陌生,比如《无主

    2023年04月08日
    浏览(53)
  • Unity解决:3D开发模式第三人称视角 WASD控制角色移动旋转 使用InputSystem

    Unity版本:2019.2.3f1 目录  安装InputSystem 1:创建InputHander.cs脚本 挂载到Player物体上 获取键盘输入WADS 2.创建PlayerLocomotion.cs挂载到Player物体上,控制物体移动转向   菜单栏/Window/Package Manager/Input System  工程面板内 右键--创建Input Actions  选中New Controls改名为PlayerControls 然后属

    2024年02月06日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包