本文主要介绍如何在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系统下没有测试过,