Unity3D实现物体旋转缩放移动效果
更新时间:2020年6月25日 11:15 点击:1965
本文实例为大家分享了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; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
上一篇: UGUI实现图片拖拽功能
相关文章
- 这篇文章主要介绍了pycharm 实现光标快速移动到括号外或行尾的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-06
C#中图片旋转和翻转(RotateFlipType)用法分析
这篇文章主要介绍了C#中图片旋转和翻转(RotateFlipType)用法,实例分析了C#图片旋转及翻转Image.RotateFlip方法属性的常用设置技巧,需要的朋友可以参考下...2020-06-25- 下面小编就为大家带来一篇javascript 广告移动特效的实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-07-01
- 本文主要介绍了jQuery制作图片旋转效果的示例代码。具有很好的参考价值,下面跟着小编一起来看下吧...2017-02-08
- 这篇文章主要为大家详细介绍了Unity3D UGUI实现翻书特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
手机未实名认证被停机了怎么办?中国移动/联通/电信手机号实名认证方法
,“手机实名制”就是每一个手机号码对应一个身份证,对应唯一真实的主人。如果不认证可能会陆续遭到停机,这该怎么办呢?手机怎么认证呢?下面就详情来看看移动联通电信手机号实名认证方式吧...2016-11-01- 这篇文章主要介绍了JavaScript图片旋转效果实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-29
- 本文主要介绍了js实现图片360度旋转的思路与方法。具有很好的参考价值,下面跟着小编一起来看下吧...2017-01-26
- 这篇文章主要介绍了unity 实现摄像机绕某点旋转一周,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 调查,目前手机维修最常见的问题手机屏幕损坏,而屏幕损坏多半是用户不小心摔坏或者碰坏,这种状况通常都不在免费维修内。目前中国移动智能手机售后服务排名已经出炉了,下面我们来看看吧...2016-09-12
- 这篇文章主要为大家详细介绍了Unity3D使用GL实现图案解锁功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity3D实现飞机大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
- 这篇文章主要为大家详细介绍了VS+opencv实现鼠标移动图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
Unity3D游戏开发数据持久化PlayerPrefs的用法详解
在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25- 这篇文章主要介绍了jquery实现可旋转可拖拽的文字效果代码,涉及jquery响应鼠标事件动态操作页面元素样式的相关技巧,需要的朋友可以参考下...2016-01-30
- 这篇文章主要介绍了Unity3D基于OnGUI实时显示FPS,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了Oracle dbf文件移动的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
- 这篇文章主要为大家详细介绍了Unity3D仿写Button面板事件绑定功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity实现移动物体到鼠标点击位置,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
- 这篇文章主要为大家详细介绍了unity3D实现三维物体跟随鼠标,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25