首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >统一均衡坡面和平坦表面的速度

统一均衡坡面和平坦表面的速度
EN

Stack Overflow用户
提问于 2019-05-16 00:56:33
回答 1查看 157关注 0票数 0

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

我没有在我的项目中使用物理,所以它的每一个力都是我计算和应用的。重点是,无论表面的倾斜程度如何,角色都会在相同的时间内覆盖相同的区域。

将相同的移动应用到CharacterController.Move()函数中时,控制器的速度会呈指数级增加,以尝试沿与在平面区域中相同的曲面移动。

例如。如果打印将在"Move()“函数中应用的计算出的运动,则它是一个规格化运动,垂直方向为(0,0,1),对角方向为(0.7,0,0.7)。然而,如果我通过CharacterController.velocity.magnitude检索速度,我得到一个不同的速度,在平坦的表面上是8,在45°斜率下是11.47。

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

代码语言:javascript
运行
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2019-05-16 17:26:29

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

代码语言:javascript
运行
复制
        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;
        }

它工作得很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56154269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档