首页 文章

用鼠标控制的球拍碰撞检测快速移动球的问题

提问于
浏览
8

在统一中,我有一个应该击球的球拍,并且球拍由鼠标直接控制,即使用鼠标轴移动球棒并使用transform.translate()函数移动球拍 .

我预计Unity3d的物理不能直接用鼠标正确地转换球拍的动作并相应地击球,我必须写一些自定义的东西,结果证明是真的 .

但是当球拍移动时球的碰撞没有被正确检测到 . 当它静止时,一切都很好,球就像我喜欢的那样 .

现在我开始编写一个自定义物理脚本(我使用C#编写脚本),其中我将4个长度为0.6F的光线投影附加到球上,并且在做了一些复杂的矢量计算后,计算球击中球后的速度,并使用rigidbody.velocity = calculateVelocity()将其直接应用于球的速度 . 现在,当球拍没有移动时它再次正常工作,但是当我移动球拍时却没有 . 确切的(症状)问题是:

使用内置物理和碰撞检测:当球拍移动时,球有时直接穿过球拍,有时,它会减速(达到令人难以置信的水平) .

使用我的脚本来计算速度:问题是一样的,但是当我打印对撞机(球拍)的法线时,它可以让我识别出什么是错误的 . 它有时给出正常的法线,有时给出法线向量的负值,这意味着它直接穿过顶面并用对撞机底部(球拍)检测击中 .

我尝试过的事情:

  • 增加对撞机的大小(它适用于球拍上较宽的框架对撞机,但显然球从球拍离开相当远的距离,我自己的脚本在这里工作,默认物理效果在球拍移动时会产生奇怪的结果),简而言之,我没有得到我想要的现实 .

  • 将固定时间戳减少到0.001,这显着改善了事情,但仍然离我想要的结果非常远,并且球再次经常挑选球的错误一侧 .

  • 将碰撞检测更改为连续动态 . 哪个也没改善 .

除了在碰撞中挑错的一方之外,我观察到的另一个问题是,在球拍弹跳后,球移动但是球拍移动得更快,而不是以完整的弧线或线移动,不知何故出现在前面球,导致两次安打 . 这是一个基于可见内容的猜想 .

同样很明显,球拍的“运动”方面并没有被Unity3d的内置物理学所读取,当球拍使用鼠标击球时会导致奇怪的行为 .

我卡住了,我不知道从哪里搬到这里 . 请告诉我,我做错了什么 .

4 回答

  • 3

    正如其他人所指出的那样,问题在于球从一个框架中的一侧移动到下一个框架的另一侧 . 如果障碍太小,快速移动的物体往往会这样做 .

    这个问题有三种非常简单的解决方案:

    • 增加打击垫或球的大小,这是改变对撞机大小时发生的情况 .

    • 确定球的最大速度,使其无法快速移动以穿过打击垫 .

    • 增加Unity进行物理计算的频率 . 它可以在Time Manager中更改,从而减少固定时间步长的值 . 要小心减少这个太多,否则物理引擎将无法在下一轮应该开始之前完成一个呼叫,它将永远无法赶上游戏 .

    必须始终设置移动对象的最大速度 . 你不能冒险让一个重要的物体在游戏中飙升,并让一切都处于不受控制的状态 .

  • 5

    我认为发生的是球/球拍发生的每个间隔都被移动然后检查是否发生碰撞 . 问题是球/球拍在一个区间内向远处移动并错过了碰撞 .

    1) Ball before racquet 
    2) Ball after racquet 
    
    not
    
    1) Ball before racquet 
    2) Ball touching racquet
    

    所以你需要做的就是你的球的FixedUpdate()方法GameObject是从当前球位置投射到前一个球位置的射线 . 如果这两点之间有任何应该被击中的东西(即球拍)将球移回到射线上报告的击球点 . 这将触发您现有的碰撞检测内容 .

    增加对撞机尺寸的原因也是因为球没有跳过较大的对撞机 . 这有你在问题中提到的缺点 . 射线投射避免了这个问题,并允许球/球拍根据需要快速或慢速移动 .

  • 0

    这不是一个完整的答案,但我记得多年前在较慢的机器上处理这样的问题 .

    问题是使用基于精灵的碰撞检测;依赖于精灵的像素和在相同坐标处渲染的障碍物 . 如果帧速率太低以至于精灵在一帧中的移动幅度大于障碍物的大小,那么你将进入(例如)在一帧中障碍物的左侧和下一帧中的障碍物的右侧的情况下占据相同的像素 .

    在这种情况下,基于精灵的碰撞不起作用,你必须在矢量上进行碰撞 . 不是检查每个精灵像素的碰撞,而是记录精灵的位置和凸包 . 在每个帧之后,计算从旧位置到新位置的矢量并将其与每个障碍物的凸包相交 .

    您可以创建多个快捷方式,例如,首先仅与边界框进行比较,并仅在向量与边界框相交时计算外壳,但这是基本思路 . 祝好运 .

  • 8

    我一直在制作一个3D乒乓球游戏,并遇到了完全相同的问题 . 我会像你们那样尝试扩大一切 . 至于球拍增加速度和旋转球,我感到困惑,直到我意识到改变球拍的位置不会改变它的速度 . 如果桨在移动之前处于零速度,当物理引擎在下一帧看时它将为零 . Un check是kenimatic并通过velocity属性直接控制桨来解决问题 . 当撞击墙壁时,它导致桨叶抖动,但我通过从桨叶层移除墙壁并在LateUpdate中手动处理边界来解决这个问题 . 此外,更新速度时,首先在Update中存储新的所需速度,以便控件平稳运行,然后在FixedUpdate中提交更改 .

相关问题