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
我使用代码制作的物理学投掷炸弹。出于某种原因,除非我的物理学停止对物体施加力,否则它不会检测到碰撞。为了绕过它,我在碰撞进入时取消了施加的力并对其施加了重力,并将炸弹的移动设置为 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