Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity刚体未按预期操作(是否有编写自定义刚体的想法?)_C#_Unity3d_Rigid Bodies - Fatal编程技术网

C# Unity刚体未按预期操作(是否有编写自定义刚体的想法?)

C# Unity刚体未按预期操作(是否有编写自定义刚体的想法?),c#,unity3d,rigid-bodies,C#,Unity3d,Rigid Bodies,在过去的几天里,我一直在做一些定制的汽车物理编码练习 我的最终目标是在老式GTA游戏和最近的GTA 5游戏的质量之间有一些半现实的汽车物理特性 到目前为止,我得到的是一个相当复杂的过程,它最终给了我一个浮点数,这是我希望汽车行驶到下一帧的准确速度,到目前为止,我使用了以下代码来实现这一点: this.transform.Translate (0, 0, speed * Time.deltaTime); 然而,因为我想使用Unity build in physics进行碰撞检测,我意识到这是行不

在过去的几天里,我一直在做一些定制的汽车物理编码练习

我的最终目标是在老式GTA游戏和最近的GTA 5游戏的质量之间有一些半现实的汽车物理特性

到目前为止,我得到的是一个相当复杂的过程,它最终给了我一个浮点数,这是我希望汽车行驶到下一帧的准确速度,到目前为止,我使用了以下代码来实现这一点:

this.transform.Translate (0, 0, speed * Time.deltaTime);
然而,因为我想使用Unity build in physics进行碰撞检测,我意识到这是行不通的,因为transform.Translate(据我所知)确实将对象放置在该位置,因此对象可以(如果速度足够快的话)突然被墙卡住一半,或者完全忽略碰撞,出现在墙的另一边。现在,我决定这样做

rb.velocity = transform.forward * speed;
要快速指出的是,我在FixedUpdate中做了这两件事,目前我只使用第二个示例(或者至少尝试使用它,但失败得很惨)。由于它在固定更新中,我应该至少能够在没有时间的情况下对它进行一定程度的测试

为了继续我的故事,出于某种原因,当我设置刚体的速度而不是使用transform.Translate时,我的碰撞行为非常奇怪。当我撞到墙上时,汽车变得漂浮并向前推(站在它的鼻子上),我不知道是什么导致了这种情况,因为我使用的是我自己的重力(原始刚体的重力被关闭,以支持我自己的自定义重力,这会导致向下的刚体力)和阻力,刚体的角阻力被调低到0

基本上,我的问题是,你们有没有人知道是什么导致我的刚体做出这样的反应,从字面上说,我的正常代码和正在运行的代码之间的唯一区别就是单行代码的变化

谢谢你的回答

-拉尔斯

编辑:又过了几个小时。我已经考虑过使用rigidbody.AddForce()来代替它,但这似乎根本没有任何作用,更重要的是,我编写汽车脚本的全部原因是为了确定对象移动的速度,从而生成类似rigidbody.AddForce()的东西这增加了汽车的速度,或多或少是多余的,不必要的

我使用刚体的唯一原因是我可以做两件事:1。容易碰撞。这意味着我可以给它加上简单的力,比如重力,而不用担心它穿过地板。2.受物理(如碰撞)影响时容易旋转

如果有人对如何在自定义脚本中完成这两件事有任何想法,我宁愿这样做,因为尽管我非常喜欢unity,但unity刚体物理学在我看来实际上毫无价值,但我必须有,因为我无法编写自己的自定义刚体,而且我也找不到unity刚体的源代码。我想要的是一个简化版的刚体,它允许简单的碰撞和旋转,但是没有像内置的阻力或速度这样的东西,因为这些正是我想要控制自己的东西,到目前为止,当我使用transform.Translate时,我已经能够控制自己了,但当我不得不使用刚体速度时,我就失去了控制

如果有人有任何想法,请提前感谢

Edit2:我现在已经修好了,我觉得自己非常愚蠢,因为我之前没有意识到这一点。我所要做的就是用下面的内容替换类似的翻译

rb.MovePosition (transform.position + transform.forward * (speed *     Time.deltaTime));
我还了解到,MovePosition基本上起到了平移的作用(如果你这样做的话),除了它还计算碰撞


再次感谢所有想帮忙的人

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

而是使用rb.addforce


希望这能解决问题

如果你想要超逼真的3D汽车物理,应该研究一下现成的资产,如: 埃德的车辆物理学

同样来自Unite2015会谈,参见示例项目:“EasySuspension”,通过脚本构建示例3D汽车: (来自视频:)


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

那么我的问题是,addforce动态地将它添加到速度中,而不是设置它。所以它应该是刚体。速度+=每帧的速度,而不是刚体。速度=速度,这是我想要的。不幸的是,Rigidbody.addForce做的事情与我在代码中想要的完全不同。您可以始终将速度设置为0,这样当汽车以所需速度行驶时,您就不会添加力。值得一试,看看它是否能解决你的另一半problem@AlWyvrn我刚试过你的主意,但现在不行。统一物理没有任何明显的原因。实际上,我所做的只是将我使用的行更改为rb.AddForce(transform.forward*speed);实际上什么也没发生。汽车只是停在那里,它甚至没有像刚体一样逐渐加速。addForce()在这一点上,改变为虚幻的东西可能不会那么麻烦,因为标准的Unity东西比它现在帮助我的东西更多。有一个(官方和免费的)示例项目是一辆汽车,你可以下载,也许值得一看,看看你能从代码中学到什么!很奇怪rb.addforce什么都没做,至少你应该得到一些改变!幸好您没有使用.Translate()。这将导致与您预期完全不同的问题。这将完全绕过物理引擎,并导致死亡(