我正在尝试制作一个在平台上上下弹跳球的游戏。我在球上添加了一个刚体组件,使球“使用重力”,并且在SphereCollider中有材料,因此它将具有“弹性”或恢复系数。球在固定的平台/飞机上遵循重力好和花花公子。
之后,我尝试添加平台组件。顺便说一句,这个组件只是在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键时。它反弹并服从引力。 然而,当我在球运动时移动平台时,球直接穿过平台。
我想我知道原因 - 它是transform.position。即使球仍在空中,它也只是移动平台,从而改变平台穿过球的位置。但是,我不知道如何从这里开始。我尝试使用OnCollisionEnter,但我不知道在OnCollisionEnter方法中放什么,因为重力/碰撞组件没有在脚本中编码。无论平台移动与否,我都希望球在平台上弹跳。任何帮助将不胜感激。谢谢。
答案 0 :(得分:1)
您必须将Rigidbody附加到该平台上,然后在检查器中将“isKinematic”字段设置为“true”。
然后你需要使用RidigBody.MovePosition()而不是transform.position
if(heldDownW)
{
rigidbody.MovePosition(new Vector3(transform.position.x, (transform.position.y + 1f), transform.position.z));
}
另外,根据我所读到的内容,将if-block放到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米 哪不是你想要的。