在PC端unity通过鼠标拖动来旋转观看场景的方法非常简单,但是在安卓设备上无法很好的使用。
下面方法可以实现在安卓设备上手指滑动屏幕就可以旋转观看场景,还可以通过两个或多个手指来对场景放大缩小。
实现思路和在pc端的一样,把一个物体作为目标物体,然后相机围绕整个物体旋转!
具体案例:
在下面场景里我放置了一个plane一个cube和一个相机,cube就是目标物体,只需要在相机上挂一个脚本move就可以实现;
此方法里核心功能我都在代码里给了注释
Move代码:
using UnityEngine;
using System.Collections;
public class Move : MonoBehaviour
{
public Transform box;
public float distance=10.0f;//相机距离目标物体默认距离大小
public float xSpeed=250.0f;//X(左右旋转速度)
public float ySpeed=120.0f;//(上下旋转速度)
public float yMinLimit=-20;//旋转上下角度最小限制
public float yMaxLimit=80;
float X=0.0f;
float Y=0.0f;
float StartDis;
float XChange;//旋转灵敏度
void Start ()
{
Vector3 angles=transform.eulerAngles;
X =angles.y;
Y =angles.x;
}
void Update ()
{
if(Input.touchCount==1)
{
X-=Input.GetTouch(0).deltaPosition.x*xSpeed*Time.deltaTime/60;//+和-决定从左向右旋转还是从右向左转
Y+=Input.GetTouch(0).deltaPosition.y*ySpeed*Time.deltaTime/60; //+和-决定从上向下旋转还是从下而上转
if(Input.GetTouch(0).phase==TouchPhase.Ended)
{
if(Input.GetTouch(0).deltaPosition.x>5)
{
XChange=5;
}
else if(Input.GetTouch(0).deltaPosition.x<-5)
{
XChange=-5;
}
else
{
XChange=Input.GetTouch(0).deltaPosition.x;
}
}
}
X+=XChange;
if(XChange>0)
{
XChange-=Time.deltaTime*5;
}
else if(XChange<0)
{
XChange+=Time.deltaTime*5;
}
if(Input.touchCount >1)
{
if(Input.GetTouch(0).phase==TouchPhase.Began||Input.GetTouch(1).phase==TouchPhase.Began)
{
StartDis=Vector2.Distance(Input.GetTouch(0).position,Input.GetTouch(1).position);
}
if(Input.GetTouch(0).phase==TouchPhase.Moved ||Input.GetTouch(1).phase==TouchPhase.Moved)
{
Vector2 tempPosition1= Input.GetTouch(0).position;
Vector2 tempPosition2= Input.GetTouch(1).position;
float dis=Vector2.Distance(tempPosition1,tempPosition2);
if(dis<StartDis)
{
if(distance <130)//远近距离大小
{
distance += Time.deltaTime*7;
}
}
else if(dis>StartDis)
{
if(distance >3)
{
distance -= Time.deltaTime*7;
}
}
}
}
}
void LateUpdate()
{
if(box)
{
if(Y<-90)//这里控制着上下旋转角度
{
Y=-90;
}
if(Y>180)//这里控制着上下旋转角度
{
Y=180;
}
Y=ClampAngle(Y,yMinLimit,yMaxLimit);
transform.rotation=Quaternion.Euler(Y,X,0);
transform.position=transform.rotation*new Vector3(0,0,-distance)+box.position;
}
}
static float ClampAngle(float angle,float min,float max)
{
if(angle<-360)
angle+=360;
if(angle>360)
angle-=360;
return Mathf.Clamp(angle,min,max);
}
}