角色由于高摩擦力而无法移动

时间:2019-01-28 07:29:30

标签: c# unity3d game-physics unity3d-2dtools

我对PhysicMaterial2D的背景和性格感到困扰。当角色不动时,它会按我的需要工作(两种材料都有friction = 1.0)。但是由于摩擦值高,角色无法移动。
当然,我可以使用更大的力量(AddForce())移动角色,但由于使用其他材料的其他原因,它会过快移动。

在其他游戏(例如许多平台游戏)中如何解决此问题?我应该在角色移动时将其材质的摩擦设置为零(我没有其他想法)吗?还是有更漂亮的解决方案?

preview

P.S。我也用较高的摩擦力进行了测试,但是这导致角色在移动中开始旋转。

添加
我尝试将boxCollider.sharedMaterial.friction = 0.0f设置在机芯上,并在用户释放按钮 BUT 后返回1.0f,尽管在记录器中我可以看到,角色继续以零摩擦进行移动是1.0f

private void Update()
{
    if (!paused)
    {
        if (Input.GetMouseButtonDown(0) && !IsOverPauseButton())
        {
            isPressed = true;

            endMovePoint = Input.mousePosition;
            isWalk = GetTouchDistance() > jumpTriggerRadius;

            if (!(isWalk || isJump))
            {
                StartCoroutine(Jump());
            }
        }
        else if (Input.GetMouseButtonUp(0) && isPressed)
        {
            boxCollider.sharedMaterial.friction = 1.0f;
            isPressed = false;
            isWalk = false;
            canFlip = true;
        }

        if (isWalk)
        {
            if (!isJump)
            {
                boxCollider.sharedMaterial.friction = 0.0f;
            }

            Walk();
        }

        animator.SetBool(WalkingFlag, isWalk && !isJump);
    }

    if (isWalk && !isJump)
    {
        FixSpeed();
    }

    Debug.Log("Friction=" + boxCollider.sharedMaterial.friction);
}

1 个答案:

答案 0 :(得分:0)

您可以减少玩家的运动,而不必使用摩擦。

假设您的播放器的速度为10,您希望播放器自行停止移动,因为那是自然的事情。

您想要做的是每帧例如从玩家的速度中减去一个量

player.velocity.x *= 0.9f;

这会将玩家的x速度设置为其原始速度的90%。每帧都执行一次,很快您的播放器将自行停止。

如果上述方法不能产生您想要的效果,则始终可以从演奏者的速度中减去一个任意值(当然,如果演奏者的速度为负,则必须考虑该值):

player.vel.x -= 1;

如果需要,上述两种方法都可以考虑摩擦,只需将百分比或任意值乘以摩擦系数加或减一点即可满足您的需求。