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;
 }

}

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

(0)

相关推荐

  • Unity3D实现控制摄像机移动

    本文实例为大家分享了Unity3D实现控制摄像机移动的具体代码,供大家参考,具体内容如下 最近公司的几个项目开发内容基本相同,很多脚本直接复制过来就可以拼接项目.之前一直是代码爱好者,能自己敲的绝对不去复制粘贴.但是开发速度确实是被耽误了,所以接下来打算把开发中常用的脚本都发到博客上.自己需要的时候直接拿来.也希望能帮到你们. unity编辑器中按住鼠标右键,在通过控制键盘的wasdqe键可以自由控制视野. 下面就是实现操作的代码: using System.Collections; using

  • Unity移动端的复制要这么写示例代码

    前言 Unity官网提供了详尽的文档和丰富的教学视频,昨天跟着视频做了一个简单的3d游戏"roll-a-ball".游戏涉及了许多Unity的基本知识,用来入门很不错. 本文主要给大家了关于Unity移动端的复制的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 游戏上线很久了,有些玩家慢慢就流失了,为了让刚流失的玩家再度回归所以做了召回功能!如果一个200级的玩家10天没上线且成功召回的,就会给予召回玩家丰厚的奖励! Q:那如何召回这个流失的玩家呢? A:召回

  • Unity实现物体左右移动效果

    本文实例为大家分享了Unity实现物体左右移动效果的具体代码,供大家参考,具体内容如下 效果如下 代码: using UnityEngine; using System.Collections; //Add this script to the platform you want to move. //左右移动的平台 public class MovingPlatform : MonoBehaviour { //Platform movement speed.平台移动速度 public floa

  • Unity键盘WASD实现物体移动

    本文实例为大家分享了Unity键盘WASD实现物体移动的具体代码,供大家参考,具体内容如下 1首先在场景中建立一个Capsule,将主摄像机拖到其物体下. 2.将脚本挂在Capsule物体下,WASD 控制移动方向,空格延Y轴向上移动,F延Y轴向下移动 using System.Collections; using System.Collections.Generic; using UnityEngine; public class MoveCam : MonoBehaviour { priva

  • Unity调取移动端的麦克风进行录音并播放

    本文实例为大家分享了Unity调取移动端的麦克风进行录音并播放的具体代码,供大家参考,具体内容如下 1.对MicroPhone类的理解 对麦克风的调用在Unity里主要是用到了MicroPhone这个类,此类里面有几个方法可以方便我们实现功能 2.代码演示 #region 模块信息 // ********************************************************************** // Copyright (C) 2018 Blazors // P

  • Unity3D实现虚拟按钮控制人物移动效果

    本文为大家分享了Unity3D实现虚拟按钮控制人物移动的具体代码,供大家参考,具体内容如下 创建Image的UI组件,在Image下新建一个Button按钮.在Image 和Button上拖进Sprite图片 在Button按钮上挂载该脚本 using System.Collections; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; public class MyJoystick : Mono

  • Unity3D控件Easytouch控制主角移动

    本文实例为大家分享了Unity3D控件Easytouch控制主角移动的具体代码,供大家参考,具体内容如下 开发步骤: 1.导入Charactor Controller资源包: 2.导入Easy Touch 3.1.0的资源包: 3.创建一个人物模型: 4.新建一个Plane作为地板. 5.新建一个joystick,添加步骤如下图所示: 6.设置摇杆的相关属性: 注:如图中属性一定要设置好,不然的话会出现摇杆没有反应的情况!!! 7.为主角(即需要Easytouch摇杆控制移动的模型)新建一个脚本

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

    本文实例为大家分享了Unity3D实现物体旋转缩放移动的具体代码,供大家参考,具体内容如下 由于项目运行在安卓上,运用到了插件,比较麻烦.你们可以在触发条件上进行修改,不用插件也可以. 1.下载FingerGestures 插件 下载地址 点击打开链接 2.导入插件,创建场景 将预设Finger Gestures Initializer 拖拽到 Hierarchy 视图中 3.添加脚本,拖拽到摄像机上.创建一个方块拖拽到脚本target 属性上. using UnityEngine; using

  • Unity3D使用鼠标旋转缩放平移视角

    Unity使用鼠标旋转缩放平移视角,供大家参考,具体内容如下 用代码在Game界面完美实现Scene界面的操作方法. 使用方法:把脚本挂在相机上,把跟踪的target拖到脚本上. 视角跟踪的是一个空物体,当然如果你是做RPG游戏需要跟踪某一角色的视角,那就不需要中键平移功能,把空物体换成角色就行. 代码主要是分三部分功能进行实现. 1.右键拖动控制视角的旋转: 2.滚轮旋转控制视角的缩放: 3.中键拖动控制视角的平移. 右键拖动控制旋转主要是用GetAxis获得鼠标在x方向与y方向平移的距离,相

  • unity3D实现物体任意角度自旋转

    本文实例为大家分享了unity3D实现物体任意角度自旋转的具体代码,供大家参考,具体内容如下 主要涉及函数: Input.GetAxis("Mouse x") 可取得鼠标横向(x轴)移动增量 Input.GetAxis("Mouse y") 可取得鼠标竖向(y轴)移动增量 通过勾股定理获取拖拽长度,长度越长旋转越快.在project setting--Input 可以设置. 这里用Cube来做例子,因为方体看旋转比较清楚,如图: 代码如下: using UnityE

  • vue+threejs写物体动画之物体缩放动画效果

    目录 写在前面 代码说明 写在最后 写在前面 本文用vue+threejs写物体动画:物体缩放动画. 实现原理:让缩放值根据秒数的增加呈函数式变化,以达到动画展示的效果. 下面是演示gif: 代码说明 准备一个id容器,用于插入渲染器节点 <template> <div class="item"> <div id="THREE42"></div> </div> </template> 引入thr

  • Android仿视频加载旋转小球动画效果的实例代码

    先上个效果图,以免大家跑错地了. 嗯,除了只能录三秒,其他没啥问题. 下面分析一下怎么实现上面这个效果. 理性分析后我们可以看到是几个小球绕着一个圆进行运动,那这里面的重点我们看看什么. 绘制五个球,没什么难度,让球绕圆进行运动,这个好像我们没有见到是怎么去实现了,那下就说这个. 从本质上看,球绕圆运动,其实我们可以看作是一个物体绕指定的路劲运动,那我们就有下面几个东西需要说一下: 1:Path 2:ValueAnimator 3:PathMeasure 前两个大家应该都见过,一个是路径,就是可

  • Unity3D实现物体排成弧行

    本文实例为大家分享了Unity3D实现物体排成弧行的具体代码,供大家参考,具体内容如下 一般用在Pico.HTC.DP等VR设备中 效果: 完整代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class CanvasPositionManager : MonoBehaviour { private float radius = 700f;//圆的半径 private

  • JS实现slide文字框缩放伸展效果代码

    本文实例讲述了JS实现slide文字框缩放伸展效果代码.分享给大家供大家参考,具体如下: 这里介绍的slide文字框缩放伸展效果,自己闲来无事写的,不是太好,可能在兼容性方面还需努力,展开速度方面,IE8和火狐的展开速度不一样,火狐下更快一些,至今没找到原因,也请JS高人指点江山. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-slide-txt-dlg-show-codes/ 具体代码如下: <!DOCTYPE html> <h

  • C#利用GDI+绘制旋转文字等效果实例

    本文实例讲述了C#利用GDI+绘制旋转文字等效果的方法,是非常实用的技巧.分享给大家供大家参考之用.具体如下: C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程.利用下面的类可以实现该功能. 具体实现代码如下: using System; using System.Collections.Generic; using System

  • JS多物体实现缓冲运动效果示例

    本文实例讲述了JS多物体实现缓冲运动效果的方法.分享给大家供大家参考,具体如下: <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" charset="utf-8" /> <meta http-equiv="content-type" content="text/html" /> <titl

  • 比较方便的onMouseWheel缩放图片效果 原创

    复制代码 代码如下: <HTML>   <HEAD>   <meta http-equiv="Content-Type" content="text/html; charset=gb2312">   <TITLE>onMouseWheel缩放图片效果-www.jb51.Net</TITLE> <body> <script> function bbimg(o) {   var zoom

随机推荐