好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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;

  }

 

}

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

原文链接:https://blog.csdn.net/qq_27361571/article/details/51354717

dy("nrwz");

查看更多关于Unity3D实现物体旋转缩放移动效果的详细内容...

  阅读:47次