unity3d 实现将摄像机对准物体,并显示整个对准过程的示例

1. 如果把代码放到按钮事件中调用,达不到想要的效果

2. 可以不用委托,但是要在Update函数中写调用CameraZoonIn的代码

3. 有很多需要改进的地方,可以参考使用 iTween 插件达到更好的效果

using UnityEngine;
using System.Collections;
 
public class test : MonoBehaviour
{
 
    public delegate void dgCameraCompleted(Vector3 pos, Vector3 rot);
    public dgCameraCompleted CameraCompleted;
 
    public Camera currentCamera; //摄像机
 
    public static float originFov;  //源视野
 
    private  Vector3 posStart;
    private  Vector3 rotStart;
    private static Vector3 posEnd;
    private static Vector3 rotEnd;
    private static Vector3 dPos;
    private static Vector3 dRot;
 
    public static bool cameraIsMoving = false;
    // 摄像机当前的状态 zoom in or out
    public static bool cameraIsZoomIn = false;
 
    public static float minFov = 5f;
    public static float maxFov = 90f;
    public static float sensitivity = 10f;
    private int i = 0;
 
    // 通过帧数控制摄像机移动的速度
    private static int closeFrames = 70;
 
    Vector3 posBe, rotBe;
    private static Vector3 localPositionOrigin;
    private static Vector3 localRotationOrigin;
 
    public GameObject target;
    void Start()
    {
        localPositionOrigin = currentCamera.transform.localPosition;
        localRotationOrigin = currentCamera.transform.localEulerAngles;
 
        originFov = currentCamera.fieldOfView;
        
        //目标位置
        posBe = target.transform.position + new Vector3(-0.06f, 0.38f, -0.06f);
        rotBe = new Vector3(94f, 270f, 0f);
    }
 
    private void Update()
    {
        if (CameraCompleted != null)
        {
            CameraCompleted(posBe, rotBe);
 
        }
        // 照相机从源到目标
        if (cameraIsZoomIn)
        {
            if (cameraIsMoving)
            {
                i++;
                // 摄像机每帧移动固定的位置和角度,closeFrames帧后到达目标位置
                currentCamera.transform.position += dPos;
                currentCamera.transform.eulerAngles += dRot;
 
                if (i == closeFrames)
                {
                    cameraIsMoving = false;
                    i = 0;
                }
            }
        } // 通过滑轮控制视野大小
        else
        {
            float fov = currentCamera.fieldOfView;
 
            fov -= Input.GetAxis("Mouse ScrollWheel") * sensitivity;
            fov = Mathf.Clamp(fov, minFov, maxFov);
 
            currentCamera.fieldOfView = fov;
        }
 
    }
    public void CameraZoomIn(Vector3 posTar, Vector3 rotTar)
    {
        currentCamera.fieldOfView = originFov;
 
        posEnd = posTar;
        rotEnd = rotTar;
        Debug.Log("posTar=" + posTar);
        Debug.Log("rotTar=" + rotTar);
 
        posStart = currentCamera.transform.position;
 
        dPos = new Vector3((posEnd.x - posStart.x) / closeFrames, (posEnd.y - posStart.y) / closeFrames, (posEnd.z - posStart.z) / closeFrames);
 
        rotStart = currentCamera.transform.eulerAngles;
        dRot = (rotEnd - rotStart) / closeFrames;
 
        cameraIsMoving = true;
        cameraIsZoomIn = true;
 
        FixCameraView(true);
    }
 
    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;
        }
    }
 
    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 40, 40), "开始"))
        {
            CameraCompleted += CameraZoomIn;
            Debug.Log(CameraCompleted);
        }
        if (GUI.Button(new Rect(10, 55, 40, 40), "结束"))
        {
            CameraZoomOut();
            CameraCompleted = null;
        }
    }
 
    public void CameraZoomOut()
    {
        if (currentCamera == null)
            Debug.Log("camera");
        if (localPositionOrigin == null)
            Debug.Log("localposition");
        currentCamera.transform.localPosition = localPositionOrigin;
        currentCamera.transform.localEulerAngles = localRotationOrigin;
        cameraIsMoving = false;
        cameraIsZoomIn = false;
        FixCameraView(false);
    }
 
}

 

未经允许不得转载:第一Unity3D » unity3d 实现将摄像机对准物体,并显示整个对准过程的示例

赞 (0)