zoukankan      html  css  js  c++  java
  • 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.

  • 相关阅读:
    JQuery中的bind()和unbind()的理解
    一行代码实现数组去重(ES6)
    vue.js学习笔记(Vuejs——组件——props数据传递)
    判断一个字符串书否存在某个字符,取出一段字符串括号中的内容
    在vue中使用高德地图vue-amap
    在egg.js中使用mongodb
    使用Element的upload上传组件,不使用action属性上传
    下载和安装mongodb4.2.0+robmongo可视化工具
    数组对象根据某个属性取出重复的个数
    钉钉小程序----使用阿里的F2图表
  • 原文地址:https://www.cnblogs.com/code1992/p/3608613.html
Copyright © 2011-2022 走看看