在过去的几天里,我一直在研究一些定制的汽车物理作为编码练习。
我的最终目标是在旧版 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
。