天天看點

Unity3d觸摸屏手勢控制鏡頭旋轉卡位到目标對象

本文主要介紹如何在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系統下沒有測試過,