Unity3D实现物体旋转缩放移动效果
本文实例为大家分享了Unity3D实现物体旋转缩放移动的具体代码,供大家参考,具体内容如下
由于项目运行在安卓上,运用到了插件,比较麻烦。你们可以在触发条件上进行修改,不用插件也可以。
1.下载FingerGestures插件下载地址 点击打开链接
2.导入插件,创建场景将预设FingerGesturesInitializer拖拽到Hierarchy视图中
3.添加脚本,拖拽到摄像机上。创建一个方块拖拽到脚本target属性上。
usingUnityEngine;
usingSystem.Collections;
publicclassObjectControl:MonoBehaviour
{
publicTransformtarget;
publicfloatyawSensitivity=80.0f;
publicfloatpitchSensitivity=160.0f;
publicboolclampPitchAngle=true;
publicfloatpinchZoomSensitivity=0.5f;//缩放速度
publicfloatsmoothZoomSpeed=10.0f;
publicfloatsmoothOrbitSpeed=20.0f;
publicfloatdistance=0;
floatyaw=0;
floatpitch=0;
floatidealYaw=0;
floatidealPitch=0;
floatfChangeScale=0;
floatfChangeideal=0;
publicTransform[]movementP;
///
///控制模式枚举
/// 
publicenumControlModel
{
Zoom,Rotate,Translate
}
publicControlModelcontrolModel=ControlModel.Rotate;
//Vector3position=newVector3();
publicboolbArrive=false;//鼠标是否到达零件箱边界区域
//平移方式是否根据鼠标拖动距离还是直接置为鼠标位置
publicboolifDragMove=false;
//平移方式为:根据鼠标拖动距离时,评议的速度
publicfloatmoveSpeed=1.0f;
//是够需要画出按钮(缩放、旋转、平移)
publicboolifDrawBtn=true;
//缩放方式改为:改变相机范围
publicboolzoomCamera=false;
//zoomCamera=true,相机的最小范围值
publicfloatminZoom=0f;
//zoomCamera=true,相机的最大范围值
publicfloatmaxZoom=179f;
//平移对象
publicTransformmoveTarget;
//平移对象的初始位置
Vector3moveTargetPos;
//模型的直接父对象
publicTransformparentModel;
Vector3parentModelPos;
voidStart()
{
zoomCamera=true;
}
voidOnEnable()
{
FingerGestures.OnDragMove+=FingerGestures_OnDragMove;
FingerGestures.OnPinchMove+=FingerGestures_OnPinchMove;
FingerGestures.OnFingerDragEnd+=OnFingerDragEnd;
}
voidOnDisable()
{
FingerGestures.OnDragMove-=FingerGestures_OnDragMove;
FingerGestures.OnPinchMove-=FingerGestures_OnPinchMove;
FingerGestures.OnFingerDragEnd-=OnFingerDragEnd;
}
publicvoidsetRotation()
{
Vector3angles=target.eulerAngles;
yaw=idealYaw=angles.y;
pitch=idealPitch=angles.x;
}
voidFingerGestures_OnDragMove(Vector2fingerPos,Vector2delta)
{
onDrag=true;
try
{
Screen.showCursor=false;
}
catch
{
Screen.showCursor=false;
}
if(controlModel==ControlModel.Rotate&&!bArrive)
{
idealYaw-=delta.x*yawSensitivity*0.02f;
idealPitch+=delta.y*pitchSensitivity*0.02f;
len=delta;
if(target)target.transform.Rotate(newVector3(delta.y,-delta.x,0),Space.World);
}
if(controlModel==ControlModel.Translate&&!bArrive)
{
if(ifDragMove)
{
if(moveTarget==null)
{
target.position=newVector3(target.position.x+delta.x*moveSpeed,target.position.y+delta.y*moveSpeed,target.localPosition.z);//GetWorldPos(fingerPos);
}
else
{
moveTarget.position=newVector3(moveTarget.position.x+delta.x*moveSpeed,moveTarget.position.y+delta.y*moveSpeed,moveTarget.localPosition.z);
}
}
else
{
if(moveTarget==null)
{
target.position=GetWorldPos(fingerPos);
}
else
{
moveTarget.position=GetWorldPos(fingerPos);
}
}
}
}
voidFingerGestures_OnPinchMove(Vector2fingerPos1,Vector2fingerPos2,floatdelta)
{
if(controlModel==ControlModel.Zoom&&!bArrive)
{
if(zoomCamera)
{
floatfZoom=camera.fieldOfView-delta*pinchZoomSensitivity*800*Time.deltaTime;
fZoom=Mathf.Min(fZoom,maxZoom);
fZoom=Mathf.Max(fZoom,minZoom);
camera.fieldOfView=Mathf.Lerp(camera.fieldOfView,fZoom,Time.deltaTime*smoothZoomSpeed);
//camera.transform.position=target.position-fZoom*camera.transform.forward;
}
else
{
fChangeScale=target.localScale.x+delta*pinchZoomSensitivity;
Vector3vc=newVector3(fChangeScale,fChangeScale,fChangeScale);
}
}
}
//滑动结束
voidOnFingerDragEnd(intfingerIndex,Vector2fingerPos)
{
Screen.showCursor=true;
onDrag=false;
}
//把Unity屏幕坐标换算成3D坐标
Vector3GetWorldPos(Vector2screenPos)
{
//CameramainCamera=Camera.main;
CameramainCamera=GameObject.FindGameObjectWithTag("MainCamera").GetComponent();
if(!mainCamera.enabled)
{
mainCamera=mainCamera.transform.parent.FindChild("CameraOne").GetComponent();
}
returnmainCamera.ScreenToWorldPoint(newVector3(screenPos.x,screenPos.y,Mathf.Abs(target.position.z-mainCamera.transform.position.z)));
}
voidApply()
{
if(controlModel==ControlModel.Rotate&&!bArrive)
{
yaw=Mathf.Lerp(yaw,idealYaw,Time.deltaTime*smoothOrbitSpeed);
pitch=Mathf.Lerp(pitch,idealPitch,Time.deltaTime*smoothOrbitSpeed);
}
}
boolonDrag;
Vector2len;
voidLateUpdate()
{
if(Input.GetMouseButtonUp(1)||Input.GetMouseButtonUp(0))
{
Screen.showCursor=true;
}
Apply();
}
staticfloatClampAngle(floatangle,floatmin,floatmax)
{
if(angle<-360)
angle+=360;
if(angle>360)
angle-=360;
returnMathf.Clamp(angle,min,max);
}
voidUpdate()
{
///自由切换
if(Input.GetMouseButtonDown(0))
{
controlModel=ControlModel.Translate;
}
if(Input.GetMouseButtonDown(1))
{
controlModel=ControlModel.Rotate;
}
if(Input.GetAxis("MouseScrollWheel")!=0)
{
controlModel=ControlModel.Zoom;
}
}
///
///复位
/// 
publicvoidResetValue()
{
if(moveTarget!=null)
{
moveTarget.localPosition=moveTargetPos;
}
if(parentModel!=null)
{
parentModel.localPosition=parentModelPos;
}
yaw=0;
pitch=0;
idealYaw=0;
idealPitch=0;
}
}  
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
