请问如何实现3个物体中,A持续移动到C,但要绕过B,B会移动来阻挡A



  • 假设A,B,C三个物体,A持续移动到C,C不动,但要绕过B,B可移动,如何让A移动到C呢,这个公式应该是有A与C的角度以及A与B之间的距离



  • @Yamls 老实说不太清楚你理解中的“公式”是怎么样的,但如果要拿到AC的角度和AB的距离,分别用angle表达式和distance表达式就行,angle(A.x,A.y,C.x,C.y)就是A指向C的角度,参数中AC位置倒过来就是C指向A的角度,distance参数填写方法类似,也是填两个点的坐标,不过这个不像角度的一点就是谁填前面谁填后面都是一样的,结果都是返回两点之间的距离值。
    回到你的标题问题,本来涉及到“绕过”的效果,一般都是会用到寻路能力的,但是你的障碍物B是移动的,意味着寻路能力要实时更新障碍物信息,这个大多数人都做不好,加上如果B的移动会直接移动到跟A重叠,那么一旦A的锚点被盖住,寻路就永远无法生效了,所以还得考虑B阻挡A的时候不能跟A重叠,最后寻路能力并没有“体积”的概念,只是一个点在寻路,所以还得考虑寻路能力的网格设置以及放弃默认的“沿路径移动”效果,自己手写一个按路径移动的效果(原因详见论坛另一位大佬的帖子,搜寻路能力应该能找到),所以如果能合理利用好寻路能力,那么它就是一个比较通用的思路。
    如果抛开寻路能力的思路,从纯粹自己手写移动的角度出发,你“这套题”就会显得有些条件不足了,例如B的阻挡决策是怎么样的?A和B的速度差值有多少?A和B的数量分别是怎样的量级?这些都会影响到具体的设计思路。



  • 谢谢,具体条件是这样的,假设ABC三个物体均在二维平面,俯视角,A会按照一定的速度持续追踪到C的位置,B可以移动来阻挡A,所以A要绕过B,做到AB不重叠,A的移动路线就像A和C之间有根绳子,B过去会把绳子拉出一个弯度,A会按弯曲后的绳子轨迹走,但这个轨迹是实时根据AC的距离d1、角度angle、AB的距离d2、角度angle2来更改,所说的公式也就是A移动的方向需要有以上的变量d1、d2、angle、angle2
    undefinedundefinedundefined



  • @Yamls 虽然不知道你们在讨论啥,不过看这个图的话,好像就分两种情况吧?
    A的x坐标小于B的时候,如果B的y坐标小于A,那么A直接移动到C就行,如果大于A,那么A先移动到B的x坐标,y坐标+偏移值的位置。
    A的x坐标大于等于B的时候,就不考虑B了,直接移动到C就行。



  • 不是的,你可以理解为A在持续向C移动,B是个动态的障碍,A需要在移动中避免碰到B的同时移动到C,因为B会一直移动,所以A的移动方向也必须根据B来改变



  • @Yamls 楼上说的没大毛病,他那个逻辑实际上就是会根据B的坐标动态改变A的移动目的地,进而改变A的实时移动方向的,的确符合你的例图描述,除非B的移动规则很复杂(你没详细给出具体规则)且A始终为了绕过B而动,例如你第三个图的情况下,此时AC之间明明直线可以通过,但是A不会直接向C移动,硬是要先绕过B,如果B的移动方向只有上下,或者说维持在一个小的范围里,那么假定A速度比B大且大出的值足够绕过B,那么楼上说的做法就是够用的,但如果B还会左右走,而且在第三个图的基础上,B向左走到A的左边,而A还是必须先跟着往左走直到能绕过B,是这种规则的话,那么楼上那位朋友说的做法就不行,所以归根结底条件还是太少了,所以来回答的朋友都是假设性的给出一种特定设计的方案。例如我看你最开始的描述,理解上跟第一个老哥回复你的寻路方案的情况差不多,只要绕过B就行,但是没想到你后面回复的举例居然是要求AC中间有类似“绳子”的这种需求😂



  • 不好意思,图画错了。。。大概是这样的undefinedundefined



  • @Yamls 试了试楼上第二位朋友说的思路,针对你这个新的图改进了一下,思路确实是可行的:
    undefined
    效果演示:
    undefined
    如果不想A贴着B的边绕过,可以把路线检测的高度再调大一点,B仅为了测试加了八方向移动能力,然后没特地做B主动重叠A时的阻隔效果,毕竟只是分享移动路径这块的思路





  • 就功能而言。感觉寻路就可以达到这个需求。



  • @wdtd 自动寻路会卡,所以没有用这个功能。。。


登录后回复