根据玩家的方向和角度改变速度?

Changing speed based on player direction and angle?

提问人:RelevantUni98 提问时间:11/17/2023 更新时间:11/17/2023 访问量:33

问:

目前,当我在大于 30 度的角度表面上向上移动时,我的球员移动速度会降低,然后当我转身并开始下坡时,仍然在大于 30 度的同一斜坡上,我的玩家速度会恢复到默认值,这很好。

但是我面临着一个问题,如果我在那个斜坡上向上走,但我向后走,我的球员速度不会降低,并且保持默认值。我以为我已经解决了这个问题,但我无法让它工作。Vector3.SignedAngle

if (isGrounded && Physics.Raycast(transform.position, Vector3.down, out RaycastHit hit, 2f))
{
    float angle = Vector3.SignedAngle(hit.normal, Vector3.up, transform.right);
    float slopeAngle = Vector3.Angle(Vector3.up, hit.normal);

    if (slopeAngle > 30f)
    {
        if (angle < 0) // if moving uphill
        {
            speed = 2f; // lower the speed
        }
        else
        {
            speed = 5f; // revert speed to default
        }
    }
    else
    {
        speed = 5f; // default speed
    }
}
C# unity-游戏引擎

评论


答:

0赞 Ankit Singh 11/17/2023 #1

您可以使用玩家前进方向和坡度法线之间的点积来确定玩家是上坡还是下坡,如下所示:

if (isGrounded && Physics.Raycast(transform.position, Vector3.down, out RaycastHit hit, 2f))
{
    float slopeAngle = Vector3.Angle(Vector3.up, hit.normal);
    float slopeDirection = Vector3.Dot(transform.forward, -hit.normal);

    if (slopeAngle > 30f)
    {
        if (slopeDirection > 0) // moving uphill
        {
            speed = 2f; // lower the speed
        }
        else
        {
            speed = 5f; // revert speed to default
        }
    }
    else
    {
        speed = 5f; // default speed
    }
}

这里的点积用于确定玩家是上坡(点积 > 0)还是下坡(点积 < 0)。此调整旨在帮助您根据斜坡角度和斜坡上的移动方向管理速度。

评论

0赞 RelevantUni98 11/17/2023
感谢您的回复。这仍然会产生相同的问题,我什至尝试在之后添加一个语句,但仍然没有任何变化else ifslopeDirection > 0