添加 RigidBody 时,Collider 是如何从 GameObject 上掉下来的?

Posted

技术标签:

【中文标题】添加 RigidBody 时,Collider 是如何从 GameObject 上掉下来的?【英文标题】:How come the Collider falls from the GameObject when a RigidBody is added? 【发布时间】:2019-06-26 22:01:56 【问题描述】:

我真的需要一些关于我的游戏对象的帮助。

我正在开发一款游戏,其中我想要一个拾取物品来制造物理力爆炸以吹散敌人。我做了一个简单的炸弹对象来测试这个想法。我添加了一个简单的代码,使用循环收集其半径内的所有对撞机,然后将强制添加到这些对撞机。现在代码可以正常工作了,但并不是我所有的游戏对象都能正常反应。

我研究了为什么会这样,我注意到一旦我向对象添加 RigidBody 组件,我的 Collider 就会不断地从游戏对象上掉下来。 AddForce 影响需要 RigidBody。当我移除 rb 时,对撞机保持原位,但对象不会对物理力做出反应。

我添加了一些图片来说明我的意思:

Image of the Collider of the leaf sinking away..

Example image of objects which DO react to the AddForce.

我已经尝试过:

从反应的立方体和石头复制/粘贴所有组件设置 在禁用所有其他代码的同时将游戏对象添加到叶游戏对象 比如c#脚本。对撞机和 RB 不会通过 地板,但是当物理力击中对撞机时,它会被吹走 游戏对象保持其位置。 尝试不同的游戏对象/碰撞器类型。 除去水。 使用炸弹的力量/半径。 编辑了游戏对象的“标签”和“图层样式”。

下面添加了“爆炸代码”,但是,我认为问题不在代码中。我将代码添加到场景的主摄像机中,并添加了一个简单的球体作为“炸弹”游戏对象。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Explosion : MonoBehaviour

    public GameObject bomb; //set the position of the explosion
    public float power = 10.0f;
    public float radius = 10.0f;
    public float upForce = 0.0f;

    private void FixedUpdate()
    
        if (Input.GetKeyDown("space"))
        
            print("space key was pressed");
            Invoke("Detonate", 1);
        
    

    void Detonate()
    
        Vector3 explosionPosition = bomb.transform.position; //set the position of our explosion to the position of the bomb.
        Collider[] colliders = Physics.OverlapSphere(explosionPosition, radius); //collects all colliders within the radius.
        foreach (Collider hit in colliders)  //for each individual collider the following code is ran.

            Rigidbody rb = hit.GetComponent<Rigidbody>(); //declare'rb' rigidbody. Get rb component from each collider
            if (rb != null)
            
                print("BOOM!");
                rb.AddExplosionForce(power, explosionPosition, radius, upForce, ForceMode.Impulse); //add force to each collider
            
        

    

如何让叶子的 Rigidbody、Collider 和 GameObject 像标准的 3D 对象“立方体”一样相互保持,这样我就可以像其他模型一样用物理力将它们吹走?

感谢您抽出宝贵时间,我已经尝试了几个小时并在 Internet 上四处寻找,但似乎找不到任何解决方案。

【问题讨论】:

如果对叶子使用网格对撞机而不是球体对撞机会发生什么?可能是您模型的中心偏移了,使对撞机的原点不在您的实际模型上。 (然而,那应该已经发生了,没有 rb)。另外,如果您增加对撞机的中心 Y 值以再次匹配您的叶子会发生什么?是再次自动倒下还是原地不动? 感谢您的回复。网格对撞机没有任何区别,但改变对撞机上的 Y 值以匹配叶子使对撞机停止从地板上掉下来,这是一个很大的胜利!但是,对撞机仍然没有粘在 GameObject 上。当我激活代码时,对撞机会响应 AddForce 但 GameObject 不会移动,这与球体对象不同。我通过这个链接添加了一张图片来说明。 (pro2-bar.myportfolio.com/v1/assets/…) 所以我只是在另一个荷叶对象上添加了一个网格对撞机,同样的事情发生了。我必须按“凸”,否则莲花会从地板上掉下来。但是,当我对着游戏对象游泳时,对撞机仍然没有正确附加到游戏对象上,因为它移动了位置。 (pro2-bar.myportfolio.com/v1/assets/…) 这很奇怪。当对撞机移动但莲花/叶子保持原位时,变换的 XYZ 是否会发生变化?或者对撞机上的中心XYZ会改变吗?你的叶子上是否有任何脚本不在你的岩石上,它们的行为符合预期?如果是这样,请尝试禁用该脚本。也许还有另一个脚本可以锁定对象的位置(还有你使用的是哪个版本的 Unity?) 【参考方案1】:

如果在停止模式下添加刚体并按下播放会发生什么?它会以类似的方式离开吗?如果您的对撞机彼此相交,这可能并且预计会发生。一旦添加了刚体,它们就会发现自己陷入了严重的碰撞中。

如果不想修改场景,可以在项目设置/物理中摆弄碰撞矩阵

【讨论】:

以上是关于添加 RigidBody 时,Collider 是如何从 GameObject 上掉下来的?的主要内容,如果未能解决你的问题,请参考以下文章

转载 unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger)

Rigidbody(刚体) and Collider(碰撞器)

Unity3d刚体Rigidbody与碰撞检测Collider

关于Rigidbody,Collider和CharacterController三者之间的关系和用法的总结

unity2D物理引擎之-Rigidbody 2D

unity, Collider2D.attachedRigidbody