unity3d - 使用 OnCollisionEnter 偶尔会应用两次强制
问题描述
我正在创建一个第一人称火箭跳跃游戏,前提是在玩家脚下发射火箭发射器以四处走动。
我的 OnCollisionEnter 函数存在问题,该函数将所有对撞机存储在一个半径内并向它们施加爆炸力。当玩家完全处于爆炸的顶部时,将施加两次力。这是代码:
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Player")
{
}
else
{
GetComponent<AudioSource>().Stop();
Instantiate(explosionPrefab, transform.position, transform.rotation);
Vector3 explosionPos = transform.position;
//Use overlapshere to check for nearby colliders
Collider[] collidersToDestroy = Physics.OverlapSphere(explosionPos, radius);
foreach (Collider hit in collidersToDestroy)
{
//searches for what needs to be destroyed before applying force, this is for destructable objects
Destructible dest = hit.GetComponent<Destructible>();
if (dest != null)
{
dest.DestroyWall();
}
ExplosiveBarrel barrel = hit.GetComponent<ExplosiveBarrel>();
if (barrel != null)
{
barrel.BarrelExplode();
}
}
Collider[] collidersToMove = Physics.OverlapSphere(explosionPos, radius);
foreach (Collider hit in collidersToMove)
{
Rigidbody rb = hit.GetComponent<Rigidbody>();
//Add force to nearby rigidbodies
if (rb != null)
{
rb.AddExplosionForce(power * 5, explosionPos, radius, 3.0F);
if (hit.gameObject.tag == "Player")
{
//if player is hit
UnityEngine.Debug.Log("Hit");
}
}
Destroy(gameObject);
}
}
}
我可以通过使用 UnityEngine.Debug.Log("Hit"); 告诉玩家两次施加了力。,它在控制台中出现两次。此外,我很确定这发生在同一帧上,就像把 Destroy(gameObject); 在 if (player hit) 语句中产生相同的结果。
这只发生在玩家就在爆炸旁边时,如果玩家距离很近,则只施加一次力。我非常想解决这个问题,并且只施加一次力。
非常感谢所有帮助,在此先感谢您。
解决方案
我解决了!OnCollisionEnter 被调用了两次,因为我有两个对撞机完美地堆叠在一起,所以射弹在同一时间步击中了 2 个对撞机。
推荐阅读
- javascript - 只是试图让不和谐机器人运行,但我得到一个错误,因为“一次”没有在@discordjs/voice/dist/audio/audioplayer.js 中定义
- javascript - 如何在谷歌地图中显示存储为字符串的多边形坐标?
- php - 有什么方法可以为 eloquent 和 Laravel 执行的所有查询添加连接参数?
- python - 调用 uptime -s 返回不同的结果
- tls1.2 - javax.net.ssl.SSLException:在握手期间收到 close_notify
- python - 合并numpy矩阵中的列
- python - 在 python 日志中为每个会话添加会话 ID 或某些唯一 ID
- excel - 将公式复制到整个列表
- javascript - 具有文字字符串属性的打字稿对象文字
- flutter - 在径向堆栈中排列图像,并手动操作重叠