Rigidbody.Usegravity 碰撞输入不起作用

Rigidbody.Usegravity on collision enter doesnt work

我使用代码制作的物理学投掷炸弹。出于某种原因,除非我的物理学停止对物体施加力,否则它不会检测到碰撞。为了绕过它,我在碰撞进入时取消了施加的力并对其施加了重力,并将炸弹的移动设置为 LateUpdate,因此它会在 OnCollisionEnter 之后触发,但炸弹大部分时间仅与地板碰撞(网格碰撞,用 ProBuilder 制作的地板),但并非所有时间。炸弹碰撞检测设置为连续 感谢所有帮助,谢谢!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BombBehavior : MonoBehaviour
{
[SerializeField] float ExplosionForce = 300;
[SerializeField] float ExplosionRadius;
[SerializeField] float LaunchForceX;
[SerializeField] float LaunchForceY;
[SerializeField] float Delay;
float countdown;
Rigidbody rigidbodyy;
float gravity = 1;
Player player;
bool HasExploded = false;

// Start is called before the first frame update
void Start()
{
    rigidbodyy = GetComponent<Rigidbody>();
    player = Player.p;
    GetLaunchForceX();
    countdown = Delay;
}

private void GetLaunchForceX()
{
    
    if (transform.position.x > player.transform.position.x)
    {
        LaunchForceX *= 1;
    }
    else if (transform.position.x < player.transform.position.x)
    {
        LaunchForceX *= -1;
    }
}

private void LateUpdate()
{
    ThrowBomb();
}
private void Update()
{
    countdown -= Time.deltaTime;
    if (countdown <= 0 && !HasExploded)
    {
        ExplodeNearEnemy();
    }
}

private void ThrowBomb()
{
    if (rigidbodyy.useGravity == false)
    {
        Vector3 ThrowDirection = new Vector3(LaunchForceX, LaunchForceY, 0);
        LaunchForceY -= gravity;
        ThrowDirection.y = LaunchForceY;
        transform.Translate(ThrowDirection * Time.deltaTime);
    }
}

private void ExplodeNearEnemy()
{
    Collider[] colliders = Physics.OverlapSphere(transform.position, ExplosionRadius);
    foreach (Collider collider in colliders)
    {
        if (collider.gameObject.CompareTag("Enemy"))
        {
            Rigidbody enemyRB = collider.GetComponent<Rigidbody>();
            if (enemyRB != null)
            {
                enemyRB.useGravity = true;
                enemyRB.AddExplosionForce(ExplosionForce, transform.position, ExplosionRadius);
                Destroy(enemyRB.gameObject,1);
            }
        }
    }
    //Destroy(gameObject);
}
private void OnCollisionEnter(Collision collision)
{
    LaunchForceY = 0;
    LaunchForceX = 0;
    gravity = 0;
    rigidbodyy.useGravity = true;
}

}

如果你想让对撞机等工作,请使用 MovePosition() 移动刚体。通过直接改变变换来传送刚体会扰乱物理。

我不太明白这个问题,但看起来你想做一个 Bomb/Granate 那么你为什么不写一个函数并使用 AddForce()?

void Thow(Vector3 direction, float strength)
{
    rigidbodyy.AddForce(direction * strength, ForceMode.Impulse);
}

这样的事情应该有所帮助,因为您只需要获得投掷方向并施加力量,然后 Unity 将处理其余部分

或者如果你的炸弹没有与地面碰撞,给地面一个刚体并将 kinematic 设置为 true