Unity3d维持多个GameObjects之间的最小距离c#

时间:2016-05-28 23:51:35

标签: c# unity3d

我有多个敌人向玩家移动。我试图阻止它们相互融合,即保持彼此之间的某种类型的最小距离。我正在尝试的是(来自unity3d论坛):

enemy1.transform.position = (enemy1.transform.position - 
enemy2.transform.position).normalized  * distance + enemy2.transform.position;

然而,当我有> = 3个敌人时,即使我将它应用于每个敌人的组合,他们似乎仍然会堆积起来。

我需要一个更好的方法,因为这个方法不起作用而且不能扩展。

1 个答案:

答案 0 :(得分:0)

你在你的敌人预制件周围做的是放置一个四方盒,实际上是一个触发元素,然后在你设置的敌人的脚本上,如果另一个敌人(使用标签类型,我想象)接触到四边形框然后运行适当的代码来阻止敌人越来越近并防止敌人实际上与此触发器盒重叠。

你在问题​​中举例说明的代码看起来像是专门引用敌人单位而不是实例权利,这很可能是一种糟糕的编码方式,正如你所发现的那样,处理非特定命名是非常不灵活的参考实体。

    using UnityEngine;
    using System.Collections;

    public class ExampleClass : MonoBehaviour
{

    private Transform otherEntity;
    public float distance = 50.0f;
    private Transform thisEntity;

    void OnTriggerEnter(Collider other)
    {
        otherEntity = other.GetComponent<Transform>();
        thisEntity = GetComponent<Transform>();
        thisEntity.position = (thisEntity.position - otherEntity.position).normalized * distance + otherEntity.position;
    }
}

我还没有测试过上面的代码,但是使用你引用的代码,转换的值是从引用实体的游戏组件中加载的,因为自从版本5.1发布以来你已经改变了Unity中的ALOT以及你的代码来源是2012年给出的答案!!

thisEntity是脚本所附加的对象,通常是敌人之一。 otherEntity是四元触发器中的对象(请记住,四元组需要作为触发元素引用。

输入触发器后,需要设置Entity变量的值,以便它始终影响正确的other元素。

(我的方法可能完全错了,但我希望这会有所帮助。)