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);
}
}