角色旋转取决于相机

时间:2018-12-24 17:06:45

标签: c# unity3d rotation

我整天都在努力解决我在学校项目中遇到的问题,所以我不得不采取最后的手段:stackoverflow!

我的问题: 我正在尝试相对于可以围绕角色旋转的相机旋转角色。

输入:xbox控制器

相关信息:

  • 摄像机使用右操纵杆围绕角色水平旋转
  • 角色移动发生在左操纵杆上
  • 角色已经相对于Camera移动,可以正常工作。 我正在尝试旋转字符,这是一种单独的方法。
  • 将左操纵杆向下拉时,角色应始终面向相机(并朝相机移动)。
  • 将左操纵杆向上拉时,角色应始终面对相机的相反方向(并远离相机)
  • 我遗漏了很多代码,只是为了让大家可读。如果您需要什么,请询问,我会提供。

    inspector: 我到目前为止所拥有的: https://imgur.com/TERUXV6

为什么出错:字符旋转是完美的。但是,我在这里作弊。相机根据世界坐标旋转。旋转相机后,这很明显。

以下脚本已附加到角色GameObject。

public class CharacterBehaviour : MonoBehaviour
{
    public GameObject HumanoidModel;
    [SerializeField]private Transform _mainCameraTransform;

    private void Update()
    {
        ApplyMovement();
        RotateCharacter();
    }

    private void ApplyMovement()
    {
        //get input movement vector
        Vector3 inputMovement = new Vector3(_inputMoveCharacterXAxis, 0, _inputMoveCharacterZAxis);

        //make sure camera forward is player movement forward
        Vector3 mainCameraForwardXz = Vector3.Scale(_mainCameraTransform.forward, new Vector3(1, 0, 1)); //multiplied by (1, 0, 1) to remove Y component
        Vector3 mainCameraRightXz = Vector3.Scale(_mainCameraTransform.right, new Vector3(1, 0, 1)); //multiplied by (1, 0, 1) to remove Y component

        Vector3 movementInCameraForwardDirection = mainCameraForwardXz * inputMovement.z;
        Vector3 movementInCameraRightDirection = mainCameraRightXz * inputMovement.x;

        Vector3 movementForward = movementInCameraForwardDirection + movementInCameraRightDirection;

        _velocity = movementForward * MaximumSpeed;
    }

    private void RotateCharacter()
    {
        Vector3 inputDirection = new Vector3(_inputMoveCharacterXAxis, 0, _inputMoveCharacterZAxis);
        HumanoidModel.transform.LookAt(HumanoidModel.transform.position + 
        HumanoidModel.transform.forward + inputDirection);
    }

以下脚本已附加到主相机GameObject

public class CameraBehaviour : MonoBehaviour
{
    [SerializeField] private Transform _characterTransform;
    [SerializeField] private Transform _mainCameraTransform;

    private void Update ()
    {
        RotateCamera();
    }

    // Rotate camera horizontally
    private void RotateCamera()
    {
        _mainCameraTransform.RotateAround(_characterTransform.position, Vector3.up, _inputRotateCameraHorizontal);
    }
}

问题的根源在RotateCharacter()函数中。我知道我需要在那里进行一些计算,以使角色旋转相对于摄像机旋转,我只是无法弄清楚该计算是什么以及为什么。

谢谢!

Thrindil

1 个答案:

答案 0 :(得分:0)

所以这就是您需要的...

camDefault,一个Vector3,用于char后面的摄像机初始位置。 camCur,用于摄像机当前位置的Vector3(以跟踪其在角色周围orbit中的位置)

您需要将Awake()中的camDefault设置为当时的当前位置,即IE camDefault = cam.transform.position);

然后进行固定更新

camCur= cam.transform.position;

然后

 if(Input//your horizontal axis here//==0){
if(camCur!=camDefault){
//translate camera to cam default
cam.tranform.translate(camDefault);

cam.lookat(player.transform.forward);

}
}

请记住,其中一些是伪代码,只是一个一般的方向。但是有统一的方法。如果实施得当,此脚本将允许您使用右摇杆旋转炭炉,然后放开时摄像机会向后滑动。

我相信,出于您的理智,将相机直接作为ybot的子代会更容易,因此它会随之旋转,因此您无需手动操作即可将相机始终留在玩家身后。但那只是我的个人意见。就目前而言,相机和模型都是播放器的子代,如果您希望相机随播放器一起旋转,只需使其成为该模型的子代即可。

在这种情况下,您可以像上面那样存储初始旋转和当前旋转,让我们的摇杆向左和向右看,然后在松开摇杆时向后弹回。