首页 > 编程 > C# > 正文

Unity3D实现物体旋转缩放移动效果

2020-01-24 00:09:45
字体:
来源:转载
供稿:网友

本文实例为大家分享了Unity3D实现物体旋转缩放移动的具体代码,供大家参考,具体内容如下

由于项目运行在安卓上,运用到了插件,比较麻烦。你们可以在触发条件上进行修改,不用插件也可以。

1.下载FingerGestures 插件 下载地址 点击打开链接

2.导入插件,创建场景 将预设Finger Gestures Initializer 拖拽到 Hierarchy 视图中

3.添加脚本,拖拽到摄像机上。创建一个方块拖拽到脚本target 属性上。

using UnityEngine;using System.Collections; public class ObjectControl : MonoBehaviour{ public Transform target; public float yawSensitivity = 80.0f; public float pitchSensitivity = 160.0f; public bool clampPitchAngle = true; public float pinchZoomSensitivity = 0.5f;//缩放速度 public float smoothZoomSpeed = 10.0f; public float smoothOrbitSpeed = 20.0f; public float distance = 0;  float yaw = 0; float pitch = 0; float idealYaw = 0; float idealPitch = 0; float fChangeScale = 0; float fChangeideal = 0; public Transform[] movementP;  /// <summary> /// 控制模式枚举 /// </summary> public enum ControlModel { Zoom, Rotate, Translate }  public ControlModel controlModel = ControlModel.Rotate;  //Vector3 position=new Vector3(); public bool bArrive = false;//鼠标是否到达零件箱边界区域 //平移方式是否根据鼠标拖动距离还是直接置为鼠标位置 public bool ifDragMove = false; //平移方式为:根据鼠标拖动距离 时,评议的速度 public float moveSpeed = 1.0f; //是够需要画出按钮(缩放、旋转、平移) public bool ifDrawBtn = true; //缩放方式改为:改变相机范围 public bool zoomCamera = false; //zoomCamera = true ,相机的最小范围值 public float minZoom = 0f; //zoomCamera = true ,相机的最大范围值 public float maxZoom = 179f; //平移对象 public Transform moveTarget; //平移对象的初始位置 Vector3 moveTargetPos; //模型的直接父对象 public Transform parentModel; Vector3 parentModelPos;  void Start() { zoomCamera = true; }  void OnEnable() {  FingerGestures.OnDragMove += FingerGestures_OnDragMove; FingerGestures.OnPinchMove += FingerGestures_OnPinchMove; FingerGestures.OnFingerDragEnd += OnFingerDragEnd;  }  void OnDisable() { FingerGestures.OnDragMove -= FingerGestures_OnDragMove; FingerGestures.OnPinchMove -= FingerGestures_OnPinchMove; FingerGestures.OnFingerDragEnd -= OnFingerDragEnd; }  public void setRotation() { Vector3 angles = target.eulerAngles; yaw = idealYaw = angles.y; pitch = idealPitch = angles.x; }  void FingerGestures_OnDragMove(Vector2 fingerPos, Vector2 delta) { 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(new Vector3(delta.y, -delta.x, 0), Space.World); } if (controlModel == ControlModel.Translate && !bArrive) {  if (ifDragMove)  {  if (moveTarget == null)  {   target.position = new Vector3(target.position.x + delta.x * moveSpeed, target.position.y + delta.y * moveSpeed, target.localPosition.z);// GetWorldPos( fingerPos );  }  else  {   moveTarget.position = new Vector3(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);  }  } }  }  void FingerGestures_OnPinchMove(Vector2 fingerPos1, Vector2 fingerPos2, float delta) {  if (controlModel == ControlModel.Zoom && !bArrive) {  if (zoomCamera)  {  float fZoom = 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;   Vector3 vc = new Vector3(fChangeScale, fChangeScale, fChangeScale);  } } } //滑动结束 void OnFingerDragEnd(int fingerIndex, Vector2 fingerPos) { Screen.showCursor = true;  onDrag = false; }   //把Unity屏幕坐标换算成3D坐标 Vector3 GetWorldPos(Vector2 screenPos) { // Camera mainCamera = Camera.main; Camera mainCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>(); if (!mainCamera.enabled) {  mainCamera = mainCamera.transform.parent.FindChild("CameraOne").GetComponent<Camera>(); } return mainCamera.ScreenToWorldPoint(new Vector3(screenPos.x, screenPos.y, Mathf.Abs(target.position.z - mainCamera.transform.position.z))); }  void Apply() { if (controlModel == ControlModel.Rotate && !bArrive) {  yaw = Mathf.Lerp(yaw, idealYaw, Time.deltaTime * smoothOrbitSpeed);  pitch = Mathf.Lerp(pitch, idealPitch, Time.deltaTime * smoothOrbitSpeed); } } bool onDrag; Vector2 len;  void LateUpdate() { if (Input.GetMouseButtonUp(1) || Input.GetMouseButtonUp(0)) {  Screen.showCursor = true; } Apply(); }  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); }  void Update() { ///自由切换  if (Input.GetMouseButtonDown(0)) {   controlModel = ControlModel.Translate; }  if (Input.GetMouseButtonDown(1)) {   controlModel = ControlModel.Rotate; }  if (Input.GetAxis("Mouse ScrollWheel") != 0) {  controlModel = ControlModel.Zoom; }  }  /// <summary> /// 复位 /// </summary> public void ResetValue() { if (moveTarget != null) {  moveTarget.localPosition = moveTargetPos; } if (parentModel != null) {  parentModel.localPosition = parentModelPos; } yaw = 0; pitch = 0; idealYaw = 0; idealPitch = 0; } }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表