天天看点

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系统下没有测试过,