我的球只能在y轴上反弹。 X和Z运动以及所有旋转都锁定在刚体部件中。最初我计划使用以下两种方法的组合来处理这个问题。我在FixedUpdate中将自己的虚拟重力添加到对象中,当它与OnCollisionEnter中的平台发生碰撞时向上弹跳球。从根本上发送它永远地上下跳动。
void OnCollisionEnter(Collision collision)
{
ball.AddForce(Vector3.up * force, ForceMode.Impulse);
}
void FixedUpdate()
{
Vector3 gravity = globalGravity * Vector3.up;
ball.AddForce(gravity, ForceMode.Acceleration);
}
问题是,如果我在球下放置一个有角度的平台,它就不会再用相同的力垂直弹跳。我相信这是因为Unity Physics正在计算物体应该在3D空间中反弹的角度/力,然后因为我的脚本只应用该计算的向上力。但是,无论平台下方的平台角度如何,我都希望我的球能以一致的垂直力反弹。 这可以通过使用协程和Lerp达到一定高度来实现,我尝试使用下面的脚本,这次使用物理引力,但它没有与Unity Physics相同的自然弹跳感觉。我想回到使用物理系统,但我不知道如何阻止Unity进行角度计算,只是用我想要的力垂直发射球。
IEnumerator MoveBall(Vector2 newPos, float time)
{
ball.useGravity = false;
float elapsedTime = 0;
Vector2 startingPos = transform.position;
while (elapsedTime < time)
{
transform.position = Vector2.Lerp(startingPos, newPos, (elapsedTime / time));
elapsedTime += Time.deltaTime;
yield return null;
}
ball.useGravity = true;
}
听起来您希望将对撞机设置为触发器。在你的球的对撞机上,将isTrigger
设置为true
然后使用OnTriggerEnter
而不是OnCollisionEnter
。这将阻止Unity的物理引擎在球和它击中的任何球之间创建和解析Collision
。
如果你还希望球能够以使用Unity物理的方式从其他物体上反弹,那么你需要创造出哪些碰撞器不是'触发器',以及它们属于哪个physics layers。