当添加刚体时,为什么碰撞器会从游戏对象中掉落?

3

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

我正在制作一个游戏,想让拾取物品创建一个物理力爆炸来吹走敌人。我制作了一个简单的炸弹对象来测试这个想法。我添加了一个简单的代码,使用循环来收集其半径内的所有碰撞体,然后对这些碰撞体添加力。现在代码正常工作,但并不是所有的游戏对象都能正确地反应。

我查看了原因,并注意到当我给对象添加RigidBody组件时,我的Collider会从GameObject上掉落。RigidBody是需要AddForce影响的。当我移除rb时,collider保持在原地,但对象不会对物理力做出反应。

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

叶子的碰撞体下沉的图像..

那些对AddForce做出反应的对象的示例图像。

我已经尝试过:

  • 将所有组件设置从反应的立方体和石头Gameobjects复制/粘贴到叶子Gameobject中,同时禁用其他所有代码,例如C#脚本。碰撞体和RB不会穿过地板,但当物理力量击中碰撞体时,它被吹走而GameObject保持其位置。
  • 尝试不同的GameObject /Collider类型。
  • 删除水。
  • 调整炸弹的力量/半径。
  • 编辑GameObject的“标签”和“层样式”。

“Explosion Code”如下,但我认为问题不在代码中。我将代码添加到场景的主摄像机中,并将一个简单的球体作为“炸弹”GameObject。


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对象“cube”一样彼此保持连接,这样我就可以像其他模型一样用物理力量将它们吹走。

感谢您抽出时间。我已经尝试了很多方法并在互联网上搜索了几个小时,但似乎找不到解决方案。


如果你为叶子使用网格碰撞器而不是球形碰撞器会发生什么?你的模型中心可能会偏移,使得碰撞器的原点不在实际模型上。(但是如果没有刚体的话应该已经发生了)。此外,如果你增加碰撞器的中心 Y 值以再次匹配叶子,会发生什么?它会自动掉下来还是保持原地? - Remy
谢谢您的回复。网格碰撞器没有任何改变,但将碰撞器上的Y值更改为与叶子匹配,使碰撞器停止穿过地板,这是一个重大胜利!然而,碰撞器仍然无法粘附到游戏对象上。当我激活代码时,碰撞器会响应AddForce,但游戏对象不会移动,不像球体对象。我通过此链接添加了一张图片以说明。(https://pro2-bar.myportfolio.com/v1/assets/6648288a2e724954ca4f9c8ebd18fc86/7d190934-7f4a-4353-be3e-c23727c0dad7_rw_1920.png?h=cf37ccce7a78bce6e7102bc6126b3728) - Roos M Jansen
所以我刚刚给另一个荷叶对象添加了一个网格碰撞器,结果出现了同样的问题。我必须按下“凸起”按钮,否则荷叶会穿过地板。然而,碰撞器仍未正确附加到GameObject上,因为当我游向GameObject时,碰撞器会移动到不正确的位置。(https://pro2-bar.myportfolio.com/v1/assets/6648288a2e724954ca4f9c8ebd18fc86/5eb8d425-62d6-4823-8807-0df8b8ff01bf_rw_1920.png?h=871ab97718849174390002fafcfa9336) - Roos M Jansen
这很奇怪。当碰撞器移动但荷花/叶子保持不动时,变换的XYZ坐标是否发生改变?或者碰撞器的中心XYZ坐标是否发生了改变?您的叶子上是否有任何脚本与岩石上不同而导致其行为异常?如果是,请尝试禁用该脚本。也许还有其他锁定对象位置的脚本在运行(还请问一下您使用的Unity版本是哪个?) - Remy
1个回答

0
如果你在停止模式下添加刚体并按播放键,会发生什么?它是否以类似的方式移动?如果你的碰撞器彼此相交,这可能会发生,并且预计会发生。一旦你添加了一个刚体,它们就会陷入严重的碰撞中。
如果你不想修改场景,你可以在项目设置 / 物理中调整碰撞矩阵。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接