判断Unity 物理碰撞的方向,包含Trigger触发的方向

通过向量的方式计算,相对于本身的方向。可以延伸出碰撞角度计算等。
Unity.Physics性能警告,慎用。
使用场景:自己决定。

    enum DirEnum
    {
        None,
        Right,
        Left,
        Top,
        Bottom,
        Front,
        Back
    }
    // private void OnTriggerEnter(Collider other)
    // {
    //     Debug.Log($"OnTriggerEnter,{other.transform.name}");
    //     JudgeColliderDir(other);
    // }
    private void OnCollisionEnter(Collision other)
    {
        Debug.Log($"OnCollisionEnter,{other.transform.name}");
        JudgeCollisionDir(other);
    }
    enum DirEnum
    {
        None,
        Right,
        Left,
        Top,
        Bottom,
        Front,
        Back
    }
    /// <summary>
    /// 判断触发的方向
    /// </summary>
    DirEnum JudgeColliderDir(Collider other)
    {
        DirEnum dirEnum=DirEnum.None;
        Vector3 transPos = transform.position;
        Vector3 closePos = other.ClosestPointOnBounds(transPos);
        Vector3 dir = (transPos-closePos).normalized;
        if (dir.x>=1)
        {
            dirEnum = DirEnum.Right;
        }
        if (dir.x<=-1)
        {
            dirEnum = DirEnum.Left;
        }
        if (dir.y>=1)
        {
            dirEnum = DirEnum.Bottom;
        }
        if (dir.y<=-1)
        {
            dirEnum = DirEnum.Top;
        }
        if (dir.z>=1)
        {
            dirEnum = DirEnum.Front;
        }
        if (dir.z<=-1)
        {
            dirEnum = DirEnum.Back;
        }
        return dirEnum;
    }
    /// <summary>
    /// 判断碰撞的方向
    /// </summary>
    DirEnum JudgeCollisionDir(Collision other)
    {
        DirEnum dirEnum=DirEnum.None;
        Vector3 dir = other.contacts[0].normal;
        if (dir.x>=1)
        {
            dirEnum = DirEnum.Right;
        }
        if (dir.x<=-1)
        {
            dirEnum = DirEnum.Left;
        }
        if (dir.y>=1)
        {
            dirEnum = DirEnum.Bottom;
        }
        if (dir.y<=-1)
        {
            dirEnum = DirEnum.Top;
        }
        if (dir.z>=1)
        {
            dirEnum = DirEnum.Front;
        }
        if (dir.z<=-1)
        {
            dirEnum = DirEnum.Back;
        }
        return dirEnum;
    }
### Unity3D 中碰撞触发的使用方法 在 Unity3D 中,碰撞体(Collider)用于定义物体之间的物理交互行为。当两个带有 Collider 的对象发生接触时,默认情况下会执行刚体间的碰撞响应。然而,通过设置其中一个或多个 Collider 为 Trigger,可以使这些对象之间不产生实际的物理碰撞效果而是触发特定事件。 #### 设置触发器 为了使某个 Collider 成为触发器,在 Inspector 面板中的该组件上勾选 **Is Trigger** 属性即可[^1]。此时此 collider 不再参与常规意义上的碰撞计算,而是在其他 Rigidbody 或者同样标记为 trigger 的 collider 进入其范围时发送消息给脚本处理逻辑。 #### 编写触发回调函数 对于希望监听并响应触发事件的游戏对象来说,需要在其挂载的 MonoBehavior 脚本内实现相应的虚函数来捕获进入、停留以及离开触发区域的动作: - `OnTriggerEnter(Collider other)` 当另一个具有 Rigidbody 组件的对象首次触碰到当前作为触发器的 Collider 时调用。 - `OnTriggerStay(Collider other)` 如果另一物体持续处于触发区域内,则每一帧都会被调用一次。 - `OnTriggerExit(Collider other)` 只要之前位于触发区内的物体移出了这个空间就会被执行。 下面是一个简单的例子展示了如何利用上述机制销毁带有所谓 "pick up" 标签的目标实体[^2]: ```csharp private void OnTriggerEnter(Collider collision) { if (collision.CompareTag("PickUp")) { // 注意这里修正了原代码中的拼写错误 Destroy(collision.gameObject); } } ``` 请注意,以上示例假设目标对象确实拥有名为 `"PickUp"` 的标签;如果没有预先设定好这样的分类标识符,那么条件判断将永远不会成立。 另外值得注意的是,如果遇到某些外部导入的模型比如 FBX 文件无法正常工作的情况,可能是因为缺少必要的几何数据支持。确保 Project 窗口中对应的资源项已开启 **Generate Colliders** 选项可以帮助解决这类问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值