gpt4 book ai didi

c# - 在 Raycast 指向的地方放置一个对象,但在 Unity3D 中考虑碰撞

转载 作者:行者123 更新时间:2023-11-30 21:52:22 27 4
gpt4 key购买 nike

我正在尝试将一个对象放置在我的 Raycast 指向的位置(Raycast 发现碰撞的位置)。但我得到的是你在所附图片中看到的(2 种不同的情况)。该对象确实放置在我指向的位置,但我想考虑碰撞,以便对象不会相互穿过。每个对象都有自己的 Collider。

Two different cases in which objects are positioned through each other

有人知道怎么解决吗?谢谢。

一月

编辑:

我试过像这样实现 @31eee384 给出的解决方案:

RaycastHit hit;
Game.MuebleAEditarGO.transform.position = CameraFacing.transform.position;
if (Game.MuebleAEditarGO.GetComponentInChildren<Rigidbody>().SweepTest(CameraFacing.transform.rotation * Vector3.forward, out hit, 50f))
{
Game.MuebleAEditarGO.transform.position += CameraFacing.transform.forward * hit.distance;
}

MuebleAEditarGO 是一个刚体。墙壁(和一般的房子)不是刚体,它们每个都有 MeshoColliders。

但后来我得到了一个部分有效的解决方案。当 RaycastHit 只发现一次碰撞时,它似乎工作正常(见下图)。

Image showing the problem with rigidbodies and collisions

最佳答案

最直接的解决方案是使用 Unity 的物理引擎:Rigidbody.SweepTest .它使用碰撞器扫描您的实际刚体(没有像边界框或手动距离检查那样的抽象),并且它将通过物理引擎可以提供的所有优化和通用计算来执行此操作。

要使用它,请查看 SweepTest 文档页面上的示例,为了完整性而复制到此处:

RaycastHit hit;
if (rb.SweepTest(transform.forward, out hit, collisionCheckDistance))
{
aboutToCollide = true;
distanceToCollision = hit.distance;
}

然后使用 transform.forward * distanceToCollision 确定对象移动多远,直到它发生第一次碰撞。例如:

RaycastHit hit;
couch.transform.position = transform.position;
if (couch.SweepTest(transform.forward, out hit, 50f))
{
couch.transform.position += transform.forward * hit.distance;
}

确保您的对象位于不同的物理层上,这样沙发就不会与玩家的碰撞体发生碰撞。

关于c# - 在 Raycast 指向的地方放置一个对象,但在 Unity3D 中考虑碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34813399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com