Unity随机寻路

news/2025/3/16 5:40:40/

        当今的游戏设计行业越来越注重游戏的可玩性和交互性,而游戏中的角色寻路是其中一项重要的技术挑战。本篇博客将深入探讨如何使用Unity中的NavMesh和代码实现让角色在一个区域内随机寻路的功能。下面先给出代码实现,随后对代码进行注释和详细解释。

using UnityEngine;
using UnityEngine.AI;
using System.Collections;public class RandomMovement : MonoBehaviour {public float range = 10.0f; //移动范围private NavMeshAgent agent;private Vector3 destination; //目的地void Start () {agent = GetComponent<NavMeshAgent>();SetDestination();}void SetDestination() {Vector3 targetPos = Random.insideUnitSphere * range; //生成一个随机目的地NavMeshHit hit;NavMesh.SamplePosition(targetPos, out hit, range, 1); //检查可到达性destination = hit.position; //保存目的地位置agent.SetDestination(destination); //设置目的地}void Update () {if(agent.remainingDistance < 0.5f) //如果已经到达{SetDestination(); //设置下一个目的地}}
}

代码解释:

  1. 我们首先导入了UnityEngine和UnityEngine.AI库,分别用于Unity和导航网格。
  2. 定义了一个名为RandomMovement的类,继承了MonoBehaviour类。
  3. 定义了一个公有变量range,表示角色可以移动的范围。
  4. 定义了NavMeshAgent类型的私有变量agent,用来控制角色在寻路过程中的移动。
  5. 定义了Vector3类型的私有变量destination,表示角色的目标位置。
  6. 在Start方法中,我们通过GetComponent方法获取角色的NavMeshAgent组件,并调用SetDestination方法设置角色的初始目标位置。
  7. 在SetDestination方法中,我们首先通过Random.insideUnitSphere方法生成一个随机的三维向量targetPos,表示目标位置。
  8. 然后利用NavMesh.SamplePosition方法检查目标位置是否可达,并将检查结果保存在NavMeshHit类型的hit变量中。
  9. 如果目标位置可达,我们将hit.position(即目标位置)保存在destination变量中,并通过agent.SetDestination方法告诉角色去往该位置。
  10. 在Update方法中,我们监测角色是否已经到达了目标位置,如果是,则调用SetDestination方法设置新的目标位置。

这个思路很简单,结合Unity的NavMesh可以写出十分简洁且实用的角色随机寻路代码,非常适用于一些需要增加游戏可玩性的游戏。


http://www.ppmy.cn/news/92815.html

相关文章

ASP.NET 未能找到类型或命名空间名称“HttpRequestMessage”

引入System.Net.Http后&#xff0c;运行页面还是报错 using System.Net.Http;chatGPT解释需要安装Microsoft.AspNet.WebApi.Client包&#xff0c;IIS安装的包文件存储在bin目录下&#xff0c;安装包后bin目录多出了一些列文件 运行页面后还是报错 需要在web.config配置文件…

LeetCode 不同路径1\2

不同路径1和2 题目在上面 这两个题目都是简单的动态规划问题 对不同路径最初始的问题举个例子 因为我们的机器人只能向右或者向下走一步 因此这个矩形的第一行和第一列都可以初始化为1 然后我们就可以得到动态规划的方程 f i , j f i − 1 , j f i , j − 1 f_{i,j} f_{i…

Spring Boot 单元测试

文章目录 一&#xff0c;Spring Boot单元测试概述二&#xff0c;对项目HelloWorld01进行单元测试1、添加测试依赖启动器和单元测试2、创建测试类与测试方法 三&#xff0c;对项目HelloWorld02进行单元测试1、添加单元测试依赖2、进行单元测试 一&#xff0c;Spring Boot单元测试…

数的范围问题

给定一个按照升序排列的长度为 n的整数数组&#xff0c;以及 q 个查询。 对于每个查询&#xff0c;返回一个元素 k 的起始位置和终止位置&#xff08;位置从 00 开始计数&#xff09;。 如果数组中不存在该元素&#xff0c;则返回 -1 -1。 输入格式 第一行包含整数 n 和 q&…

JSP学生学籍管理系统设计与实现(源代码+论文+开题报告+外文翻译+答辩PPT)

随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。管理信息系统是一个不断发展的新型学科,任何一个单位要生存要发展,要高效率地把内部活动有机地组织起来,就必须建立与自身特点相适应的管理信息系统。 本文采用JSP和MS SQL-Server等软…

逆序对的数量

给定一个长度为 n的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i<j 且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。 输入格式 第一行包含整数 n &#…

Springcloud1---->Zuul网关

目录 简介加入zuul后的架构快速入门添加Zuul依赖编写zuul启动类编写zuul配置文件编写路由规则 面向服务的路由添加Eureka客户端依赖开启Eureka客户端发现功能添加Eureka配置&#xff0c;获取服务信息修改映射配置&#xff0c;通过服务名称获取 简化的路由配置过滤器使用场景自定…

【Python】字符串操作

知识目录 一、写在前面✨二、字符串逆序三、打印菱形四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;很高兴再次跟大家见面。&#xff08;相遇就是缘分啊&#xff09; 今天跟大家分享的文章是 Python中的字符串操作 &#xff0c;希望能帮助…