unity3d 使用变换平移阻止Unity对角移动

50few1ms  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(135)

我有一个游戏,角色只能水平和垂直移动,不能斜向移动。
我已经尝试用以下代码来实现这一点,它应该检查播放器是否按下/上或左/右:

if (Input.GetKey("down"))
{
    moveHor = false;
    moveVer = true;
    if(moveVer == true)
    {
        transform.Translate(Vector3.down * Time.deltaTime * speed);
    }
}
if (Input.GetKey("up"))
{
    moveHor = false;
    moveVer = true;
    if (moveVer == true)
    {
        transform.Translate(Vector3.up * Time.deltaTime * speed);
    }
}
if (Input.GetKey("right"))
{
    moveVer = false;
    moveHor = true;
    if(moveHor == true)
    {
        transform.Translate(Vector3.right * Time.deltaTime * speed);
    }
}
if (Input.GetKey("left"))
{
    moveVer = false;
    moveHor = true;
    if (moveHor == true)
    {
        transform.Translate(Vector3.left * Time.deltaTime * speed);
    }
}

此代码在Update()方法中运行。
问题是,它不工作,我不知道为什么。
我希望有人知道该怎么做。

6tr1vspr

6tr1vspr1#

尝试使用else-if在每个更新周期中只向一个方向转换。我还从代码中删除了嵌套的if语句,这些语句是多余的和不需要的。

if (Input.GetKey("down"))
{
    moveHor = false;
    moveVer = true;

    transform.Translate(Vector3.down * Time.deltaTime * speed);
}
else if (Input.GetKey("up"))
{
    moveHor = false;
    moveVer = true;

    transform.Translate(Vector3.up * Time.deltaTime * speed);
}
else if (Input.GetKey("right"))
{
    moveVer = false;
    moveHor = true;

    transform.Translate(Vector3.right * Time.deltaTime * speed);
}
else if (Input.GetKey("left"))
{
    moveVer = false;
    moveHor = true;

    transform.Translate(Vector3.left * Time.deltaTime * speed);
}
ki1q1bka

ki1q1bka2#

在这种情况下,你可以读取所有的键,并让它们相互归零。这意味着当两个键被按下时(eidogg. left和right),角色将停止水平移动。
我们还考虑了处理的顺序,所以我们没有执行不必要的计算。我们通过尽可能晚地执行Vector 2/3计算来做到这一点,因为这些结构体通常有2或3个部分。
剩下的就是:

private void Update ( )
{
    var movement = Vector3.zero;
    if ( Input.GetKey ( "left" ) )
        movement.x -= -1;
    if ( Input.GetKey ( "right" ) )
        movement.x += 1;
    if ( Input.GetKey ( "down" ) )
        movement.y -= 1;
    if ( Input.GetKey ( "up" ) )
        movement.y += 1;

    // If both movement.x and movement.y are not equal to zero, zero out the horizontal, leaving the vertical.
    if ( movement.x != 0 && movement.y != 0 )
        movement.y = 0;

    // multiply the vector last for performance.
    transform.Translate ( speed * Time.deltaTime * movement );
}
2hh7jdfx

2hh7jdfx3#

您可以通过使用和配置2D轴而不是按钮来简化很多事情

var input = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical");

if(input.x > input.y)
{
    input.y = 0;
}
else
{
    input.x = 0;
}

moveVer = Mathf.Approximately(input.y, 0);
moveHor = Mathf.Approximately(input.x, 0);

if(moveHor || moveVer)
{
    transform.Translate(input.normalized * speed * Time.deltaTime);
}

相关问题