Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 统一性:如何将角色的位置或速度限制为一个精确的数字,使其无法通过该点?_C#_Unity3d_Raycasting - Fatal编程技术网

C# 统一性:如何将角色的位置或速度限制为一个精确的数字,使其无法通过该点?

C# 统一性:如何将角色的位置或速度限制为一个精确的数字,使其无法通过该点?,c#,unity3d,raycasting,C#,Unity3d,Raycasting,我仍在研究完美的梯子运动,我能想到的是一种方法来计算角色在梯子上时需要移动的精确的特定距离,以达到与梯子上方的地面完美碰撞的点 我知道这个值是非常具体的,因为当游戏开始时,我允许我的角色降落在梯子上。y=3.6235,当我在控制台中打印移动值时,我得到的正好是3.6235 不过,我不确定我在代码中是否正确实现了这一点,因为我注意到,一旦我的角色一路爬上阶梯,这个值在控制台中仍然略高于0。是Mathf.Clamp不是限制移动的正确功能,还是我用错了 public void ClimbUpLadde

我仍在研究完美的梯子运动,我能想到的是一种方法来计算角色在梯子上时需要移动的精确的特定距离,以达到与梯子上方的地面完美碰撞的点

我知道这个值是非常具体的,因为当游戏开始时,我允许我的角色降落在梯子上。y=3.6235,当我在控制台中打印移动值时,我得到的正好是3.6235

不过,我不确定我在代码中是否正确实现了这一点,因为我注意到,一旦我的角色一路爬上阶梯,这个值在控制台中仍然略高于0。是Mathf.Clamp不是限制移动的正确功能,还是我用错了

public void ClimbUpLadder(ref Vector3 deltaMovement)
{
    float rayLength = raycastOrigins.centerRayLength * 2;

    RaycastHit2D[] hits = Physics2D.RaycastAll(new Vector2(raycastOrigins.center.x + deltaMovement.x,
        (raycastOrigins.center.y - raycastOrigins.centerRayLength + skinWidth) + deltaMovement.y), Vector2.up,
        rayLength, climbMask);

    Debug.DrawRay(new Vector2(raycastOrigins.center.x + deltaMovement.x,
        (raycastOrigins.center.y - raycastOrigins.centerRayLength + skinWidth) + deltaMovement.y), Vector2.up * rayLength, Color.green);

    for (int i = 0; i < hits.Length; i++)
    {
        if (hits[i])
        {
            if (hits[i].collider.tag == "Ladder")
            {
                IsClimbingLadder = true;
            }

            if (i >= 1 && hits[i].collider.tag == "platformOneWay")
            {
                //This gives us the exact distance needed to finish climbing
                GameObject platform = hits[i].collider.gameObject;
                Transform platformTransform = platform.GetComponent<Transform>();
                float finalMoveDistance = (platformTransform.position.y - characterTransform.position.y) + platformTransform.position.y;

                deltaMovement.y = Mathf.Clamp(deltaMovement.y, 0, finalMoveDistance);

                print(finalMoveDistance);
            }
        }
    }
}

不幸的是,在我将deltaMovement.y设置为这个值之后,它表示finalMoveDistance大约为.9或1.0,所以我仍然会在阶梯上稍微向上移动太远。你认为直接设置角色的transform.position.y是平滑移动的最佳方式吗?我的目标是消除从爬梯子过渡到再次在地上行走时的任何反弹。

我认为您在这里犯了一个错误:

 float finalMoveDistance = (platformTransform.position.y - characterTransform.position.y) + platformTransform.position.y; 
为什么要添加两次平台转换? 试试这个:

 float finalMoveDistance = (platformTransform.position.y - characterTransform.position.y);
这可能会帮助您: