首页 > 其他 > 详细

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

时间:2014-03-19 05:28:06      阅读:515      评论:0      收藏:0      [点我收藏+]

1. 编写CameraControl.cs类

bubuko.com,布布扣
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);
    }
}
bubuko.com,布布扣

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

 

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

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

6. 通过鼠标滑轮控制“镜头远近”,布布扣,bubuko.com

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

原文:http://www.cnblogs.com/code1992/p/3608613.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!