本文主要介紹如何在unity中通過滑鼠或手指觸控螢幕對鏡頭進行旋轉,并實作鏡頭旋轉卡位功能,使鏡頭平滑的旋轉至目标角度。
鏡頭繞着目标對象進行旋轉改變的是攝相機在世界坐标中的x、y方向的坐标值。那麼我們隻需要在腳本中控制相機的x\y坐标即可。
将腳本RotationTarget.cs添加到主攝相機上,在遊戲場景裡建立一個簡單的遊戲對象作為鏡頭旋轉的參照物,将該遊戲對象指派給公開屬性TargetObject;
下面是完整的RotationTarget.cs代碼篇段:
using UnityEngine;
using System.Collections;
public class RotationTarget : MonoBehaviour {
//攝相機位置的參照對象;
public Transform TargetObject;
//攝相機的Z軸坐标;
private float distance = 9.0f;
float maxDistance;
//攝相機的角度;
Vector3 targetV;
//手指滑動的始\終位置;
Vector2 firstV;
Vector2 endV;
//手旨在X軸方向上滑動的距離;
float dx;
//攝相機旋轉的目标角度;
float targetAngle;
// Use this for initialization
void Start () {
maxDistance = 105.0f;
targetAngle = 0;
targetV = FirstCamera.transform.eulerAngles;
}
void Update () {
if(Input.GetTouch(0).phase == TouchPhase.Began)
{
firstV = Input.GetTouch(0).position;
}
if(Input.GetTouch(0).phase == TouchPhase.Moved)
{
endV = Input.GetTouch(0).position;
dx = endV.x - firstV.x;
targetV.y += dx/30.0f;
//将手指在X軸方向上滑過的距離增量賦給攝相機;
FirstCamera.transform.eulerAngles = targetV;
if(dx > 0 || dx <0)
{
if(dx < 0)
{
//向左轉至目标角度;
RotateToLeft();
}else if(dx > 0)
{
//向右轉至目标角度;
RotateToRight();
}
}
}
}
void LateUpdate ()
{
//利用插值角度方法,調整攝相機的位置和旋轉角度,使相機旋轉到目标角度前後時産生卡位效果;
if (Target)
{
float currentRotationAngle = Mathf.LerpAngle(FirstCamera.transform.eulerAngles.y, targetAngle, 2.0f * Time.deltaTime);
Quaternion rotation = Quaternion.Euler(0, currentRotationAngle, 0);
Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + TargetObject.position;
FirstCamera.transform.rotation = rotation;
FirstCamera.transform.position = position;
targetV = FirstCamera.transform.eulerAngles;
}
}
/// <summary>
/// 向左旋轉至目标角度.
/// </summary>
void RotateToLeft()
{
if(FirstCamera.transform.eulerAngles.y >= 0 && FirstCamera.transform.eulerAngles.y < 72)
{
targetAngle = 0;
} else if(FirstCamera.transform.eulerAngles.y >= 72 && FirstCamera.transform.eulerAngles.y < 144)
{
targetAngle = 72;
}else if(FirstCamera.transform.eulerAngles.y >= 144 && FirstCamera.transform.eulerAngles.y < 216)
{
targetAngle = 144;
}else if(FirstCamera.transform.eulerAngles.y >= 216 && FirstCamera.transform.eulerAngles.y < 288)
{
targetAngle = 216;
}else if(FirstCamera.transform.eulerAngles.y >= 288 && FirstCamera.transform.eulerAngles.y < 360)
{
targetAngle = 288;
}else if(FirstCamera.transform.eulerAngles.y <= 360)
{
targetAngle = 360;
}
}
/// <summary>
/// 向右旋轉至目标角度.
/// </summary>
void RotateToRight()
{
if(FirstCamera.transform.eulerAngles.y > 0 && FirstCamera.transform.eulerAngles.y <= 72)
{
targetAngle = 72;
} else if(FirstCamera.transform.eulerAngles.y > 72 && FirstCamera.transform.eulerAngles.y <= 144)
{
targetAngle = 144;
}else if(FirstCamera.transform.eulerAngles.y > 144 && FirstCamera.transform.eulerAngles.y <= 216)
{
targetAngle = 216;
}else if(FirstCamera.transform.eulerAngles.y > 216 && FirstCamera.transform.eulerAngles.y <= 288)
{
targetAngle = 288;
}else if(FirstCamera.transform.eulerAngles.y > 288 && FirstCamera.transform.eulerAngles.y <= 360)
{
targetAngle = 360;
}else if(FirstCamera.transform.eulerAngles.y >= 0)
{
targetAngle = 0;
}
}
}
直接釋出到android平台下不用寫任何android代碼;
以上代碼必須在觸屏裝置才有效果,在電腦上運作沒有效果,在android真機上經過測試,ios系統下沒有測試過,