任务:通过鼠标或遥杆的旋转来控制人物摄像机的旋转(抬头,低头,左右前后看)

第一步,场景中拖入一个人物,并且添加组件:Character Controller

第二步,给人物挂载一个脚本,比如PlayerController.cs

第三步,处理水平旋转

① 在Update里添加一个RotateHandler(); 此方法为控制人物旋转的方法

private void Update()
    {
        RotateHandler();
    }

② 捕获鼠标或者遥杆在水平方向的移动

这里要注意一点,需要在Eidt == Project Settings ===Input Manager 添加相关按键,比如Mouse X (已有)

Unity以人物为中心摄像机旋转 unity控制人物旋转_游戏引擎

开始写代码捕获

private void RotateHandler()
    {
        // 人物水平转头
        {
            // 使人物绕着自身Y轴旋转 , 请注意,左右转头是绕着Y轴旋转,(unity为左手世界坐标轴)
            transform.Rotate(
                new Vector3(0f, 鼠标旋转的量,
                    0f), Space.Self);
        }
    }

那这里,鼠标旋转的量如何获得?请继续往下看
我们通过文档得知,获取水平方向的旋转,是GetAxis,有些同学可能不清楚,遥杆的速度和鼠标的速度差别特别大,所以,我们在这里使用一点小技巧来捕获遥杆和鼠标,让其速度保持一直,这样,我们就可以统一设置旋转的灵敏度

我们定义 鼠标水平旋转的量= GetHorizontal()

public float GetHorizontal()
   {
       return GetAxisValue("Mouse X");
   }

然后呢,GetAxisValue 为获取鼠标旋转的量

float GetAxisValue(string mouseInput)
    {
        //获取旋转的量
        return  Input.GetAxis(mouseInput);
    }

到此为止,我们已经完成了人物的水平转头

第四步,处理垂直旋转

添加相关按键,比如Mouse Y (已有)

Unity以人物为中心摄像机旋转 unity控制人物旋转_游戏引擎_02

请注意,如果没有将Invert打钩,则会出现垂直翻转的问题哦

垂直转头,也就是抬头低头,和水平转头区别是,水平是人物本身旋转,抬头低头是人物摄像机在旋转,人物旋转时,他的子物体会跟着旋转,但是,低头属于子物体旋转,所以我们要先获取到人物摄像机的组件,再进行旋转

第一步,定义人物主摄像机

public Camera PlayerCamera;

我们在人物的inspector面板中,将人物摄像机拖入到这个公共变量上

现在我们已经可以操作人物摄像机来旋转了,那我们问题来了,如何获取到垂直旋转的量呢?

很简单,我们只需要 使用我们的方法来获得 Mouse Y 的量

public float GetVertical()
    {
        return GetAxisValue("Mouse Y");
    }

鼠标旋转的量也拿到了,那怎么应用到摄像机呢?
这里,其实就是让摄像机旋转到鼠标当前所在的位置即可

  1. 首先,我们定义当前摄像机的旋转角度为0,也就是正对着屏幕正前方
float cameraVerticalAngle = 0f;
  1. 然后我们处理摄像头旋转
// 人物垂直转头
        {
            // 设置摄像机旋转的量
            cameraVerticalAngle += GetVertical() * RotationMultiplier;
            // 旋转摄像机
            PlayerCamera.transform.localEulerAngles = new Vector3(cameraVerticalAngle, 0, 0);
        }

到这里,有小伙伴可能要问了,我的头都向上转到可以看到屁股了,怎么办?

我们限制他的旋转角度即可

// 人物垂直转头
        {
            // 设置摄像机旋转的量
            cameraVerticalAngle += GetVertical() * RotationMultiplier;
            //限制旋转的最大角度,最大抬头70°,最大低头89° ,自己设置即可
            cameraVerticalAngle = Mathf.Clamp(cameraVerticalAngle, -70f, 89f);
            // 旋转摄像机
            PlayerCamera.transform.localEulerAngles = new Vector3(cameraVerticalAngle, 0, 0);
        }

END