【发布时间】:2022-03-03 04:17:08
【问题描述】:
在过去的几天里,我一直在研究一些自定义汽车物理作为编码练习。
我的最终目标是在较旧的 GTA 游戏和最近的 GTA 5 之间获得一些半真实的汽车物理效果。
到目前为止,我得到的是一个非常复杂的过程,最终给了我一个浮点数,这是我希望汽车在下一帧之前行驶的确切速度,到目前为止,我已经使用以下代码来做到这一点;
this.transform.Translate (0, 0, speed * Time.deltaTime);
但是,因为我想使用 Unity 物理构建进行碰撞检测,所以我意识到这行不通,因为 transform.Translate(据我所知)实际上将对象放置在该位置,因此对象可以(如果去足够快)突然被墙卡住一半或完全忽略碰撞并出现在墙的另一侧。现在我决定这样做:
rb.velocity = transform.forward * speed;
要快速注意,我在我的 FixedUpdate 中同时执行了这两项操作,而我目前只使用第二个示例(或者至少尝试使用它并且不幸失败了)。由于它处于固定更新中,我至少应该能够在不使用 Time.deltaTime 的情况下对其进行一定程度的测试,这就是为什么您现在在第二个示例中看不到它的原因。
继续我的故事,由于某种原因,当我设置刚体的速度而不是使用 transform.Translate 时,我的碰撞行为非常奇怪。当我撞到墙上时,汽车变得漂浮并向前轻推(站在它的鼻子上),我不知道是什么导致了这种情况,因为我正在使用自己的重力(原始Rigidbody 的重力在支持我自己的自定义重力,这确实会导致向下的刚体力)并且刚体的阻力和角阻力已降低到 0。
基本上我的问题是你们中的任何人是否知道是什么导致我的刚体以这种方式做出反应,从字面上看,我的正常代码和正在运行的代码之间的唯一区别是单行更改.
我已经考虑使用 rigidbody.AddForce() 代替,但这似乎根本没有做任何事情,最重要的是,我编写汽车脚本的全部原因是确定对象应该是的速度移动从而使像rigidbody.AddForce() 这样的东西或多或少地增加了汽车的速度,不应该是必需的。
我什至首先使用刚体的唯一原因是我可以做两件事:1. 容易碰撞。这意味着我可以向它添加简单的力,例如重力,而不必担心它会穿过地板。 2. 受碰撞等物理影响时容易旋转。
如果有人对如何在自定义脚本中执行这两件事有任何想法,我更愿意这样做,因为尽管我喜欢统一,但 Unity 刚体物理在我眼中实际上毫无价值,但必须拥有,因为我无法编写自己的自定义刚体,也找不到 Unity Rigidbody 的源代码。我宁愿拥有一个精简版的刚体,它允许轻松碰撞和轻松旋转,但没有诸如阻力或速度之类的所有东西,因为这些正是我希望能够控制自己并拥有的东西到目前为止,当我使用transform.Translate 时,我能够控制自己,但是当我必须使用rigidbody.velocity 时,我失去了这种控制。
【问题讨论】:
-
幸好你没有使用 .Translate()。这将导致问题与您预期的完全不同。这将完全绕过物理引擎并杀死(除其他外)碰撞检测。
-
@steenbergh 我正在尝试停止使用 .Translate()。但是,正如我所说,我仍然遇到物理问题。我还发现 .Translate() 实际上并没有杀死物理或碰撞检测,只是由于 .Translate() 没有计算到连续碰撞中,对象可能会在中途卡住墙,然后进入太空,因为那是碰撞(固定时间步长)开始的时刻,因此确实破坏了我们的碰撞-.-但是 TLDR;是的,Translate() 没什么用处
-
@LAKster 答案应该作为答案发布在下面,而不是编辑到问题中。您似乎不再活跃,所以我继续将其作为社区 wiki 提交。如果您很活跃并想将其作为您自己的答案提交,请在此处的评论中@我,我会尝试删除社区 wiki 答案,以便您的答案可以成立。
标签: c# unity3d rigid-bodies