【问题标题】:Rigidbody not acting as expected刚体未按预期运行
【发布时间】: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


【解决方案1】:

根据文档,您不应使用 rb.velocity 定期更改速度 - 这可能会导致不切实际的物理效果

http://docs.unity3d.com/ScriptReference/Rigidbody-velocity.html

改为使用 rb.addforce

http://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html

希望这能解决问题!

【讨论】:

  • 那么我遇到的问题是 addforce 动态地将它添加到速度中,它没有设置它。所以它应该是每帧的刚体.速度 += 速度,而不是我想要的刚体.速度 = 速度。 Rigidbody.addForce 可悲地做了一些与我想要的代码完全不同的事情
  • 您始终可以将速度设置为 0,这样您就不会在汽车达到所需速度时增加力量。可能值得尝试看看它是否解决了您的其他问题
  • @AlWyvrn 我刚刚尝试了您的想法,但现在它不起作用。统一物理只是无缘无故地不做任何事情。从字面上看,我所做的只是将我使用的行更改为 rb.AddForce (transform.forward * speed);从字面上看,什么也没有发生。汽车只是停在那里,它甚至没有像通常使用rigidbody.addForce()那样逐渐加速。此时,更改为Unreal之类的东西可能会少一些麻烦,因为标准的Unity东西越来越多比它现在帮助我的方式。
  • 有一个(官方和免费的)示例项目,它是您可以下载的汽车,可能值得一看,看看您可以从代码中学到什么!很奇怪 rb.addforce 什么都没做,至少你应该得到一些改变!
【解决方案2】:

Translate 替换为以下内容:

rb.MovePosition(transform.position + transform.forward * (speed * Time.deltaTime));

MovePosition 基本上充当翻译(如果你这样做的话),除了它也会计算碰撞。

【讨论】:

  • 这个答案最初被编辑成问题。提问者似乎处于非活动状态,因此我将其添加为社区 wiki
【解决方案3】:

如果您想要超级逼真的 3D 汽车物理,应该查看现成的资产,例如: Edy的车辆物理https://www.assetstore.unity3d.com/en/#!/content/403

同样来自 Unite2015 讲座,请参阅示例项目:“EasySuspension”以通过脚本构建示例 3D 汽车: http://bit.ly/1y8ucNW(来自视频:https://youtu.be/WGvuP6vV6j4?t=17m8s

游戏还是自上而下的2D游戏? (就像早期的 GTA 一样)

【讨论】:

  • 尽管我非常感谢您的回复,但我将这一切作为编码练习,所以购买现成的资产几乎会破坏制作这件事的整个目的。我以前看过车轮对撞机以及现在可以下载的整个标准“汽车资产”,但老实说,代码是交织在一起的,而且我第一次几乎无法理解它,我说实话,Unity 的基本 3D 汽车物理真的不是那么好。仍然感谢您所做的一切,不,我的游戏不是 2D 而是更多(请参阅下一条评论)
  • (继续我之前的评论)类似于我在第一篇文章中所说的以 3 开头,以 5 结尾的更现代的 GTA。再次感谢您的参考点,但现在我将继续弄清楚如何做我最初计划做的事情。
猜你喜欢
  • 2012-05-20
  • 2014-11-12
  • 1970-01-01
  • 2020-06-28
  • 2012-02-18
  • 2018-01-18
  • 2012-06-14
  • 2019-03-03
  • 2012-09-21
相关资源
最近更新 更多