团结:如何将角色的位置或速度限制为一个精确的数字,使其无法超过该点?



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

我知道这个值是完全特定的,因为我允许我的角色在游戏开始时降落在梯子上(position.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);

最新更新