【问题标题】:How to handle 2d collisions in a script that isn't attached to Game Object如何在未附加到游戏对象的脚本中处理 2d 碰撞
【发布时间】:2016-04-18 08:35:45
【问题描述】:

一般来说,据我所知,碰撞是在附加到游戏对象的脚本中处理的。在我的游戏中,我有 6 个游戏对象相互碰撞,使得前一个想法难以实现。我想制作所有游戏对象预制件并在附加到空游戏对象的另一个脚本中实例化它们。如何在新脚本中处理所有这 6 个游戏对象之间的碰撞?

【问题讨论】:

  • 为什么会“难以实施”?当发生碰撞时你想发生什么?弹跳是自动的
  • 就目前而言,只有一个对象有一个预制件,我在一个空的游戏对象中实例化了多个副本。所有游戏对象相互碰撞会导致盒子碰撞器、精灵渲染器、对象破坏和创建以及施加的力发生变化,这些都是在碰撞过程中发生的一些事情。棘手的事情是,例如,如果对象 A 与对象 B 发生碰撞,对象 A 应该具有对撞机还是对象 B 或两者都有?如果只有少数物体发生碰撞,这个决定会很简单。
  • 我根本追不上你。如果 A 与 B 发生碰撞,则 A 和 B 都有碰撞器。
  • 你可能想问这个问题:想象一个典型的游戏,有一个敌人和一个射弹。在游戏过程中,弹丸击中了敌人。 (显然两者都有碰撞器和刚体 - 一切都必须有碰撞器和刚体)。例如,当他们击中时,敌人会爆炸。当然,你有一个问题,你做那个代码是为了“在子弹上”炸毁敌人!或“在敌人身上!”对此没有什么神秘的答案,它只是一个日常的编程决定——你可以做任何一种方式。如果这就是你要问的,那就是答案。

标签: unity3d unity5


【解决方案1】:

我想知道和 Joe Blow 一样的事情,但如果你想做的是手动处理碰撞(顺便说一下,这会使物理变得更难,因为你必须计算弹力、重力等。 .手动)然后你可以试试这个:

public class OtherScript : MonoBehavior
{
    public GameObject[] objects; //Your 6 GameObject

    void Update()
    {
        for (int i=0; i<objects.Length; i++)
        {
            for (int j=0; j<objects.Length; i++)
            {
                if (objects[i].GetComponent<Renderer>().bounds.Intersects(
                           objects[j].GetComponent<Renderer>().bounds))
                {
                    //Handle collision
                    break;
                }
            }
        }
    }
}

如果这不起作用,那么您也应该尝试使用GetComponent&lt;MeshFilter&gt;().mesh.bounds。请注意,如果您的游戏是 2D 游戏,则应改用 GetComponent&lt;SpriteRenderer&gt;().mesh.bounds

【讨论】:

  • 请查看我对 Joe Blow 评论的回复。我尽量避免在更新方法中检查冲突,是否可以创建自定义 OnCollisionEnter2D 方法来解决我的问题。
  • 当然可以使用委托和事件为碰撞创建自定义事件,但您仍然必须检测碰撞(通过检查边界或 Unity 的物理引擎)才能触发自定义事件。也许如果您对您想要达到的目标提供更多解释,我们可以提出一些不同的想法。
  • 我对你的问题@Nullititiousness当然感到困惑,显然,当你有碰撞docs.unity3d.com/ScriptReference/…等等时会有回调。
  • 是否有可能(出于某种原因)假设您试图将所有碰撞事件传递给主脚本或某个主要对象上的脚本?如果是这样,那很简单,只需使用 unityEvent,您在 Unity 中出于多种原因一直使用它...stackoverflow.com/a/36249404/294884
  • 嗨@Nullititiousness 太棒了 - 请务必在此处“勾选”答案以结束 QA 并保持董事会整洁,谢谢
猜你喜欢
  • 1970-01-01
  • 2011-07-06
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多