【问题标题】:Unity RigidBody Physics: Collision When NOT overlapping layerUnity RigidBody Physics:不重叠层时发生碰撞
【发布时间】:2019-10-17 02:20:58
【问题描述】:

Unity 是否有类似 CollideWhenRigidBodyLeavesLayer 的方法? 原因如下:

我的 npc 有三种运动类型:步行、游泳和飞行

他们使用刚体进行运动,它非常适合行走的角色。

它也适用于会飞的角色。通过调用 Physics.IgnoreLayerCollision(FlyingCharacterLayer, WaterLayer) 飞行角色现在可以飞越水面。

我的问题是,我怎样才能让我的游泳生物保持与水层重叠?

我已开启 Physics.IgnoreLayerCollision(SwimmingCharacterLayer, WaterLayer) 所以现在游泳的角色可以和水重叠了。

但是我如何测试我的海洋生物正在离开水并在这里产生碰撞,所以它转身继续游泳而不是进化成一条会走路的鱼......

我的关卡(以及水)是动态生成的,因此为碰撞测试添加周边障碍不是一个很好的选择。

此外,“地面”图形/图层存在于水图层下方,因此我认为没有一种测试与地面碰撞的好方法,因为我的鱼同时与地面和水重叠。

我希望我缺少一些基本的东西:)

谢谢!

更新: 我可以使用 Physics.CheckSphere 检查我的游泳角色是否不再与水重叠

但我不知道从那里做什么。 如果我尝试将他翻转 180 度,他会翻转每一帧,有时会回到水中,有时不会……

if(Physics.CheckSphere(transform.position, 0.25f, LayerMask.NameToLayer("Water")) == false)
{
    // Now I know that my fish is out of the water
    // but I can not figure out how to turn him around
}

【问题讨论】:

  • 不幸的是,物理系统不是这样工作的。 :(
  • 如何阻止行走的人进入水中?反过来也不应该这样吗?
  • 我想如果你添加一个更完整的代码示例将有助于更好地理解
  • @derHugo 感谢您的关注!真的没有大量的代码可以显示......水是一个 3d 对象,高约 0.1 个单位,位于地面上方。它附有一个碰撞器,因此刚体行走角色只需通过刚体物理的魔力与之交互:)

标签: c# unity3d game-physics rigid-bodies


【解决方案1】:

我并不为此感到自豪,但在这里摆弄之后是我想出的。

它似乎把鱼留在了池塘里,但弹跳并不漂亮。

它也完全违反了“不要对刚体变换大惊小怪”的规则......但是因为物理系统无论如何都不会与我一起工作......

enum CheckDirection { AHEAD, LEFT, RIGHT };
bool CheckAheadIsWater(CheckDirection dir = CheckDirection.AHEAD)
    {
        if(dir == CheckDirection.AHEAD)
            return Physics.CheckSphere(transform.position + transform.forward * 1.5f, 0.5f, LayerMask.GetMask(Settings.LayerWater));
        if(dir == CheckDirection.RIGHT)
            return Physics.CheckSphere(transform.position + forward + transform.right * 2f, 0.5f, LayerMask.GetMask(Settings.LayerWater));
        if(dir == CheckDirection.LEFT)
            return Physics.CheckSphere(transform.position + transform.forward - transform.right * 2f, 0.5f, LayerMask.GetMask(Settings.LayerWater));

        throw new System.Exception("No Check Existes For " + dir);
    }

void Update()
{
       if (!CheckAheadIsWater(CheckDirection.RIGHT))
        {
            print("about to leave water RIGHT");

            //turn left 45 degrees
            transform.rotation = Quaternion.LookRotation(transform.forward + transform.right * 0.5f);
        }

        if (!CheckAheadIsWater(CheckDirection.LEFT))
        {
            print("about to leave water LEFT");

            //turn right 45 degrees           
            transform.rotation = Quaternion.LookRotation(transform.forward - transform.right * 0.5f);
        }

        if (!CheckAheadIsWater())
        {
            print("about to leave water AHEAD");

            //bounce back 1 unit
            physicalBody.MovePosition(transform.position - transform.forward);
            //swim the opposite direction
            transform.rotation = Quaternion.LookRotation(-transform.forward);
        }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多