如何让人物之外的物体进行寻路

mac2024-03-18  24

功能效果展示

 

运行环境

Win7,Win8,Win10

Reworld版本 体验版

vc_redist.x64 运行环境

 

针对零基础读者的补充

下载安装 Reworld对应版本

Reworld官网链接:http://www.reworlder.com/

Reworld创作者之家论坛:http://bbs.reworlder.com

下载后安装后注册账号打开空地图

下载安装 vc_redist.x64.rar运行环境

redist.x64下载链接

 

思路分析

想要实现自动寻路的功能,首先我们需要在玩家加入游戏时,启用编辑器内的导航网格,然后获取寻路具体路径,自身位置,目标位置,把获取的信息赋值给自身的坐标位置就可以实现了。

 

功能搭建

一、寻路物体搭建过程

1.首先我们需要在工作区里创建两个零件,其中一个命名为Player,另外一个命名为Target,修改他们的颜色方便我们观察和区分。如下图所示:

2.我们再在两个零件之间创造一些障碍物。如下图所示:

 

二、寻路功能搭建过程

在名为Player的零件下创建一个服务器脚本。如下图所示:

编写服务脚本如下:

local player=script.Parent --获取玩家 local target=WorkSpace.Target --获取目标 Players.PlayerAdded:Connect(function(Uid) --当玩家加入时 local ren=Players:GetPlayerByUserId(Uid) --获取玩家本身 ren.AvatarAdded:Connect(function() --当玩家角色加载时 GameSetting.NavMeshOpen = true -- 路径导航开启赋值 PathFindService:CalculateNavMesh(0.5,1.5,45) -- 导航网格建立 --获取寻路具体路径,自身位置,目标位置 local tableList=PathFindService:GetPath(player.Position,target.Position) --循环路径数量,这里从第二个路径点开始,因为第一个路径点就是自身的位置 for i=2,#tableList,1 do coroutine.start(function()--运用协程帮助我们实现缓动效果,替代update函数 --当玩家和当前路径点距离大于0.1并且index并未超出索引范围时,玩家移动 while Vector3.Distance(player.Position,tableList[index])>0.1 and index<=#tableList do --Vector3.MoveTowards方法类似Mathf.Lerp方法,传入自身和目标位置以及缓动插值即可 --把获取的信息赋值给自身的Position player.Position=Vector3.MoveTowards(player.Position,tableList[index],0.1) coroutine.wait(0.02)--协程等待 end --如果不满足while的循环条件,说明已经到达当前的路径,我们去更新下一个路径 index=index+1 end) end --当全部路径搜寻完之后,我们重置路径索引计数器 index=2 end) end)

 

补充说明

1.什么是工作区?

工作区中的对象是会被可视化显示到3D场景中的,并且只有在工作区中的对象才会发生物理交互。

 

2.什么是服务器脚本?

只会在服务器运行的Lua脚本代码,用于编写服务器逻辑。

 

3.什么是导航网格?

开启后地图会生成导航网格,可用于实现自动绕过阻挡的寻路功能。开启此功能会增加游戏运算压力,如果不需要寻路功能,建议不要开启。

好了,接下来我们开始游戏,当玩家加入的时候,我们可以看见名为Player的零件通过了障碍物,移动到了名为Target的零件的位置。如果有什么问题或者有更好的实现方式,大家可以在下方积极交流讨论,我们也会参与进来和大家一起分享经验,期望能和大家共同进步~~

最新回复(0)