在Unity中平衡坡度和平面速度

时间:2019-05-15 16:56:33

标签: c# unity3d

我已经发布了一个类似的问题,但这不是完全相同的问题,所以在这里。

我在项目中没有使用物理学,所以它所产生的每一个力都是由我计算和施加的。关键是,无论表面是否继续倾斜,角色都将同时覆盖相同的区域。

将相同的运动应用于CharacterController.Move()函数后,控制器的速度将呈指数增长,以尝试沿着同一表面而不是在平坦区域中移动。

例如。如果打印的是打印的将在“ Move()”函数中应用的运动矩,则它是归一化的,垂直为(0,0,1),对角为(0.7,0,0.7)。但是,如果我通过CharacterController.velocity.magnitude检索速度,则会得到不同的速度,在平面上为8,在45º坡度上为11.47。

我已经制定了一个公式来计算应该使用“ velocity.magnitude”函数检索的值。

groundAngle = Mathf.Abs(Mathf.Round(Vector3.Angle(hit.normal, transform.forward)) - 90);

groundMovementMagnitude = characterController.velocity.magnitude;

slopeMovementIdeal = ((((groundAngle/2) - groundAngle) + 100) * (groundMovementMagnitude / 100));

通过这个公式,我实际上在一个平面上得到的值是“ 8”,而不是“ 11.47”,而在45º倾斜度下获得的速度值为“ 6.4”

尽管如此,由于无法设置字符控制器的速度,因此该值仅提供参考。取而代之的是,我需要一种方法来修改将用于触发运动的运动Vector3,因此,与其在斜坡上移动(0,0,1)或在对角线上移动(0.7,0,0.7)坡度,应用减速器根据坡度角度推导此Vector3。

1 个答案:

答案 0 :(得分:0)

我最后要做的是使用速度大小来计算平面运动和坡度之间的差异。然后,我只是将该值转换为归一化的向量,并将其扣除为字符移动量。

        float minMovement = 0.01f;
        float difference = 0.0f;
        float x = 0.0f;
        float z = 0.0f;

        if (OnSlope() && characterController.velocity.magnitude - moveSpeed > minMovement) {
            difference = characterController.velocity.magnitude - moveSpeed;
            //Diagonal
            if ((movement.x > minMovement || movement.x < -minMovement) && (movement.z > minMovement || movement.z < -minMovement)) {
                x = z = (difference / 2) / characterController.velocity.magnitude;

                if (movement.x < 0)
                    x *= -1;
                if (movement.z < 0)
                    z *= -1;
            }
            //Perpendicular
            else {
                if (movement.x > minMovement || movement.x < -minMovement) {
                    x = difference / moveSpeed;
                    if (movement.x < 0)
                        x *= -1;
                }
                if (movement.z > minMovement || movement.z < -minMovement) {
                    z = difference / moveSpeed;
                    if (movement.x < 0)
                        z *= -1;
                }
            }
            movement.x -= x;
            movement.z -= z;
        }

一切正常。