统一 - 检测已经联系的游戏对象

时间:2013-12-12 06:51:47

标签: unity3d collision eventtrigger

想象一下,我有2个gameobjects,红色的盘子和苹果。 当比赛开始时(这是至关重要的),苹果已经在红盘上(2 gameobjects已经联系)。所以,如果我移动红板,那么苹果就会成为红板的“父母”并跟随变换。

我如何在Unity3D中执行此操作?我看一下代码TriggerCollision,它们都至少需要一个1移动gameobject来碰撞另一个的阶段,我没有这个阶段。

知道怎么处理这个吗?

2 个答案:

答案 0 :(得分:6)

我找到了解决方案:Bounds.Intersect

如:

var bounds1 = gameObject1.renderer.bounds;

var bounds2 = gameObject2.renderer.bounds;



if (bounds1.Intersects(bounds2))

{

    // do something

}

因此,我的问题解决了。

答案 1 :(得分:0)

最简单的实现可能是使用OnTriggerEnterOnTriggerExit将一个对象的变换的父变换切换到另一个变换,这样父变量的所有子项都将接受对父变换执行的变换操作。 / p>

示例:

using UnityEngine;

[RequireComponent(typeof(BoxCollider))]
[RequireComponent(typeof(Rigidbody))]

public class
    PlateCollider : MonoBehaviour
{
    private void
        Awake()
    {
        rigidbody.isKinematic = false;
        rigidbody.useGravity = false;
        collider.isTrigger = false;
    }
}

using UnityEngine;

[RequireComponent(typeof(SphereCollider))]
[RequireComponent(typeof(Rigidbody))]

public class 
    AppleCollider : MonoBehaviour 
{
    private void
        Awake()
    {
        rigidbody.isKinematic = false;
        rigidbody.useGravity = false;
        collider.isTrigger = false;
    }

    private void
        OnCollisionEnter(Collision collision)
    {
        PlateCollider tryGetPlate = collision.gameObject.GetComponent<PlateCollider>();

        if (tryGetPlate != null)
        {
            transform.parent = tryGetPlate.gameObject.transform;
        }
    }

    private void
        OnCollisionExit(Collision collision)
    {
        PlateCollider tryGetPlate = collision.gameObject.GetComponent<PlateCollider>();

        if (tryGetPlate != null)
        {
            transform.parent = null;
        }
    }
}

您还可以使用许多其他方法来比较这两个对象。在这个例子中,我尝试在碰撞的游戏对象上获取组件并检查组件引用是否存在。碰撞标签可能是一个更好的选择,它可能不是。