怎么在unity让物体沿着道路或设定路径行走
2026/1/9 0:49:26
关键词:unity 运动路径 沿着道路 平滑移动 拐弯 汽车
2026/1/9 0:49:26
关键词:unity 运动路径 沿着道路 平滑移动 拐弯 汽车
想在 Unity 中实现物体沿道路行走的效果,核心思路是让物体跟随预设的 “路径” 移动,Unity 里有多种实现方式,从简单到进阶讲解,优先推荐新手易上手的方案。
一、新手基于路径点的移动
最直观的方式是在道路上摆放一系列 “路径点”(空物体),让物体依次向每个路径点移动,到达后切换到下一个,直到走完所有路径点。这种方式无需复杂插件,适合大部分简单道路(直线、曲线、拐角道路都适用)。
步骤 1:创建路径点
在 Hierarchy 面板右键创建空物体,命名为 Path(作为所有路径点的父物体);
在 Path 下创建多个空物体,命名为 Waypoint01、Waypoint02、Waypoint03...,并将这些空物体拖拽到道路的关键位置(比如道路起点、拐点、终点);
调整每个路径点的位置,确保它们沿道路中心线排列。
步骤 2:编写移动脚本
创建一个 C# 脚本(命名为 FollowPath),挂载到需要沿道路行走的物体上,代码如下(带详细注释):
步骤 3:配置脚本
选中要移动的物体,在 Inspector 面板找到 FollowPath 脚本;
调整 Waypoints 数组的长度,然后将场景中的 Waypoint01、Waypoint02... 依次拖拽到数组的每个元素中;
设置 Move Speed(比如 3-5),勾选 Loop(是否循环行走);
运行游戏,物体就会沿路径点依次移动,贴合道路行走。
二、进阶方案:基于 NavMesh 的导航(适合复杂地形 / 动态避障)
如果你的场景有复杂道路、障碍物,或需要物体自动避障,推荐用 Unity 内置的 NavMesh 导航系统,核心是烘焙道路为 “可行走区域”,让物体沿导航网格移动。
步骤 1:烘焙 NavMesh
选中道路模型,在 Inspector 面板设置 Static(勾选 Navigation Static);
打开 Window > AI > Navigation 面板,切换到 Bake 标签页;
调整 Agent Radius(匹配物体大小)、Agent Height 等参数,点击 Bake 按钮,道路会被烘焙为蓝色的导航网格;
步骤 2:给物体添加导航组件
给移动物体添加 Nav Mesh Agent 组件;
调整组件参数:Speed(移动速度)、Stopping Distance(停止距离)等;
步骤 3:编写导航脚本
挂载脚本后,同样拖拽路径点到数组,运行游戏,物体就会沿 NavMesh 网格(道路)移动,还能自动避开障碍物。
三、注意事项
路径点要沿道路中心线摆放,间距不要太大(拐角处加密),否则物体可能偏离道路;
NavMesh 方案要求道路是 “静态” 的,若道路需要动态修改(比如可变形),不适合用这种方式;
若道路是曲线,可增加路径点数量,让路径更贴合曲线;也可以用贝塞尔曲线生成平滑路径(适合高精度曲线道路)。
总结
新手优先选路径点方案:无需配置,代码简单,适合固定道路、无避障需求的场景;
复杂场景选 NavMesh 方案:支持避障、复杂地形,是游戏中 NPC 沿道路行走的主流方案;
核心逻辑都是 “设置目标点→向目标点移动→切换下一个目标点”,区别在于移动的底层实现(直接位移 vs 导航网格)。
[下页更精彩:点击>>>>] [1] [2] [3] [4] [5]
相关文章(向右看)..
一、新手基于路径点的移动
最直观的方式是在道路上摆放一系列 “路径点”(空物体),让物体依次向每个路径点移动,到达后切换到下一个,直到走完所有路径点。这种方式无需复杂插件,适合大部分简单道路(直线、曲线、拐角道路都适用)。
步骤 1:创建路径点
在 Hierarchy 面板右键创建空物体,命名为 Path(作为所有路径点的父物体);
在 Path 下创建多个空物体,命名为 Waypoint01、Waypoint02、Waypoint03...,并将这些空物体拖拽到道路的关键位置(比如道路起点、拐点、终点);
调整每个路径点的位置,确保它们沿道路中心线排列。
步骤 2:编写移动脚本
创建一个 C# 脚本(命名为 FollowPath),挂载到需要沿道路行走的物体上,代码如下(带详细注释):
using UnityEngine;
public class FollowPath : MonoBehaviour
{
[Header("路径设置")]
public Transform[] waypoints; // 路径点数组(手动拖拽路径点到这里)
public float moveSpeed = 5f; // 移动速度
public bool loop = true; // 是否循环行走
private int currentWaypointIndex = 0; // 当前目标路径点的索引
void Update()
{
if (waypoints.Length == 0) return; // 如果没有设置路径点,直接返回
Vector3 targetPosition = waypoints[currentWaypointIndex].position;//计算物体到当前路径点的方向
// 保持物体的Y轴高度和自身一致(避免路径点高度不同导致物体上下飘)
targetPosition.y = transform.position.y;
Vector3 direction = (targetPosition - transform.position).normalized;
transform.Translate(direction * moveSpeed * Time.deltaTime, Space.World);//向目标路径点移动
// 检测是否到达当前路径点(距离小于0.1时视为到达):
float distanceToWaypoint = Vector3.Distance(transform.position, targetPosition);
if (distanceToWaypoint < 0.1f)
{ currentWaypointIndex++;// 切换到下一个路径点
if (currentWaypointIndex >= waypoints.Length)
{// 检测是否走完所有路径点
if (loop)currentWaypointIndex = 0;// 循环:回到第一个路径点
else enabled = false;// 不循环:停止移动
}
}
// 让物体朝向移动方向(可选,让物体始终对着前进方向)
if (direction != Vector3.zero)transform.rotation = Quaternion.LookRotation(direction);
}
// 场景视图中绘制路径线(方便调试)
void OnDrawGizmos()
{
if (waypoints.Length < 2) return;
Gizmos.color = Color.red;
for (int i = 0; i < waypoints.Length - 1; i++)
{ Gizmos.DrawLine(waypoints[i].position, waypoints[i + 1].position);}
// 如果循环,绘制最后一个到第一个的线
if (loop && waypoints.Length > 1)Gizmos.DrawLine(waypoints[waypoints.Length - 1].position, waypoints[0].position);
}
}
步骤 3:配置脚本
选中要移动的物体,在 Inspector 面板找到 FollowPath 脚本;
调整 Waypoints 数组的长度,然后将场景中的 Waypoint01、Waypoint02... 依次拖拽到数组的每个元素中;
设置 Move Speed(比如 3-5),勾选 Loop(是否循环行走);
运行游戏,物体就会沿路径点依次移动,贴合道路行走。
二、进阶方案:基于 NavMesh 的导航(适合复杂地形 / 动态避障)
如果你的场景有复杂道路、障碍物,或需要物体自动避障,推荐用 Unity 内置的 NavMesh 导航系统,核心是烘焙道路为 “可行走区域”,让物体沿导航网格移动。
步骤 1:烘焙 NavMesh
选中道路模型,在 Inspector 面板设置 Static(勾选 Navigation Static);
打开 Window > AI > Navigation 面板,切换到 Bake 标签页;
调整 Agent Radius(匹配物体大小)、Agent Height 等参数,点击 Bake 按钮,道路会被烘焙为蓝色的导航网格;
步骤 2:给物体添加导航组件
给移动物体添加 Nav Mesh Agent 组件;
调整组件参数:Speed(移动速度)、Stopping Distance(停止距离)等;
步骤 3:编写导航脚本
using UnityEngine;
using UnityEngine.AI;
public class NavMeshFollow : MonoBehaviour
{
public Transform[] waypoints; // 路径点(沿道路摆放)
private NavMeshAgent agent;
private int currentIndex = 0;
void Start()
{
agent = GetComponent();
// 设置第一个目标点
if (waypoints.Length>0)agent.SetDestination(waypoints[currentIndex].position);
}
void Update()
{
if (waypoints.Length == 0 || agent.remainingDistance < 0.1f)
{ currentIndex++;
if (currentIndex >= waypoints.Length)currentIndex = 0; // 循环
agent.SetDestination(waypoints[currentIndex].position);
}
}
}
挂载脚本后,同样拖拽路径点到数组,运行游戏,物体就会沿 NavMesh 网格(道路)移动,还能自动避开障碍物。
三、注意事项
路径点要沿道路中心线摆放,间距不要太大(拐角处加密),否则物体可能偏离道路;
NavMesh 方案要求道路是 “静态” 的,若道路需要动态修改(比如可变形),不适合用这种方式;
若道路是曲线,可增加路径点数量,让路径更贴合曲线;也可以用贝塞尔曲线生成平滑路径(适合高精度曲线道路)。
总结
新手优先选路径点方案:无需配置,代码简单,适合固定道路、无避障需求的场景;
复杂场景选 NavMesh 方案:支持避障、复杂地形,是游戏中 NPC 沿道路行走的主流方案;
核心逻辑都是 “设置目标点→向目标点移动→切换下一个目标点”,区别在于移动的底层实现(直接位移 vs 导航网格)。
[下页更精彩:点击>>>>]
相关文章(向右看)..