利用状态机及Astar插件实现dots下寻路

本文介绍如何在Dots环境下利用Astar插件实现寻路功能,通过两个独立的状态机——路径状态机与移动状态机,完成路径计算与移动控制。此方法能够有效利用Unity的Dots特性并提高寻路效率。

本文主要讨论一种利用两层状态机将Astar寻路功能在dots下实现的功能。

首先说下为什么要使用Astar这个插件。这个插件的功能很多其实不依赖于unity monobehavior 这一套体系,因此在转为dots使用时可以更加方便,并且可以最大程度的不在场景中通过gameobject来获得寻路功能。Unity本身自带的寻路目前没有更多的API,如果要使用Unity自身的导航系统,估计只能使用GameObject Injecte 方式,在dots世界内外都保存一个副本,如此效率显然十分低下。

为了将寻路转化为dots下的系统,需要对寻路功能进行拆分。这里将寻路拆成两部分,一部分是计算路径,另一部分是根据路径来实现移动。因此可以考虑实现两个独立的状态机,路径状态机控制对路径的计算,并根据计算结果来更新移动状态。而移动状态则仅控制移动。这种实现的好处在于,一方面移动的代码简单的情况可以自己实现,从而可以利用burst来加速;另一方面基本可以将大多数涉及Astar的代码打包进一个系统,而基本涉及Astar的代码部分都是只能在主线程运行的。

路径状态机的具体实现上,考虑到class类型的数据无法保存在dots组件之中,则需要在system中保存以entity为索引的路径map。以recastGraph为例,生成路径方面需要使用 RichPath 这个类来实现路径数据的生成及保存,而Astar本身就是多线程运行,因此路径状态机的主要功能就是将路径的生成放入Astar的计算队列,然后在路径完成时通知移动状态机改变状态机进行移动。

    public enum RichPathComputeState
    {
        WaitingForDestination,
        NeedInitPath,
        NeedUpdate,
        Computing,
        ReadyToMove,
        Finish
    }

    Entities
            .WithoutBurst()
            .ForEach((Entity e, ref AstarSt
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值