Unity3d触摸屏手势控制镜头旋转卡位到目标对象
2015-09-02 23:27
453 查看
本文主要介绍如何在unity中通过鼠标或手指触控屏幕对镜头进行旋转,并实现镜头旋转卡位功能,使镜头平滑的旋转至目标角度。
镜头绕着目标对象进行旋转改变的是摄相机在世界坐标中的x、y方向的坐标值。那么我们只需要在脚本中控制相机的x\y坐标即可。
将脚本RotationTarget.cs添加到主摄相机上,在游戏场景里创建一个简单的游戏对象作为镜头旋转的参照物,将该游戏对象赋值给公开属性TargetObject;
下面是完整的RotationTarget.cs代码篇段:
镜头绕着目标对象进行旋转改变的是摄相机在世界坐标中的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系统下没有测试过,
相关文章推荐
- Unity 3D面试题
- Unity3d获取IOS设备唯一标识,以及IDFA
- unity 3d学习第二天
- Unity3D如何有效地组织代码?
- Unity3D手机游戏开发的一些笔记
- unity开发相关环境(vs、MonoDevelop)windows平台编码问题
- unity制作一个3d旋转菜单
- Unity出现 error building player exception android (invocation failed)
- Unity 2D游戏开发教程之使用脚本实现游戏逻辑
- Unity3d项目工程批量打包
- Unity 2D游戏开发教程之使用脚本实现游戏逻辑
- Unity3d使用RenderTexture制作动态头像
- unity新版动画系统个人心得
- Unity3D自己常用代码
- Unity3D自己常用代码
- unity3d 单例模式
- Unity3D学习笔记《Space Shooter》一
- Unity3d碰撞器与触发器的区别详解(rigidbody移动和charactercontroller移动区别)
- Unity5内部渲染的优化1:介绍
- Unity Sprite Packer 使用指南