使用Unity Physics始终将球弹回到相同的高度

问题描述 投票:0回答:1

我的球只能在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;
}
unity3d
1个回答
1
投票

听起来您希望将对撞机设置为触发器。在你的球的对撞机上,将isTrigger设置为true然后使用OnTriggerEnter而不是OnCollisionEnter。这将阻止Unity的物理引擎在球和它击中的任何球之间创建和解析Collision

如果你还希望球能够以使用Unity物理的方式从其他物体上反弹,那么你需要创造出哪些碰撞器不是'触发器',以及它们属于哪个physics layers

© www.soinside.com 2019 - 2024. All rights reserved.