我可以使用哪种转向行为或逻辑来使手机包围其他设备?


10

我在游戏中使用寻路功能,将暴徒引向其他玩家(以追赶他们)。这样可以使它们超越播放器,但我希望它们在到达目的地之前稍稍停下来(因此,选择倒数第二个节点效果很好)。

但是,当多个暴徒在追赶手机时,它们有时会“堆叠在彼此之上”。避免这种情况的最佳方法是什么?我不想将这些小怪当作不透明和被遮挡的对象(因为它们不是,您可以穿过它们),但我希望这些小怪具有某种结构感。

例:

想象一下,每条蛇都将自己引向我,并且应该包围“ Setsuna”。请注意,两条蛇都选择了叉我吗?这不是严格的要求;即使稍微偏移也可以。但是他们应该“包围” Setsuna。

在此处输入图片说明


1
堆叠是目的地还是运输途中的唯一问题?我猜是后者。
SpartanDonut

是后者,@ SpartanDonut
Vaughan Hilts

@KromStern我添加了一张图片,希望对您有所帮助。
沃恩·希茨

Answers:


15

给您的代理人弱的“静电电荷”,使他们按照库仑定律相互排斥。

为简单起见,假设小怪应该以同等的强度彼此推开,那么在每对小怪之间施加一个大小为的力就足够了some_constant / distance^2,在这里,some_constant可配置的排斥强度distance是它们之间的距离。

然后,排斥力随距离的平方下降。

代码的性质有一个很好的例子(有现场演示)在这里。看起来像这样:

结合的行为和单独的行为

将每个元素彼此匹配是二次时间(O(n^2))操作。如果您有很多特工,则可能希望使用Barnes-Hut近似优化力计算,该近似可降至对数线性(O(n log n)),但需要一个四叉树


很好的联系,Anko。非常感激!我一定要仔细阅读整个站点。
旺市(Vaughan Hilts)2014年

《星际争霸》(至少为1)与其飞行装置的功能相似。但是,只有当他们停止移动时,它才会这样做,即当他们移动时,他们彼此拥挤(完全忽略对方作为障碍),但是当他们停止移动时,它们都开始从看起来像是在扩展包含它们的某些常规区域(可能是正方形/圆形)的局部中心。这看起来不像答案中的例子那么漂亮,但是它可能使用较少的CPU资源,并且也可能更容易编码……
Shivan Dragon 2014年

@ShivanDragon SC2表现出相同的行为,它们都聚集在人群中,然后向外扩展,以获得逼真的外观和美学上的愉悦感(因此它们的各个部分不会被夹住)。
Kroltan

2
某种排斥力可能是一个好主意,但是细节却很棘手。我在以太空为主题的RTS中进行了实验,建议不要太紧跟物理学,而要对其建模以使其表现良好。一些观察:1)由于这不是物理模拟,因此只在短距离上施加力。2)这不能防止有限的物体重叠3)硬势很容易引起数值误差,例如粒子在高速下折射。4)一旦您有大量的粒子并且中间的压力上升,事情就会变得难看。
CodesInChaos

1

我的方法与@Anko的方法类似,但是基于Millionington和Funge的工作,它们来自 AI 游戏

这就是“分离”行为的样子,但是您需要考虑到应该使用代理的Update函数中的代理速度来计算该速度。

public Vector3 GetSeparationVel (float threshold, float decayCoefficient)
{
    threshold = threshold * threshold;
    Vector3 separationVelocity = Vector3.Zero;
    for (int i = 0; i < enemies.Length; i++) {
        if (enemies[i] == this) {
            continue;
        }
        Vector3 direction = this.position - enemies[i].position;
        float distance = direction.LengthSquared();
        float strenght = 0.0f;
        if (distance < (threshold)) {
            strenght = Math.Min(decayCoefficient / distance, this.maxAccel);
            direction.Normalize();
            separationVelocity += strenght * direction;
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.