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

 更新时间:2019年02月22日 10:22:55   作者:qq_27361571  
这篇文章主要为大家详细介绍了Unity3D实现物体旋转缩放移动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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;
 }
 
}

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

相关文章

  • C#创建Windows服务与服务的安装、卸载

    C#创建Windows服务与服务的安装、卸载

    这篇文章介绍了C#创建Windows服务与服务的安装、卸载,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-02-02
  • C#实现的一款比较美观的验证码完整实例

    C#实现的一款比较美观的验证码完整实例

    这篇文章主要介绍了C#实现的一款比较美观的验证码,以完整实例形式分析了C#生成验证码与前端调用验证码的实现技巧,需要的朋友可以参考下
    2016-06-06
  • C#的Process类调用第三方插件实现PDF文件转SWF文件

    C#的Process类调用第三方插件实现PDF文件转SWF文件

    本篇文章主要介绍了C#的Process类调用第三方插件实现PDF文件转SWF文件,现在分享给大家,具有一定的参考价值,有需要的可以了解一下。
    2016-11-11
  • C#实现类似jQuery的方法连缀功能

    C#实现类似jQuery的方法连缀功能

    这篇文章主要介绍了C#实现类似jQuery的方法连缀功能,可以简化语句,使代码变得清晰简单,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • DevExpress之ChartControl实现柱状图演示实例

    DevExpress之ChartControl实现柱状图演示实例

    这篇文章主要介绍了DevExpress中ChartControl实现柱状图演示方法,实例展示了相关绘图函数的具体用法,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • C#子线程执行完后通知主线程的方法

    C#子线程执行完后通知主线程的方法

    下面小编就为大家带来一篇C#子线程执行完后通知主线程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C#中使用ArrayPool和MemoryPool实例

    C#中使用ArrayPool和MemoryPool实例

    对资源的可复用是提升应用程序性能的一个非常重要的手段,比如本篇要分享的 ArrayPool 和 MemoryPool,它们就有效的减少了内存使用和对GC的压力,从而提升应用程序性能。感兴趣的可以了解一下
    2021-05-05
  • C# wpf解决Popup弹出位置异常问题解决

    C# wpf解决Popup弹出位置异常问题解决

    本文主要介绍了C# wpf解决Popup弹出位置异常问题解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • C# 实现Zookeeper分布式锁的参考示例

    C# 实现Zookeeper分布式锁的参考示例

    Zookeeper分布式锁的原理是巧妙的是使用了znode临时节点的特点和监听(watcher)机制,监听机制很简单,就是我们可以给znode添加一个监听器,当znode节点状态发生改变时(如:数据内容改变,节点被删除),会通知到监听器。本文讲解使用c#实现该功能
    2021-06-06
  • .net的命名空间类库的简单介绍

    .net的命名空间类库的简单介绍

    .net的命名空间类库的简单介绍,需要的朋友可以参考一下
    2013-04-04

最新评论