C# 统一角色的跳跃和下降比我设定的值还要多

C# 统一角色的跳跃和下降比我设定的值还要多,c#,unity3d,C#,Unity3d,我正在使用unity制作一个2d游戏,角色只能跳跃和下降5,因此玩家只能在y最大值为5和min为-5的范围内跳跃和下降,这是可行的,但如果我按下跳跃或下降两个以上,则会在整个范围内跳跃和下降 我怎样才能让玩家只在我设定的范围内跳跃和跌倒? 这是我的代码: public float speed; public float increment; public float maxY; public float minY; private Vector2 targetPos; private void

我正在使用unity制作一个2d游戏,角色只能跳跃和下降5,因此玩家只能在y最大值为5和min为-5的范围内跳跃和下降,这是可行的,但如果我按下跳跃或下降两个以上,则会在整个范围内跳跃和下降 我怎样才能让玩家只在我设定的范围内跳跃和跌倒? 这是我的代码:

public float speed;
public float increment;
public float maxY;
public float minY;
private Vector2 targetPos;

private void FixedUpdate()
{
    transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime);

    if (Input.GetKeyDown(KeyCode.UpArrow) && transform.position.y <= maxY) 
    {
        Instantiate(moveEffect, transform.position, Quaternion.identity);
        targetPos = new Vector2(transform.position.x, transform.position.y + increment);
    } 
    else if (Input.GetKeyDown(KeyCode.DownArrow) && transform.position.y >= minY) 
    {
        Instantiate(moveEffect, transform.position, Quaternion.identity);
        targetPos = new Vector2(transform.position.x, transform.position.y - increment);
    }
}

之后,您可以通过使用like钳制y组件来简单地限制targetValue

我也只是猜测,但您使用的提示可能涉及刚体2d

在这种情况下,不应通过变换组件设置位置,而应使用like


如果情况并非如此,请将代码移动到更新位置,因为FixeUpdate仅用于与游戏物理相关的内容,请参见

每当您看到重复调用时,编写函数以减少重复代码通常是一个很好的指示

您需要做的是钳制这些值。也许像这样的办法行得通

公共向量2 GetVerticalPositionVector3位置,bool jump=true{ 实例化emoveeffect、transform.position、Quaternion.identity; var maxReach=0f; var钳位=0f; ifjump{ maxReach=变换位置y+增量; 钳位=最大到达>最大到达?最大到达:最大到达; }否则{ maxReach=transform.position.y-增量; 夹钳=最大伸展<最小?最小:最大伸展; } 返回新矢量2position.x,钳制; } 所以你的更新看起来像这样

Vector2 clampedPosition=null; 私有无效固定更新{ 如果输入.GetKeyDownKeyCode.UpArrow{ clampedPosition=GetVerticalPositiontransform.position; transform.position=Vector2.MoveTowardstransform.position,clippedposition,speed*Time.deltaTime; } 如果输入.GetKeyDownKeyCode.DownArrow{ clampedPosition=GetVerticalPositiontransform.position,false; transform.position=Vector2.MoveTowardstransform.position,clippedposition,speed*Time.deltaTime; } }
transform.position=Vector2.MoveTowardstransform.position、clippedposition、speed*Time.DeltaTime;然而,这种情况可能不仅仅发生在按下某个按钮时;你可以把你的代码分类在一个地方,因为它看起来缺少了一些东西,比如fallReach和jumpReach定义,还有一些错误,比如“Time”没有包含“DeltaTime”的定义,另一个错误是不能将null转换为“Vector2”,因为它是一个不可为null的值类型。我当时没有访问unity3d的权限。修正了打字错误,现在,你在哪一行得到了不能将空值转换为矢量2的问题@AliAlsaadimy脚本不使用刚体,因为我将其设置为运动学,并告诉我应该在何处使用此行targetPos.y=Mathf.ClamptargetPos.y,minY,maxY;或者在FixedUpdate方法的末尾给我更新代码
private void FixedUpdate ()
{
    ...

    targetPos.y = Mathf.Clamp(targetPos.y, minY, maxY);
}
private Rigidbody2D rb;

private void Awake()
{
    rb = GetComponent<Rigidbody2D>();
}

private void FixedUpdate()
{
    rb.MovePosition(Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime));

    ...
}