添加 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