Unity2D堆叠移动命令


if(CanUp){
if(Input.GetKey(KeyCode.W)){
rb.MovePosition(rb.position + Vector2.up * speed * Time.fixedDeltaTime);
if(Input.GetKeyDown(KeyCode.D)){
CanUp = false;
CanRight = true;
}
}else{
CanRight = true;
}                  
}
if(CanRight){
if(Input.GetKey(KeyCode.D)){
rb.MovePosition(rb.position + Vector2.right * speed * Time.fixedDeltaTime);
if(Input.GetKeyDown(KeyCode.W)){
CanUp = true;
CanRight = false;
}
}else{
CanUp = true;
}
}

所以我的想法是,我不想有对角线运动(现在我只有两个方向,但它仍然不起作用(。当我按W时,如果我按D,它工作正常,让我向右,然后在D释放时继续向上,但当我第一次按D时,除非我释放D,否则我根本无法向上,显然这取决于if语句的位置,但由于我是初学者,我真的想不出解决方案,而且我在网上没有找到任何东西,请帮助我

通常,您希望降低循环复杂性,以使调试和计算逻辑更容易。循环复杂性通常可以通过将多个if语句嵌套在彼此内部来识别。尝试:

// The code below should go in Update since you're polling input
if (Input.GetKeyDown(KeyCode.W)) CanUp = true;
if (Input.GetKeyUp(KeyCode.W)) CanUp = false;
if (Input.GetKeyDown(KeyCode.D)) CanRight = true;
if (Input.GetKeyUp(KeyCode.D)) CanRight = false;
// The code below should go into FixedUpdate since you're manipulating a rigidbody
if (CanUp) {
rb.MovePosition(rb.position + Vector2.up * speed * Time.fixedDeltaTime);              
}
if (CanRight) {
rb.MovePosition(rb.position + Vector2.right * speed * Time.fixedDeltaTime);              
}

使用上面的代码,当您按下W时,它将设置CanUp为true,直到您将手指从W移开。如果您按下D,它将将设置CanRight为true,直至您将手指离开D。如果同时按下W和D,角色将向右移动(无论是先按还是最后按(。如果你把手指从其中一个按钮上移开,另一个向下,它就会朝着按下按钮的方向移动。

如果你想在按下多个按钮时用最近按下的按钮来控制方向,你需要跟踪每个键的按下时间,并将其纳入你的If语句中,即

if (CanUp && UpTimePressed <= RightTimePressed)
{
// Move up
}

最新更新