在游戏开发中,NPC(非玩家角色)的行为逻辑对于营造真实、沉浸式的游戏世界至关重要。一个常见但又极具表现力的需求是:让 NPC 在场景中自然地随机移动,仿佛它们有自己的意识和目的地

本文将详细介绍如何使用 Unity 的 NavMeshAgentAnimator 组件,实现一个具备 自动寻路 + 动画控制 + 目标点切换 + 等待机制 的 NPC 随机漫游系统,并提供完整的 C# 脚本代码。


🎯 核心功能概述

  1. 自动寻路:基于 Unity 内置导航系统 NavMesh。
  2. 目标点随机生成:在一定范围内寻找可行走的位置作为新目标。
  3. 动画状态同步:根据是否移动控制 Animator 的播放状态。
  4. 到达目标后等待一段时间再重新选择路径,模拟“停顿-走动”的自然行为。

🧠 一、脚本解析:NPCMovement.cs

using UnityEngine;
using UnityEngine.AI;[RequireComponent(typeof(NavMeshAgent), typeof(Animator))]
public class NPCMovement : MonoBehaviour
{private NavMeshAgent agent;private Animator animator;private Vector3 targetPosition;public float minWaitTime = 1f;   // 到达目标点后等待时间public float maxWaitTime = 3f;void Awake(){agent = GetComponent<NavMeshAgent>();animator = GetComponent<Animator>();FindNewTarget();}void Update(){// 更新动画状态bool isMoving = !HasReachedDestination();animator.SetBool("IsMoving", isMoving);// 如果到达目标点,等待后重新选择目标if (HasReachedDestination()){Invoke("FindNewTarget", Random.Range(minWaitTime, maxWaitTime));}}void FindNewTarget(){// 随机生成一个 NavMesh 上的点NavMeshHit hit;Vector3 randomDirection = Random.insideUnitSphere * 10f; // 10米范围randomDirection += transform.position;NavMesh.SamplePosition(randomDirection, out hit, 10f, NavMesh.AllAreas);targetPosition = hit.position;agent.SetDestination(targetPosition);}bool HasReachedDestination(){return !agent.pathPending && agent.remainingDistance <= agent.stoppingDistance &&agent.velocity.sqrMagnitude == 0f;}
}

📦 二、组件说明与配置要求

✅ 所需组件:

组件作用
NavMeshAgent控制 NPC 的自动寻路行为
Animator控制 NPC 的动画状态(如“IsMoving”)
Rigidbody(可选)若有物理交互需求

使用 [RequireComponent] 特性确保必须存在这些组件。

🔧 场景准备步骤:

  1. 烘焙导航网格(NavMesh)

    • 为地面添加 NavMeshSurface 或使用 Unity 的 Navigation 窗口进行烘焙。
    • 确保 NPC 可以在场景中正确寻路。
  2. 创建 NPC 角色模型

    • 添加 NavMeshAgent 和 Animator 组件。
    • 准备包含“Idle”和“Walk”状态的 Animator Controller。
  3. 挂载脚本

    • 将 NPCMovement.cs 挂载到 NPC 对象上。
  4. 设置参数

    • 在 Inspector 中调整 minWaitTime 和 maxWaitTime 来控制 NPC 停留的时间范围。

🔄 三、核心函数详解

1. Awake()

初始化 NavMeshAgentAnimator,并立即调用一次 FindNewTarget(),让 NPC 开始移动。

2. Update()

每帧更新 NPC 的动画状态和判断是否已到达目标点。

  • animator.SetBool("IsMoving", isMoving):同步动画状态。
  • Invoke("FindNewTarget", ...):到达后延迟触发新目标点。

3. FindNewTarget()

在当前 NPC 位置周围随机生成一个点,通过 NavMesh.SamplePosition 找到最近的可行走位置,并设为目标。

  • Random.insideUnitSphere * 10f:限制搜索半径为 10 米。
  • NavMesh.SamplePosition(...):确保目标点位于有效导航区域。

4. HasReachedDestination()

判断是否已经到达目标点,逻辑如下:

  • !agent.pathPending:路径未计算中。
  • remainingDistance <= stoppingDistance:距离足够近。
  • velocity.sqrMagnitude == 0f:速度为零,表示完全停止。

🛠️ 四、扩展建议(进阶技巧)

功能实现思路
多个 NPC 同时运行使用对象池或预制体实例化多个 NPC
更复杂的路径逻辑结合 Behavior Tree 或 State Machine
自定义动画事件在动画中添加脚步声、动作切换等事件
动态更改目标点范围根据 NPC 类型或情绪改变搜索半径
加入障碍物躲避使用 NavMeshAgent 自带的避障功能
行为差异化为每个 NPC 设置不同的等待时间和移动速度

📈 性能与适用场景

