【问题标题】:Unity3d maintaining a minimum distance between multiple GameObjects c#Unity3d保持多个GameObjects c#之间的最小距离
【发布时间】:2016-05-28 23:51:34
【问题描述】:

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

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

但是,当我有 >= 3 个敌人时,即使我将其应用于每个敌人组合,它们似乎仍然会聚在一起。

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

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您在敌人预制件周围所做的是放置一个实际上是触发元素的四边形框,然后在您设置的敌人的脚本上,如果另一个敌人(我想使用标签类型)进入四边形的接触范围内框然后运行适当的代码来阻止敌人靠近并防止敌人实际上与这个触发框重叠。

    您在问题中示例的代码看起来像是专门引用敌人单位而不是实例实体,这很可能是一种不好的编码方式,正如您所发现的那样,处理未明确命名的方法非常不灵活参考实体。

        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 中这已经改变了很多是2012年给出的答案!!

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

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

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

    【讨论】:

    • 非常感谢,这正是我一直在寻找的想法。
    • GetComponent&lt;Transform&gt; 应该比obj.transform 慢,并且编写速记仍然被认为是此类的最佳实践(尽管它已被其他组件弃用)。此外,将otherEntity 声明为成员变量不会给您带来任何好处:如果它仅在函数中使用(这通常适用于碰撞处理程序),则它应该是本地的以提高可读性。缓存thisEntity 可能会为您节省一点时间,但如果是这样,它应该缓存在Awake() 中。 (也可以将其设为局部变量。)注意,@shell
    • @piojo 我纯粹是凭记忆写的,并不确定 obj.transform 在上述情况下是否可以识别,因此使用getComponent 只是为了确定。我同意 thisEntity 应该被缓存(无需在每次触发时重新建立)。为反馈干杯
    • @Martin 这是可以理解的。我主要是想确保 OP 不会将您的答案视为福音,就像新程序员在最终找到可行的方法时有时会做的那样。干杯。
    猜你喜欢
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多