Unity - 检测已接触的游戏对象

4
假设我有两个游戏对象,红色盘子和苹果。当游戏开始时(这很重要),苹果已经在红色盘子上(2个游戏对象已经接触)。所以如果我移动红色盘子,则苹果将“成为”红色盘子的子对象,并跟随变换。
如何在Unity3D中实现这一点?我查看了代码触发器和碰撞,它们都需要至少一个阶段的一个移动游戏对象来碰撞另一个对象,但我没有那个阶段。
你有什么想法怎样处理这个问题吗?

红色盘子不会随着苹果移动的游戏状态是否会存在? - Happy Apple
@HappyApple,有这样的情况需要我解决。 :) - sooon
2个回答

6
我找到了解决方案:Bounds.Intersect 就像这样:
var bounds1 = gameObject1.renderer.bounds;

var bounds2 = gameObject2.renderer.bounds;



if (bounds1.Intersects(bounds2))

{

    // do something

}

所以,通过这个方法,我的问题得以解决。

3
非常感谢! :D 我更喜欢使用gameObject1.collider.bounds,以使其独立于图形(至少我认为是这样)。 - kungfooman

0

可能最简单的实现方法是使用OnTriggerEnterOnTriggerExit来切换一个对象的变换父级,以便父级的所有子级都将接受在父级上执行的变换操作。

示例:

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;
        }
    }
}

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接