U3D相机的控制(第一、第三人称)

        在游戏中,最常见的视角控制就是鼠标上下左右移动来实现相机的上下左右移动,以及鼠标滚轮的滚动来实现视角的缩放

下面将介绍这三种功能的实现:

        因为场景是一个三维坐标系,所以需要的地方很多,这里引入几个变量,distance, roll, rot , distance ,d为相机和主角之间的空间距离,roll为竖截面distance和x-o-y平面的夹角,d为distance在x-o-y平面的投影,即d = distance * cos(roll),rot为投影d的旋转角度(弧度)计算相机位置的代码如下:

       //计算相机的地面投影和相机高度
        float d = distance * Mathf.Cos(roll);
        float height = distance * Mathf.Sin(roll);
        Vector3 cameraPos;
        //计算相机的坐标
        cameraPos.x = target.transform.position.x + d * Mathf.Cos(rot);
        cameraPos.z = target.transform.position.z + d * Mathf.Sin(rot);
        cameraPos.y = target.transform.position.y + height;

最后相机要始终朝向主角:

        Camera.main.transform.position = cameraPos;
        Camera.main.transform.LookAt(target.transform.position);

上述代码即可实现镜头的跟随,接下来就是要实现鼠标的调整视角,其实只需要通过获取轴的操作来使rot(水平转向) 、roll(垂直转向)、distance(缩放距离)做改变

即 Input.GetAxis("Mouse X") 、Input.GetAxis("Mouse Y") 、Input.GetAxis("Mouse ScrollWheel") 来改变上面三个值

完整代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraCtrl : MonoBehaviour {
    //目标物体
    private GameObject target;
    //相机与目标物体的距离
    public float distance;
    //横向角度
    public float rotDegree = 0;
    public float rotSpeed = 0.2f;
    float rot; //弧度
    //纵向角度
    public float rollDegree = 30;
    public float rollSpeed = 0.2f;
    public float minRollDegree = 0;
    public float maxRollDegree = 70;
    float roll; //弧度
    //摄像机移动速度(滚轮控制)
    public float zoomSpeed = 1.5f;
    public float minDis = 8;
    public float maxDis = 22;

    // Use this for initialization
    void Start () {
        target = GameObject.Find("tank");
        GetTarget(target);
    }
    
    // Update is called once per frame
    void Update () {
        Rotate();
        Roll();
        Zoom();
        //角度转换成弧度
        rot = rotDegree * Mathf.PI / 180;
        roll = rollDegree * Mathf.PI / 180;
        //计算相机的地面投影和相机高度
        float d = distance * Mathf.Cos(roll);
        float height = distance * Mathf.Sin(roll);
        Vector3 cameraPos;
        //计算相机的坐标
        cameraPos.x = target.transform.position.x + d * Mathf.Cos(rot);
        cameraPos.z = target.transform.position.z + d * Mathf.Sin(rot);
        cameraPos.y = target.transform.position.y + height;
        Camera.main.transform.position = cameraPos;
        Camera.main.transform.LookAt(target.transform.position);
    }
    //鼠标水平滑动调整视角
    void Rotate() {
        float value = Input.GetAxis("Mouse X");
        rotDegree -= value * rotSpeed;
    }
    //鼠标垂直方向调整视角
    void Roll() {
        float value = Input.GetAxis("Mouse Y");
        rollDegree += value * rollSpeed;
        rollDegree = Mathf.Clamp(rollDegree, minRollDegree, maxRollDegree);
    }
    //滚轮调整视角的远近
    void Zoom() {
        float value = Input.GetAxis("Mouse ScrollWheel");
        distance -= value * zoomSpeed;
        distance = Mathf.Clamp(distance, minDis, maxDis);
    }

    //让相机始终跟随目标物体身上的某一点
    void GetTarget(GameObject target) {
        if (target.transform.Find("cameraPoint") != null)
        {
            this.target = target.transform.Find("cameraPoint").gameObject;
        }
        else {
            return;
        }
    }
}
 

猜你喜欢

转载自blog.csdn.net/qq_36450306/article/details/83822661
今日推荐