指标描述
CPU 占用极低,仅依赖于 Unity 内建组件
内存占用几乎无额外内存消耗
适用范围RPG 游戏 NPC、城市模拟、VR/AR 角色、AI 教学演示等
可扩展性易于集成 AI 行为树、对话系统、任务系统等模块

🎮 实际应用示例

你可以将此脚本用于以下场景:

  • RPG 游戏中的路人 NPC。
  • 商店或城市环境中来回走动的顾客。
  • VR 应用中模拟人群流动。
  • 教育类游戏中展示 AI 寻路原理。

📝 示例动画控制器结构(Animator)

States:
- Idle(待机)
- Walk(行走)Transitions:
- Idle -> Walk: IsMoving == true
- Walk -> Idle: IsMoving == false

📌 注意事项

  • 确保所有需要行走的地面都已加入导航网格。
  • 如果 NPC 卡住,请检查 NavMesh 是否有空洞或障碍。
  • 可适当增加 stoppingDistance 提高到达精度。

📎 总结

通过这篇博客文章,我们学习了如何利用 Unity 的 NavMeshAgentAnimator 创建一个具备自然随机漫游行为的 NPC。这个脚本结构清晰、易于理解,同时具备良好的扩展性和性能表现,非常适合用于各种类型的游戏项目。

如果你正在开发一个开放世界、城镇模拟或者 RPG 类型的游戏,不妨试试这个 NPC 移动系统,让你的角色真正“活”起来!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87913.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87913.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/87913.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重新学习Vue中的按键监听和鼠标监听

文章目录按键事件1. 使用 keyup.enter 修饰符2. 使用 v-on 监听键盘事件3. 在组件上监听原生事件Vue 2Vue 34. 全局监听键盘事件注意事项鼠标事件1. 基本鼠标事件监听常用鼠标事件2. 事件修饰符3. 鼠标按键检测4. 鼠标位置信息5. 自定义指令监听鼠标事件6. 组合鼠标事件7. 性能…

vue2启动问题以及解决方案

vue2启动时&#xff1a;ERROR Invalid options in vue.config.js: "typescript.validate.enable" is not allowed如果需要在 VSCode 中控制 TypeScript 验证&#xff1a;在项目根目录创建 .vscode/settings.json 文件&#xff08;如不存在&#xff09;添加以下配置&a…

Vue响应式系统:从原理到核心API全解析

响应式原理 响应式机制的主要功能就是&#xff0c;可以把普通的JavaScript对象封装成为响应式对象&#xff0c;拦截数据的读取和设置操作&#xff0c;实现依赖数据的自动化更新。 Q: 如何才能让JavaScript对象变成响应式对象&#xff1f; 首先需要认识响应式数据和副作用函数…

水下目标检测:突破与创新

水下目标检测技术背景 水下环境带来独特挑战&#xff1a;光线衰减导致对比度降低&#xff0c;散射引发图像模糊&#xff0c;色偏使颜色失真。动态水流造成目标形变&#xff0c;小目标&#xff08;如1010像素海胆&#xff09;检测困难。声呐与光学数据融合可提升精度&#xff0…

高通SG882G平台(移远):2、使用docker镜像编译

其实之前已经编译过了。今日搜索时发现&#xff0c;只有当时解决问题的汇总&#xff0c;没有操作步骤。于是记录下来。 建议使用Ubuntu20 LTS。 安装docker $ sudo apt update $ sudo apt install docker.io $ sudo docker -v Docker version 27.5.1, build 27.5.1-0ubuntu3…

轻松上手:使用Nginx实现高效负载均衡

接上一篇《轻松上手&#xff1a;Nginx服务器反向代理配置指南》后&#xff0c;我们来探讨一下如何使用Nginx实现高效负载均衡。 在当今高并发、大流量的互联网环境下&#xff0c;单台服务器早已无法满足业务需求。想象一下&#xff1a;一次电商平台的秒杀活动、一个热门应用的…

身份证号码+姓名认证接口-身份证二要素核验

身份证号实名认证服务接口采用身份证号码、姓名二要素核验的方式&#xff0c;能够快速确认用户身份。无论是新用户注册&#xff0c;还是老用户重要操作的身份复核&#xff0c;只需输入姓名及身份证号&#xff0c;瞬间即可得到 “一致” 或 “不一致” 的核验结果。这一过程高效…

自动驾驶基本概念

目录 自动驾驶汽车&#xff08;Autonomous Vehicles &#xff09; 单车智能 车联网 智能网联&#xff08;单车智能车联网&#xff09; 自动驾驶关键技术 环境感知与定位 车辆运动感知 车辆运动感知 路径规划与决策 自动驾驶发展历程 自动驾驶应用场景 自动驾驶路测…

提示词框架(10)--COAST

