在统一中,我有一个应该击球的球拍,并且球拍直接由鼠标控制,即鼠标使用鼠标轴移动球棒并使用 translate() 函数移动球拍。
我预计 Unity3d 的物理特性不会直接通过鼠标正确地转换球拍的运动并相应地影响球,我必须编写一些自定义的内容,结果证明是正确的。
但是当球拍移动时,无法正确检测到球的碰撞。当它静止时,一切都很好,球的表现也如我所愿。
现在我编写了一个自定义物理脚本(我使用 C# 进行脚本编写),其中我将 4 个长度为 0.6F 的光线投射附加到球上,并在进行一些复杂的矢量计算后,计算球击中球拍后的速度,并使用rigidbody.velocity =calculateVelocity()将其直接应用于球的速度。现在,当球拍不移动时,它又可以正常工作,但当我移动球拍时,它就不能正常工作了。问题的确切(症状)是:
使用内置物理和碰撞检测:当球拍移动时,球有时会直接穿过球拍,有时会减慢速度(达到令人难以置信的水平)。
使用我的脚本计算速度:问题是相同的,但它让我在打印对撞机(球拍)的法线时确定出了什么问题。它有时给出正确的法线,有时给出法线向量的负值,这意味着它直接穿过顶面并检测对撞机(球拍)底侧的撞击。
我尝试过的事情:
增加对撞机的大小(它与球拍上更宽的盒子对撞机一起使用,但显然球从距离球拍很远的地方移动,我自己的脚本在这里工作,默认物理在球拍移动时给出奇怪的结果) ,总之我没有得到我想要的现实。
将固定时间戳减少到 0.001,这显着改善了情况,但离我想要的结果仍然非常非常远,而且球再次经常选择球的错误一侧。
将碰撞检测更改为连续动态。这也没有改善事情。
除了碰撞时选择错误的一侧之外,我观察到的另一个问题是,球从球拍弹起后,球在移动,但球拍移动得更快,它不是沿着完整的弧线或直线移动,而是以某种方式出现在前面球,导致两次击球。这是基于可见事物的推测。
此外,很明显,Unity3d 的内置物理系统没有读取球拍的“运动”方面,导致当使用鼠标击球移动球拍时会出现奇怪的行为。
我被困住了,我不知道该从这里搬到哪里。请告诉我我做错了什么。
正如其他人指出的那样,问题在于球从一个帧中位于垫的一侧变成了下一帧中的另一侧。如果障碍物太薄,快速移动的物体往往会这样做。
对于这个问题有三个非常简单的解决方案:
- 增加垫或球的尺寸,这就是更改对撞机尺寸时发生的情况。
- 确定球的最大速度,使其永远无法移动得足够快以穿过垫子。
- 提高 Unity 进行物理计算的频率。它可以改变在时间经理 http://unity3d.com/support/documentation/Components/class-TimeManager.html,减小固定时间步长的值。请注意不要减少太多,否则物理引擎将无法在下一轮开始之前完成调用,并且永远无法赶上游戏。
设置移动物体的最大速度是必须始终完成的事情。你不能冒险让一个重要的物体在游戏过程中飙升,而让一切都处于不受控制的状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)