我在我的碰撞检测中遇到了奇怪的问题。我使用Update方法来移动玩家(我不想使用FixedUpdate,因为那会导致奇怪的运动效果)。固定时间步长设置为默认的0.02(我尝试过修改时间设置,但也没有用)。我将两个物体的刚体碰撞检测设置为“连续动态”。此外,我将目标帧速率设置为300,但仍然没有改变任何东西...
当帧率较低或设备本身较慢时,碰撞检测并不总是有效。玩家很容易穿过本该与之碰撞的对象,但有时又会遇到碰撞。
请告诉我如何解决这个问题,因为我发布了一款游戏,许多用户都报告了这个(严重)错误。感谢您的支持。
以下是应该发生的事情:
当帧率较低或设备本身较慢时,碰撞检测并不总是有效。玩家很容易穿过本该与之碰撞的对象,但有时又会遇到碰撞。
请告诉我如何解决这个问题,因为我发布了一款游戏,许多用户都报告了这个(严重)错误。感谢您的支持。
以下是应该发生的事情:
这就是实际发生的事情:
正如您所看到的,立方体从墙上出来,到达了另一侧。
当用户释放鼠标按钮时,我移动玩家:
脚本1:
public Script2 Jumper;
public float TimeToJump;
public void Update()
{
if (Input.GetMouseButtonUp(0))
{
StartCoroutine (Delay (1f/50f)); //Don't mind the time.
}
}
IEnumerator Delay(float waitTime)
{
yield return new WaitForSeconds (waitTime);
if (Jumper != null)
{
Jumper.SetVelocityToJump (gameObject, TimeToJump);
}
}
脚本2已附加到玩家(立方体):
public class Script2 : MonoBehaviour {
GameObject target;
private float timeToJump;
public bool isJumping = false;
public void SetVelocityToJump(GameObject goToJumpTo, float timeToJump)
{
StartCoroutine(jumpAndFollow(goToJumpTo, timeToJump));
this.timeToJump = timeToJump;
this.target = goToJumpTo;
}
private IEnumerator jumpAndFollow(GameObject goToJumpTo, float timeToJump)
{
var startPosition = transform.position;
var targetTransform = goToJumpTo.transform;
var lastTargetPosition = targetTransform.position;
var initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);
var progress = 0f;
while (progress < timeToJump)
{
progress += Time.deltaTime;
if (targetTransform.position != lastTargetPosition)
{
lastTargetPosition = targetTransform.position;
initialVelocity = getInitialVelocity(lastTargetPosition - startPosition, timeToJump);
}
float percentage = progress * 100 / timeToJump;
GetComponent<Rigidbody>().isKinematic = percentage < 100.0f;
transform.position = startPosition + (progress * initialVelocity) + (0.5f * Mathf.Pow(progress, 2) * _gravity);
yield return null;
}
OnFinishJump (goToJumpTo, timeToJump);
}
private void OnFinishJump(GameObject target, float timeToJump)
{
if (stillJumping)
{
this.isJumping = false;
}
}
private Vector3 getInitialVelocity(Vector3 toTarget, float timeToJump)
{
return (toTarget - (0.5f * Mathf.Pow(timeToJump, 2) * _gravity)) / timeToJump;
}
}
立方体的目标是更大的立方体(墙)的子代。
如果需要澄清,请在下面留言。如果您需要更多详细信息,我可能会提供我的游戏链接。
引用自这里(感谢@Logman):“即使使用连续的动态碰撞检测,问题仍然存在,因为快速移动的对象可以移动得太快,以至于它们从一个帧到下一个立即帧之间相距太远。就像它们传送了一样,没有任何碰撞检测会被触发,因为从每个帧的角度来看,没有任何碰撞存在,因此从所有处理的计算中也不存在。”
在我的情况下,立方体并没有快速移动,但您可以理解这个概念。