目前&#xff0c;有很多提示词框架都叫COAST&#xff0c;但是每个的解释都不同&#xff0c;出现很了很多解释和演化版本&#xff0c;不要在意这些小事&#xff0c;我们都是殊途同归--让AI更好的完成任务COAST框架&#xff0c;比较适合需要详细背景和技术支持的任务&#xff0c;…

基于selenium实现大麦网自动抢票脚本教程

闲来无事&#xff0c;打开大麦网发现现在大多数演唱票都需要手机端才能抢票&#xff0c;仅有很少一部分支持pc端用网页去抢票&#xff0c;但正所谓&#xff1a;道高一尺&#xff0c;魔高一丈&#xff0c;解决这个反爬问题&#xff0c;我们可以采用Airtest连接仿真机来模拟手机端…

2048小游戏实现

2048小游戏实现 将创建一个完整的2048小游戏&#xff0c;包含游戏核心逻辑和美观的用户界面。设计思路 4x4网格布局响应式设计&#xff0c;适配不同设备分数显示和最高分记录键盘控制&#xff08;方向键&#xff09;和触摸滑动支持游戏状态提示&#xff08;胜利/失败&#xff0…

Windows VMWare Centos Docker部署Springboot + mybatis + MySql应用

前置文章 Windows VMWare Centos环境下安装Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot应用https://blog.csdn.net/u013224722/article/details/148958480 Windows VMWare Centos Docker部署…

【科普】Cygwin与wsl与ssh连接ubuntu有什么区别?DIY机器人工房

Cygwin、WSL&#xff08;Windows Subsystem for Linux&#xff09;和通过 SSH 连接 Ubuntu 是三种在 Windows 环境下与类 Unix/Linux 系统交互的工具&#xff0c;但它们的本质、运行环境、功能范围有显著区别。以下从核心定义、关键差异和适用场景三个维度详细说明&#xff1a;…

Web前端数据可视化:ECharts高效数据展示完全指南

Web前端数据可视化&#xff1a;ECharts高效数据展示完全指南 当产品经理拿着一堆密密麻麻的Excel数据走向你时&#xff0c;你知道又到了"化腐朽为神奇"的时刻。数据可视化不仅仅是把数字变成图表那么简单&#xff0c;它是将复杂信息转化为直观洞察的艺术。 在过去两…

# IS-IS 协议 | LSP 传输与链路状态数据库同步机制

略作整理&#xff0c;待校。 SRM 和 SSN 标志的作用 SRM 标志 功能&#xff1a;SRM 标志用于跟踪路由器从一个接口向邻居发送链路状态协议数据单元&#xff08;LSP&#xff09;的状态。作用&#xff1a;确保 LSP 的正确传输和状态跟踪。 SSN 标志 广播网络 功能&#xff1…

Windows DOS CMD 100

1. systeminfo&#xff1a;显示系统详细信息&#xff08;安装日期/补丁/内存等&#xff09; 2. sfc /scannow&#xff1a;扫描并修复系统文件损坏 [管理员] 3. chkdsk /f&#xff1a;检查磁盘错误并修复&#xff08;需重启&#xff09; [管理员] 4. cleanmgr&#xff1a;启动…

HTML初学者第三天

<1>文档类型声明标签——<!DOCTYPE><!DOCTYPE>文档声明&#xff0c;作用是告诉浏览器使用哪种HTML版本来显示网页。<!DOCTYPE html>这句代码的意思是&#xff1a;当前页面采用的是HTML5版本来显示网页。注意&#xff1a;-<!DOCTYPE>声明位于文档…

学车笔记6

“不踩离合利用发动机制动”是指在驾驶过程中&#xff0c;驾驶员抬起油门踏板&#xff0c;但不踩下离合器踏板&#xff0c;利用发动机自身的阻力来减缓车辆速度的一种制动方式。具体介绍如下&#xff1a; #### 原理 - **动力传递反向**&#xff1a;正常情况下&#xff0c;发动…

人体坐姿检测系统项目教程(YOLO11+PyTorch+可视化)

&#x1f4a1;本文主要内容&#xff1a;本项目基于YOLO11深度学习目标检测算法&#xff0c;设计并实现了一个人体坐姿检测系统。系统能够自动识别图像或视频中的多种坐姿类型&#xff08;如&#xff1a;正常坐姿、不良坐姿等&#xff09;&#xff0c;为健康监测、智能教室、办公…

服务网格可观测性深度实践与创新优化

主题&#xff1a;突破服务网格监控瓶颈——基于eBPF的无侵入式全链路可观测性实践 技术领域&#xff1a;云原生/微服务/服务网格&#xff08;Service Mesh&#xff09; 一、问题背景&#xff1a;传统服务网格监控的痛点 在Istio、Linkerd等服务网格架构中&#xff0c;可观测…