因此,我正在统一创建自己的第一款游戏,目前正在从事从左到右的移动。
我向左移动,放开左箭头按钮->空闲动画。
按向右箭头,字符向右移动,放开->空闲。
问题是我必须等待空闲的动画才能按下以选择另一个方向。当我同时按下向左键和向右键时,角色不会移动。
我想做的是fe:
向左按下->字符向左移动,然后
同时按向右->字符向右。
因此需要能够同时按下按钮,并且最后按下的键指示运动/动画。
动画代码:
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
this.GetComponent<Animator>().SetInteger("pallotila", 1);
}
if (Input.GetKeyUp(KeyCode.LeftArrow))
{
this.GetComponent<Animator>().SetInteger("pallotila", 0);
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
this.GetComponent<Animator>().SetInteger("pallotila", 2);
}
if (Input.GetKeyUp(KeyCode.RightArrow))
{
this.GetComponent<Animator>().SetInteger("pallotila", 0);
}
玩家移动代码:
if (Input.GetKey(KeyCode.LeftArrow))
{
this.transform.position += Vector3.left * this.nopeus * Time.deltaTime;
this.transform.rotation = this.vasemmalle;
}
if (Input.GetKey(KeyCode.RightArrow))
{
this.transform.position += Vector3.right * this.nopeus * Time.deltaTime;
this.transform.rotation = this.oikealle;
}
答案 0 :(得分:0)
请注意,您永远都不应在GetComponent
中使用Update
,最好再做一次并重用引用。
//Here you store the Animator reference
private Animator animator;
private void Awake()
{
animator = GetComponent<Animator>();
}
我还将使用switch
来定义应该为哪个按钮执行的操作,以避免一遍又一遍地重复相同的代码。
private void SetLastPressed(KeyCode code)
{
int value = 0;
switch (code)
{
case KeyCode.None:
value = 0;
break;
case KeyCode.LeftArrow:
value = 1;
break;
case KeyCode.RightArrow:
value = 2;
break;
}
animator.SetInteger("pallotila", value);
lastPressed = code;
}
只需存储并检查最后按下的按钮,然后使用if-else
进行输入检查。
// Here you store the last pressed key
private KeyCode lastPressed = KeyCode.None;
private void Update()
{
if (lastPressed != KeyCode.LeftArrow && Input.GetKeyDown(KeyCode.LeftArrow))
{
SetLastPressed(KeyCode.LeftArrow);
}
else if (lastPressed != KeyCode.RightArrow && Input.GetKeyDown(KeyCode.RightArrow))
{
SetLastPressed(KeyCode.RightArrow);
}
// If none of the keys is pressed reset
else if (lastPressed != KeyCode.None && !Input.GetKey(KeyCode.LeftArrow) && !Input.GetKey(KeyCode.RightArrow))
{
SetLastPressed(KeyCode.None);
}
// And if only one of them is released but the other one still pressed
//go on using that still pressed key again
else if (lastPressed != KeyCode.LeftArrow && Input.GetKeyUp(KeyCode.RightArrow) &&
Input.GetKey(KeyCode.LeftArrow))
{
SetLastPressed(KeyCode.LeftArrow);
}
else if (lastPressed != KeyCode.RightArrow && Input.GetKeyUp(KeyCode.LeftArrow) &&
Input.GetKey(KeyCode.RightArrow))
{
SetLastPressed(KeyCode.RightArrow);
}
对于移动,您还可以简单地重用lastPresses
值
if(lastPressed == KeyCode.LeftArrow)
{
transform.position += Vector3.left * nopeus * Time.deltaTime;
transform.rotation = vasemmalle;
}
else if (lastPressed == KeyCode.RightArrow)
{
transform.position += Vector3.right * nopeus * Time.deltaTime;
transform.rotation = oikealle;
}
此外,您可以/应该使用List<KeyCode>
来存储最后的印刷机。每次按钮按下时,将按钮添加到列表末尾;每当按钮升起时,将其从列表中删除
result =>最后按下的按钮始终是列表中的最后一个按钮。
这使得返回上一个按钮的方式更加简单和灵活,而无需添加/更改太多的代码行,例如
private List<KeyCode> lastPresses = new List<KeyCode>();
private KeyCode lastPressed = KeyCode.None;
private Animator animator;
private void Awake()
{
animator = GetComponent<Animator>();
}
private void SetLastPressed(KeyCode code)
{
int value = 0;
switch (code)
{
case KeyCode.None:
value = 0;
break;
case KeyCode.LeftArrow:
value = 1;
break;
case KeyCode.RightArrow:
value = 2;
break;
}
animator.SetInteger("pallotila", value);
lastPressed = code;
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
if (!lastPresses.Contains(KeyCode.LeftArrow)) lastPresses.Add(KeyCode.LeftArrow);
}
else if (Input.GetKeyUp(KeyCode.LeftArrow))
{
if (lastPresses.Contains(KeyCode.LeftArrow)) lastPresses.Remove(KeyCode.LeftArrow);
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
if (!lastPresses.Contains(KeyCode.RightArrow)) lastPresses.Add(KeyCode.RightArrow);
}
else if (Input.GetKeyUp(KeyCode.RightArrow))
{
if (lastPresses.Contains(KeyCode.RightArrow)) lastPresses.Remove(KeyCode.RightArrow);
}
var currentCode = lastPresses.Count > 0 ? lastPresses[lastPresses.Count - 1] : KeyCode.None;
if (currentCode != lastPressed) SetLastPressed(currentCode);
if (lastPressed == KeyCode.LeftArrow)
{
transform.position += Vector3.left * nopeus * Time.deltaTime;
transform.rotation = vasemmalle;
}
else if (lastPressed == KeyCode.RightArrow)
{
transform.position += Vector3.right * nopeus * Time.deltaTime;
transform.rotation = oikealle;
}
}
答案 1 :(得分:0)
您可以将“值”变量更改为
animator.SetInteger("pallotila", 0);
break;
在
的位置value = 0;
break;
或更改
int value;
到
int value = 0;
在@derHugo的代码中