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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。