下面的代码可以朝同一方向前进。但是,如果在向前移动时方向发生变化,则不会沿正确的旋转方向移动。如何编辑下面的代码,以相同的校正旋转方向向前移动?
下面的代码在Update()函数内部。
// Forward
if (Input.GetKeyDown(KeyCode.W))
{
moveDir = new Vector3(0, 0, -1);
moveDir *= speed;
// Makes Charater rotate towards a direction
moveDir = transform.TransformDirection(-moveDir);
}
// Rotates Character Left and Right
rot += Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
transform.eulerAngles = new Vector3(0,rot,0);
// Moves Character
controller.Move(moveDir * Time.deltaTime);
我已经为进行时间检查而感到疲倦,例如下面的代码,用于按住一个键,但是这种情况只发生一次,而不是连续发生。
if(time > timeSpan)
发生此问题的原因是Move
可能无法读取transform.position
的最新值。
此问题已在正式的Unity问题跟踪器here中报告,并且在那里也发布了解决方案:
这里的问题是在物理设置中禁用了自动同步变换,因此,除非在之间发生调用
characterController.Move()
或FixedUpdate
的情况,否则Physics.Simulate()
不一定会知道由变换设置的新姿势。 transform.position和CC.Move()
。[要解决此问题,请在物理设置中启用自动同步转换,或者在调用
Physics.SyncTransforms
之前立即通过Move()
手动同步>因此,您可以通过在
Physics.SyncTransforms
之前调用Move
来解决问题,如下所示:
// Forward
if (Input.GetKeyDown(KeyCode.W))
{
moveDir = new Vector3(0, 0, -1);
moveDir *= speed;
// Makes Charater rotate towards a direction
moveDir = transform.TransformDirection(-moveDir);
}
// Rotates Character Left and Right
rot += Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
transform.eulerAngles = new Vector3(0,rot,0);
// Moves Character
Physics.SyncTransforms();
controller.Move(moveDir * Time.deltaTime);