最近在做虛擬仿真教學(xué),用到了相機(jī)繞著物體旋轉(zhuǎn)縮放埂材,本著省事在網(wǎng)上找到很多旋轉(zhuǎn)的腳本,都不符合這個(gè)項(xiàng)目需求恤浪,之后決定還是自己寫一個(gè)畅哑。這個(gè)腳本包含了設(shè)定刷新的角度和距離,限定旋轉(zhuǎn)角度水由,限定縮放距離等功能
//
// 清歌與濁酒
//
// 2017-3
using UnityEngine;
using System.Collections;
[AddComponentMenu("Camera-Control/CameraControl")]
public class CameraControl : MonoBehaviour
{
public Transform target;
public Transform targetTO;
public Vector3 targetOffset;
public float distance = 5.0f;
public float maxDistance = 20;//縮放
public float minDistance = .6f;//縮放
public float xSpeed = 200.0f;//速度
public float ySpeed = 200.0f;
public int yMinLimit = -80;//限定角度
public int yMaxLimit = 80;
public int zoomRate = 40;
public float zoomDampening = 5.0f;
public float xDeg = 0.0f;//自身的角度記錄
public float yDeg = 0.0f;//自身的角度
public float currentDistance;//縮放記錄
public float desiredDistance;//縮放
private Quaternion currentRotation;
private Quaternion desiredRotation;
public Quaternion rotation;
private Vector3 position;
public float X;//初始化角度X軸
public float Y;//初始化角度Y軸
/// <summary>
/// 初始化距離
/// </summary>
public float CameDistance;
void Start()
{
Init();
desiredDistance = CameDistance;
yDeg = X;
xDeg = Y;
}
void OnEnable()
{
Init();
desiredDistance = CameDistance;
yDeg = X;
xDeg = Y;
}
public void Init()
{
if (!target)
{
GameObject go = new GameObject("Cam Target");
go.transform.position = transform.position + (transform.forward * distance);
target = go.transform;
}
distance = Vector3.Distance(transform.position, target.position);
currentDistance = distance;
desiredDistance = distance;
position = transform.position;
rotation = transform.rotation;
currentRotation = transform.rotation;
desiredRotation = transform.rotation;
xDeg = Vector3.Angle(Vector3.right, transform.right);
yDeg = Vector3.Angle(Vector3.up, transform.up);
}
void LateUpdate()
{
if (Input.GetMouseButton(1))
{
xDeg += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
yDeg -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
}
yDeg = ClampAngle(yDeg, yMinLimit, yMaxLimit);
// 設(shè)置相機(jī)旋轉(zhuǎn)
desiredRotation = Quaternion.Euler(yDeg, xDeg, 0);
currentRotation = transform.rotation;
rotation = Quaternion.Lerp(currentRotation, desiredRotation, Time.deltaTime * zoomDampening);
transform.rotation = rotation;
// 影響scrollwheel變焦距離
desiredDistance -= Input.GetAxis("Mouse ScrollWheel") * Time.deltaTime * zoomRate * Mathf.Abs(desiredDistance);
//變焦最小/最大
desiredDistance = Mathf.Clamp(desiredDistance, minDistance, maxDistance);
//平滑變焦
currentDistance = Mathf.Lerp(currentDistance, desiredDistance, Time.deltaTime * zoomDampening);
target.position = Vector3.Lerp(target.position, targetTO.position, Time.deltaTime * 5);
position = target.position - (rotation * Vector3.forward * currentDistance + targetOffset);
transform.position = position;
}
private static float ClampAngle(float angle, float min, float max)
{
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp(angle, min, max);
}
}
把要圍繞這哪個(gè)物體旋轉(zhuǎn)拖動到Traget和TragetTo中荠呐,大功告成!I翱汀D嗾拧!鞭盟!