6. 通过鼠标滑轮控制“镜头远近”

1. 编写CameraControl.cs类

using System.Diagnostics;

using UnityEngine;

using System.Collections;

using Debug = UnityEngine.Debug;



public class CameraControl : MonoBehaviour

{

    public static GameObject mainCamera;



    private static Vector3 localPositionOrigin;

    private static Vector3 localRotationOrigin;

    private static Vector3 rotStart;

    private static Vector3 posStart;

    private static Vector3 posEnd;

    private static Vector3 rotEnd;

    private static Vector3 dPos;

    private static Vector3 dRot;

    public static bool cameraIsMoving = false;

    public static bool cameraIsZoomIn = false; // camera 's current state ( zoom in or out)

    public static string cameraTarget = "";



    public static float minFov = 5f;

    public static float maxFov = 90f;

    public static float sensitivity = 10f;

    public static float originFov;



    private int i = 0;

    private static int closeFrames = 75;



    // Use this for initialization

    private void Start()

    {

        mainCamera = GameObject.Find("Main Camera");

        localPositionOrigin = mainCamera.transform.localPosition;

        localRotationOrigin = mainCamera.transform.localEulerAngles;

        originFov = Camera.main.fieldOfView;

    }



    // Update is called once per frame

    private void Update()

    {

        // camera view zoom in from player to target

        if (cameraIsZoomIn)

        {

            if (cameraIsMoving)

            {

                i++;

                //mainCamera.transform.Rotate(Vector3.up, dRotY);

                mainCamera.transform.eulerAngles += dRot;

                mainCamera.transform.position += dPos;

                //if ((mainCamera.transform.position - posEnd).magnitude < 0.1f)

                if (i == closeFrames)

                {

                    cameraIsMoving = false;

                    i = 0;

                }

            }

        } // camera view zoom in or out while mouse scroll wheel rolling

        else

        {

            float fov = Camera.main.fieldOfView;

            fov -= Input.GetAxis("Mouse ScrollWheel") * sensitivity;

            fov = Mathf.Clamp(fov, minFov, maxFov);

            Camera.main.fieldOfView = fov;

        }



        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //从摄像机发出到点击坐标的射线



        RaycastHit hitInfo;

        if (Physics.Raycast(ray, out hitInfo))

        {

            Debug.DrawLine(ray.origin, hitInfo.point); //划出射线,只有在scene视图中才能看到                

            GameObject gameObj = hitInfo.collider.gameObject;

        }

    }



    private static void FixCameraView(bool bFixed)

    {

        if (cameraIsZoomIn == bFixed)

        {

            mainCamera.transform.parent.GetComponent<CharacterMotor>().enabled = !bFixed;

            mainCamera.GetComponent<MouseLook>().enabled = !bFixed;

            mainCamera.transform.parent.GetComponent<MouseLook>().enabled = !bFixed;

        }

    }



    private static int count = 0;

    public static void CameraZoomIn(Vector3 posTar, Vector3 rotTar)

    {

        Camera.main.fieldOfView = originFov;

        //mainCamera.transform.localPosition = localPositionOrigin;

        //mainCamera.transform.localEulerAngles = localRotationOrigin;

        posEnd = posTar;

        rotEnd = rotTar;

        Debug.Log("posTar=" + posTar);

        Debug.Log("rotTar=" + rotTar);

        posStart = mainCamera.transform.position;

        dPos = new Vector3((posEnd.x - posStart.x) / closeFrames, (posEnd.y - posStart.y) / closeFrames, (posEnd.z - posStart.z) / closeFrames);

        //mainCamera.transform.localEulerAngles = localRotationOrigin;

        rotStart = mainCamera.transform.eulerAngles;

        //dRot = (mainCamera.transform.parent.eulerAngles + rotEnd - rotStart) / 100;

        dRot = (rotEnd - rotStart) / closeFrames;

        cameraIsMoving = true;

        cameraIsZoomIn = true;

        FixCameraView(true);

    }



    public static void CameraZoomOut()

    {

        if (mainCamera == null)

            Debug.Log("camera");

        if (localPositionOrigin == null)

            Debug.Log("localposition");

        mainCamera.transform.localPosition = localPositionOrigin;

        mainCamera.transform.localEulerAngles = localRotationOrigin;

        cameraIsMoving = false;

        cameraIsZoomIn = false;

        FixCameraView(false);

    }

}

2. 将脚本赋给摄像机或其它物体

 

  注意:如果有两个摄像机 可能会报错:

  There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.

 

你可能感兴趣的:(控制)