Unity3D-位置的平台和球类游戏使球落入平台

本文关键字:平台 游戏 位置 Unity3D- | 更新日期: 2023-09-27 18:31:44

我正在尝试制作一个游戏,您可以在平台上上下弹跳球。我在球上添加了一个刚体组件,使球"使用重力",并且在球体碰撞体中有材料,因此它具有"弹性"或恢复系数。球在静止的平台/平面上跟随重力很好。

之后,我尝试添加平台组件。顺便说一下,这个组件只是在 Y 轴上上下移动(就好像有人只是在球拍上上下弹跳乒乓球一样)。为了使其上升,我使用了这个 C# 脚本。

if (Input.GetKeyDown(KeyCode.W))
{
    heldDownW = true;
}
if (Input.GetKeyUp(KeyCode.W))
{
    heldDownW = false;
}
if (heldDownW)
{
    transform.position = new Vector3(transform.position.x, (transform.position.y + 1f), transform.position.z);
}

这只会检查是否按住了 W 键,向上移动平台。我对 S 键也有同样的事情。平台移动组件运行良好。但是,这是我的问题。球在固定平台上工作正常,或者当我没有按 W 或 S 键时。它反弹并服从重力。但是,当我在球运动时移动平台时,球会直接穿过平台。

我想我知道原因 - 这是转换位置。即使球仍在空中,它也只是移动平台,从而通过球改变平台的位置。但是,我不确定如何从这里开始。我尝试使用 OnCollisionEnter,但我不知道在 OnCollisionEnter 方法中放入什么,因为重力/碰撞组件不是在脚本中编码的。我希望球在平台上弹跳,无论平台是否移动。任何帮助将不胜感激。谢谢。

Unity3D-位置的平台和球类游戏使球落入平台

您必须将

刚体附加到该平台上,然后在检查器中将"isKinematic"字段设置为"true"。

然后你需要使用 RidigBody.MovePosition() 而不是 transform.position

if(heldDownW)
{
    rigidbody.MovePosition(new Vector3(transform.position.x, (transform.position.y + 1f), transform.position.z));
}

此外,根据我所读到的内容,将if块放到FixedUpdate()上也会很好,因为FixedUpdate()用于物理相关的东西。

void Update()
{
    if(Input.GetKeyDown(KeyCode.W))
    {
        heldDownW = true;
    }
    if(Input.GetKeyUp(KeyCode.W))
    {
        heldDownW = false;
    }
}
void FixedUpdate()
{
     if(heldDownW)
     {
         rigidbody.MovePosition(new Vector3(transform.position.x, (transform.position.y + 10f * Time.deltaTime), transform.position.z));
     }
}

另一件事是在进行速度计算时使用Time.deltaTime:

 if(heldDownW)
    {
        rigidbody.MovePosition(new Vector3(transform.position.x, (transform.position.y + 10f * Time.deltaTime), transform.position.z));
    }

通过使用Time.deltaTime,你就像说"每秒向上移动10米"如果不使用 Time.deltaTime,则每帧移动 10 米这不是你想要的。