2015-11-08 111 views
1

我正在移動遊戲對象這個簡單的功能,移動身體取決於相機視圖。相機X軸旋轉的心不是0和身體試圖唯一的問題移動到地面,但不能清除前進,它使運動緩慢移動對象和_camera.TransformDirection(moveDirection)

void VerySimpleMove() 
{ 
    if (_controllerBody.isGrounded) 
    { 
     _moveDirection.x = _mj.GetAxis("Horizontal"); 
     _moveDirection.y = 0; 
     _moveDirection.z = _mj.GetAxis("Vertical");     

     _moveDirection = _camera.TransformDirection(_moveDirection); 
     if (Mathf.Abs(_moveDirection.x) > 0 || Mathf.Abs(_moveDirection.y) > 0) 
     { 
      _body.rotation = Quaternion.LookRotation(_moveDirection); 
     } 
     if (_jumpButton) 
     { 
      _jumpButton = false; 
      _moveDirection.y = _jumpHeight; 
     } 
    } 
    _moveDirection.y -= _gravity * Time.deltaTime; 
    _controllerBody.Move(_moveDirection * Time.deltaTime); 
} 

怎麼可能通過_camera.eulerAngle.x旋轉_moveDirection使它真正的前鋒?

+0

看起來像我需要_camera.angleEulers.x旋轉的Vector3 – user2698308

回答

0

如果我理解正確,您需要確保_moveDirection始終與XZ平面平行。 一種方式做到這一點是,而不是使用_camera.TransformDirection,來計算XZ平面相機前向向量的投影,然後在該方向上使用LookRotation,像這樣:

var forward = _camera.transform.forward; // Get camera forward vector 
forward.y = 0; // Project it on XZ plane 
_moveDirection = Quaternion.LookRotation(forward) * _moveDirection; // Rotate 

注意,簡單地通過照相機X旋轉對象所以建議的角度在這裏並不總是有幫助,因爲相機Z角度可以產生相同的效果。

所以最終的代碼如下:

void VerySimpleMove() 
{ 
    if (_controllerBody.isGrounded) 
    { 
     _moveDirection.x = _mj.GetAxis("Horizontal"); 
     _moveDirection.y = 0; 
     _moveDirection.z = _mj.GetAxis("Vertical");     

     var forward = _camera.transform.forward; // Get camera forward vector 
     forward.y = 0; // Project it on XZ plane 
     _moveDirection = Quaternion.LookRotation(forward) * _moveDirection; // Rotate 
     if (Mathf.Abs(_moveDirection.x) > 0 || Mathf.Abs(_moveDirection.y) > 0) 
     { 
      _body.rotation = Quaternion.LookRotation(_moveDirection); 
     } 
     if (_jumpButton) 
     { 
      _jumpButton = false; 
      _moveDirection.y = _jumpHeight; 
     } 
    } 
    _moveDirection.y -= _gravity * Time.deltaTime; 
    _controllerBody.Move(_moveDirection * Time.deltaTime); 
}