按住键时统一3D旋转

问题描述 投票:0回答:1

下面的代码可以朝同一方向前进。但是,如果在向前移动时方向发生变化,则不会沿正确的旋转方向移动。如何编辑下面的代码,以相同的校正旋转方向向前移动?

下面的代码在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)
c# unity3d rotation
1个回答
0
投票

发生此问题的原因是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);
© www.soinside.com 2019 - 2024. All rights reserved.