【问题标题】:Equalize over slope and flat surface velocity in Unity在 Unity 中均衡坡度和平面速度
【发布时间】:2019-05-16 17:26:29
【问题描述】:

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

我没有在我的项目中使用物理,所以它的每一个力都是由我计算和应用的。关键是角色在同一时间覆盖相同的区域,而不管表面的倾斜度如何。

将相同的移动应用到 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。

【问题讨论】:

标签: c# unity3d


【解决方案1】:

我最终完成的是使用速度大小来计算平缓运动和斜坡运动之间的差异。然后,我只是将该值转换为归一化向量并将其扣除到角色移动。

        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;
        }

一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多