【问题标题】:Character rotation depending on camera角色旋转取决于相机
【发布时间】:2018-12-24 17:06:44
【问题描述】:

我花了一整天的时间来解决我在学校项目中遇到的问题,所以我不得不采取最后的手段:stackoverflow!

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

输入: xbox 控制器

相关信息:

  • 相机使用右侧操纵杆围绕角色水平旋转
  • 角色移动发生在左操纵杆上
  • 角色已经相对于相机移动,这正按预期工作。 我正在尝试旋转角色,这以单独的方法发生。
  • 当向下拉左操纵杆时,角色应始终面向(并朝向)摄像机。
  • 当左操纵杆向上拉时,角色应始终面向(并远离)摄像机。
  • 我留下了很多代码,只是为了让你们阅读。如果您需要什么,尽管问,我会提供。

    我目前所拥有的: https://imgur.com/TERUXV6

为什么会出错:角色轮换很完美。但是,我在这里作弊。相机根据世界坐标旋转。当我旋转相机时,这很明显。

以下脚本附加到角色游戏对象。

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);
    }

以下脚本附加到主相机游戏对象

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() 函数。我知道我需要在那里进行一些计算以使角色旋转相对于相机旋转,我只是无法弄清楚该计算是什么以及为什么。

提前致谢!

特林迪尔

【问题讨论】:

  • @Aybe 我已经尝试过 transform.rotate,但到目前为止还没有成功。在一个完美的世界中,我会使用 Transform.Rotate((float xAngle, float yAngle, float zAngle, Space relativeTo) 方法,其中我会说 Space relativeTo = Camera.Transform.Forward 或类似的东西。因为我想要我的角色轮换取决于它。
  • 您要的不是第三人称相机吗?检查这个:code.tutsplus.com/tutorials/…

标签: c# unity3d rotation


【解决方案1】:

这就是你需要的...

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

需要将Awake()中的camDefault设置为当时的当前位置,即IEcamDefault = 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 的直接子代会更容易,因此它会随之旋转,而您无需手动操作,相机将始终留在玩家身后。但那只是我的个人意见。就目前而言,相机和模型都是玩家的孩子,如果你想让相机随着玩家转动,只需让它成为那个模型的孩子。

在这种情况下,您可以像上面一样存储初始旋转和当前旋转,然后让您的摇杆向左和向右看,然后在您松开摇杆时重新向前移动。

【讨论】:

  • 我不确定您是否完全理解我的问题。如果我错了,请纠正我,但在我看来,您正在向我展示如何围绕角色旋转相机。但是,我已经成功地实现了这一点。我的角色轮换有问题。我想要做的是:右操纵杆旋转相机(工作)左操纵杆移动角色,具体取决于相机旋转。如果我按住左操纵杆,我希望角色走向相机。如果我举起左操纵杆,我希望角色离开相机等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
相关资源
最近更新 更多