我正在做一个类似地铁冲浪的游戏。问题是当我按下移动控制时,角色的移动量超过了1个单位,如果我从-1移动到0,我的角色就会在0.02或类似的地方,所以当我按下移动控制A和D10-15次后,我的角色不在车道上,并且X=1.2,0.3,-0.8。所以在点击移动控制A和D10-15次后,我的角色不在车道上,并且走X=1.2,0.3,-0.8等......这个问题也是跳跃控制的问题,如何解决这个问题.......我对unity非常初级。这几天刚开始.请帮帮我.我的编码是
private string lanechange = "n";
private string jumpcontrol = "n";
void Start()
{
GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 3);
}
void Update()
{
if((Input.GetKey("a")) && (lanechange=="n") && (transform.position.x>-.9f) )
{
GetComponent<Rigidbody>().velocity = new Vector3(-4, 0, 3);
lanechange = "y";
StartCoroutine (stoplanechange());
}
if((Input.GetKey("d")) && (lanechange=="n") && (transform.position.x<.9f) )
{
GetComponent<Rigidbody>().velocity = new Vector3(4, 0, 3);
lanechange = "y";
StartCoroutine (stoplanechange());
}
if ((Input.GetKey("space")) && (jumpcontrol == "n") )
{
GetComponent<Rigidbody>().velocity = new Vector3(0, 2, 3);
jumpcontrol = "y";
StartCoroutine(stopjump());
}
}
IEnumerator stopjump()
{
yield return new WaitForSeconds(0.5f);
GetComponent<Rigidbody>().velocity = new Vector3(0, -2, 3);
yield return new WaitForSeconds(0.5f);
GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 3);
jumpcontrol = "n";
}
IEnumerator stoplanechange()
{
yield return new WaitForSeconds(0.25f);
GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 3);
lanechange = "n";
Debug.Log(GetComponent<Transform>().position);
}
如果你是用Rigidbody和速度来让它移动,你是用物理系统来让你的角色移动。物理系统有一个不同的时间步长,它与物理系统中的 FixedUpdate()
函数,而不是Update。
但输入总是绑定到 Update()
,这是与图形和键盘输入同步的。
所以这样的移动时机总是会有一点偏差,甚至取决于图形帧率。
我建议你建立一些逻辑,让你的角色锁定在离你最近的车道上。移动键使其大致移动,至少是一半的车道宽度,然后回中键接管并使他居中。