GDPU unity游戏开发 寻路与导航

学会寻路,出门在外,身份不是他给的,他做不了你一直的导航。

角色寻路

角色控制器替换为普通的角色控制器,给实验九的地形增加NavMesh Surface组件,然后给角色增加NavMesh Agent组件,并选择合适的参数。通过脚本来实现自动寻路。

结合实验十的动画角色,将角色控制器替换为动画角色,并通过脚步来实现自动寻路。采用寻路系统后,角色的移动是由寻路系统来完成的,也就是说寻路系统会直接修改角色的坐标。停用动画的root motion,然后将寻路系统agent的速度传递给动画角色的混合树,由动画控制角色的动作,但角色的实际移动仍然由寻路系统控制。

先找到菜单的AI组件,旧版的看着办,新版的跟着来。新版的要在package下好包找到registry。

下好后,在windows菜单下可以找到navigation面板。

按照题设分别给一个新的胶囊体跟地形分别加NavMesh Agent组件与NavMesh Surface组件。然后给新的胶囊体挂载寻路的脚本。

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

public class navmeshAgent : MonoBehaviour
{
    public Transform targetpostion;
    void Update()
    {
        NavMeshAgent agent = this.GetComponent<NavMeshAgent>();
        agent.destination = targetpostion.position;
        
    }
}

放置寻路的物体最好接近一下地面,要设置目标物体的位置。让目标物体更灵活一点,可以通过射线检测,通过点击这个目标物体,让它运动,挂载射线检测的脚本到相机上。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEngine.GraphicsBuffer;

public class sctoRay : MonoBehaviour
{
    public Transform target;
    void Update()
    {
        // 检测鼠标左键是否被点击
        if (Input.GetMouseButtonDown(0))
        {
            // 发射一条射线从鼠标点击的位置
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            // 检测射线是否击中物体
            if (Physics.Raycast(ray, out hit))
            {
              if(hit.rigidbody != null) {
                    hit.rigidbody.AddForceAtPosition(ray.direction * 200.0f, hit.point);
                }

                Debug.Log(hit.point);
            }
           
        }
    }
}

然后点击NavMesh Surface组件的bake,可以看到scene面板中的寻路区域。

要是看不到,可能是你没让它显示。

点击运行,可以观察到控制器的寻路。

 

接着是动画角色的寻路,先把之前的角色搬过来,把没有用到的禁用。

之前的实验中,通过设置了speed让动画角色有不同的状态,采用寻路系统后,角色的移动是由寻路系统来完成的。停用动画的root motion,用脚本将寻路系统agent的速度传递给动画角色的混合树。

using UnityEngine;
using UnityEngine.AI;
public class NavAgentAnimator : MonoBehaviour

{

    public NavMeshAgent agent;

    public Animator animator;

    void Start()
    {

        if (agent == null)

            agent = GetComponent<NavMeshAgent>();

        if (animator == null)

            animator = GetComponent<Animator>();

    }

    void Update()
    {

        // 计算速度的大小

        float speed = agent.velocity.magnitude;

        // 将速度传递给Animator

        animator.SetFloat("Speed", speed);

    }

}

 

点击运行,可看到角色带有动画的寻路。

 

实验心得

 他说,尽管前方拥堵,但你仍在最优路线上。

相关推荐

  1. 数字孪生项目中的导航片及实现算法的探索

    2024-06-09 07:06:06       50 阅读
  2. [游戏开发][Unity] 导出Xcode工程,完成调试发布

    2024-06-09 07:06:06       38 阅读
  3. Unity3D 游戏中的自动有怎样的算法详解

    2024-06-09 07:06:06       60 阅读
  4. 亲子公园剧本杀小程序ar互动游戏开发搭建

    2024-06-09 07:06:06       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 07:06:06       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 07:06:06       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 07:06:06       82 阅读
  4. Python语言-面向对象

    2024-06-09 07:06:06       91 阅读

热门阅读

  1. Python怎么调用JAR包:揭秘跨语言交互的奥秘

    2024-06-09 07:06:06       32 阅读
  2. Qt富文本查找

    2024-06-09 07:06:06       25 阅读
  3. KerasCV和KerasNLP:视觉和语言的增强

    2024-06-09 07:06:06       43 阅读
  4. 学习分享-声明式的 HTTP 客户端OpenFeign

    2024-06-09 07:06:06       32 阅读
  5. 程序员搞副业一些会用到的工具

    2024-06-09 07:06:06       35 阅读
  6. CSS基础

    2024-06-09 07:06:06       22 阅读
  7. vue3路由传参

    2024-06-09 07:06:06       30 阅读
  8. 虚拟存储器概述

    2024-06-09 07:06:06       30 阅读
  9. 除留取余法构造散列表--c++【做题记录】

    2024-06-09 07:06:06       30 阅读
  10. 从0~1开发财务软件

    2024-06-09 07:06:06       26 阅读