首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unity RigidBody物理:不重叠图层时的碰撞

Unity RigidBody物理:不重叠图层时的碰撞
EN

Stack Overflow用户
提问于 2019-10-17 10:20:58
回答 1查看 218关注 0票数 0

Unity有类似CollideWhenRigidBodyLeavesLayer方法的东西吗?原因如下:

我的鼻咽癌有三个MovementTypes:行走、游泳和飞行

他们使用刚体来移动,对于行走的角色来说,它工作得很漂亮。

它对会飞的角色也很有效。通过调用Physics.IgnoreLayerCollision(FlyingCharacterLayer,WaterLayer),飞行角色现在可以在水面上飞行。

我的问题是,如何让我的游泳生物与水层保持重叠?

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

但我如何测试我的海洋生物是否离开了水,并在这里造成了碰撞,这样它就会转身继续游泳,而不是进化成一条会走路的鱼……

我的关卡(以及水位)是动态生成的,因此添加一个用于碰撞测试的周边障碍物并不是一个非常好的选择。

此外,“地面”图形/层存在于水层之下,所以我不认为有一个很好的方法来测试与地面的碰撞,因为我的鱼同时重叠在地面和水中。

我希望我错过了一些基本的东西:)

谢谢!

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

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

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

发布于 2019-10-18 02:12:57

我并不真的为此感到自豪,但在这里转来转去之后,我想出了一个办法。

它似乎能把鱼留在池塘里,但反弹的效果并不好。

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

代码语言:javascript
复制
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);
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58423986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档