两个物体之间的摩擦力

3
我需要两个物体之间的摩擦enter image description here。实际上,小立方体是一个具有刚体的玩家,而大立方体是一个帮助小立方体跳上它并继续跳到其他大立方体以达到目的地的物体。当玩家跳跃并着陆在旋转的立方体上时,我需要它们之间有摩擦,因为默认情况下玩家应该与大立方体一起旋转,因为它在大立方体上。期望的结果是:具有刚体的小立方体也应随着大立方体旋转,因为大立方体正在旋转并且在大立方体上。

my scene

2个回答

2
你可以将小方块游戏对象设置为大方块游戏对象的子对象。这应该就可以了。

enter image description here

----评论后编辑

如果需要更改子层次结构(因为小立方体可以移动),则需要编写脚本在需要时添加和删除子对象。

=> 当玩家(小立方体)在大立方体上时,您需要将玩家作为子对象添加到大立方体中。

=> 当玩家(小立方体)移开大立方体时,您需要将玩家从大立方体中删除。

如果您正在使用刚体,则可以使用 OnCollisionEnter OnCollisionExit

您可以将此monobehaviour附加到大立方体上。

public class BigCubeScript : MonoBehaviour
{
    private void OnCollisionEnter(Collision other)
    {
        //check if the colliding object is player (here I'm using a tag, but you may check it as you prefer)
        if (other.gameObject.tag == "Player")
            //change the parent of the player, setting it as this cube
            other.transform.SetParent(this.transform);
    }

    void OnCollisionExit(Collision other)
    {
        if (other.gameObject.tag == "Player")
            //remove the player from the cube
            other.transform.SetParent(null);
    }
}

您还可以对玩家的旋转施加力,直到他停留在方块上。在这种情况下,平衡旋转力非常重要(您可以在编辑器中尝试)。
public class BigCubeScript : MonoBehaviour
{
    //you may change this to add or remove the force
    Vector3 _rotationForce = new Vector3(0, 5, 0);

    private void OnCollisionStay(Collision other)
    {
        var rigidbody = other.gameObject.GetComponent<Rigidbody>();
        Quaternion deltaRotation = Quaternion.Euler(_rotationForce * Time.deltaTime);
        rigidbody.MoveRotation(rigidbody.rotation * deltaRotation);
    }
}

在这个Unity教程中了解更多关于OnCollisionEnter和OnCollisionExit的信息。
在这个Unity教程中了解更多关于标签的信息。

实际上小立方体是玩家,大立方体是帮助小立方体跳跃并继续跳跃到达目的地的物体。当玩家跳跃并着陆在旋转的立方体上时,它们之间应该有摩擦力,而且默认情况下玩家应该随着大立方体一起旋转,因为它在大立方体上。 - Bakhtyar Khan
1
我根据您的评论添加了更多的数据到答案中。 - Jack Mariani
谢谢,它能工作,但不是我想要的方式,但至少它能工作 :) - Bakhtyar Khan
你需要对玩家应用扭矩旋转吗?如果是的话,你可以在 OnCollisionStay 中旋转玩家刚体。 - Jack Mariani
实际上,我不希望小方块OnCollision突然成为大方块的子对象,我需要我们的小方块在大方块上稍微滑动一下,这样看起来更像真正的物理效果,然后在小方块稍微滑动一段时间之后,我想让它成为大方块的子对象,这样它们可以一起旋转。我认为我应该在OnCollision上使用一个小定时器,这样它可以给我们的小方块一个小小的休息时间,让它稍微滑动,然后当计时器在20或30毫秒后结束时,OnCollision就开始工作了。我想这样做是正确的。 - Bakhtyar Khan

1
你可以尝试在小立方体的Rigidbody上约束位置和旋转。之后,您可以调用constrains.none,以便您可以再次允许跳跃,并在每次小立方体与大立方体碰撞时执行该操作。希望这有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接