Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/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# 平台和Unity3D中的球类游戏-位置使球从平台上落下_C#_Unity3d - Fatal编程技术网

C# 平台和Unity3D中的球类游戏-位置使球从平台上落下

C# 平台和Unity3D中的球类游戏-位置使球从平台上落下,c#,unity3d,C#,Unity3d,我想做一个游戏,你在一个平台上上上下弹起一个球。我在球上添加了一个刚体组件,使球“使用重力”,并且球准直器中有材料,因此它将具有“反弹”或恢复系数。球在一个固定的平台/平面上很好地跟随重力运动 之后,我尝试添加平台组件。顺便说一句,这个组件只是在Y轴上上下移动(就好像有人用球拍上下弹起乒乓球一样)。为了让它上升,我使用了这个C#脚本 if (Input.GetKeyDown(KeyCode.W)) { heldDownW = true; } if (Input.GetKeyUp(KeyC

我想做一个游戏,你在一个平台上上上下弹起一个球。我在球上添加了一个刚体组件,使球“使用重力”,并且球准直器中有材料,因此它将具有“反弹”或恢复系数。球在一个固定的平台/平面上很好地跟随重力运动

之后,我尝试添加平台组件。顺便说一句,这个组件只是在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键时,球可以正常工作。它反弹并服从重力但是,当我在移动平台时,球会直接穿过平台。


我想我知道其中的原因——这就是转变的立场。它只是简单地移动平台,即使球仍在空中,从而通过球改变平台的位置。然而,我不知道如何从这里开始。我尝试使用OnCollisionCenter,但我不知道在OnCollisionCenter方法中放什么,因为重力/碰撞组件没有在脚本中编码。无论平台是否移动,我都希望球在平台上反弹。任何帮助都将不胜感激。谢谢。

您必须将刚体连接到平台上,然后在inspector中将“IsKinetic”字段设置为“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米 这不是你想要的