Unity3D实现物体旋转缩放移动效果
作者:qq_27361571 发布时间:2023-07-17 22:11:58
标签: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


猜你喜欢
- 如何从C#获取字符串中汉字的个数?C#中使用正则表达式来从字符串中判断出汉字,然后计数,从而得到字符串中的汉字个数。先看这段代码://首先引
- idea中创建一个maven项目在pom文件中导入下面的依赖<!--mybatis核心包--> <depend
- 背景:我们在开发的过程中可能需要随机生成一个ID,例如数据库中的某个ID有时候也要对其进行校验。UUID:UUID,是Universally
- 作为Android开发者,工作中少不了要反编译别人的apk,当然主要目的还是为了学习到更多,取彼之长,补己之短。今天就来总结一下Androi
- 单例模式是23种设计模式之一,是比较简单的一种设计模式,它的目的是无论调用多少次,都返回同一个对象,它的特点是构造器私有化。它分为两种结构,
- java Lock接口java.util.concurrent.locks接口Lockpublic interface Loce
- lombok插件使用引入依赖,在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/setter/toString等方法的
- 目录什么是Insets?Insets相关类InsetsStateInsetsStateControllerInsetsSourceInset
- 废话不多说了,直接给大家贴代码了。具体代码如下所示:using System;using System.Collections.Generi
- 本文主要给大家介绍了关于Java8中Optional类型和Kotlin中可空类型使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一
- 今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑。虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没
- 本文实例为大家分享了Unity3D UGUI翻书展示的具体代码,供大家参考,具体内容如下参考大佬的,链接找不到了,找到了再加在这。下边是Sh
- Spring Security是一款基于Spring框架的认证和授权框架,提供了一系列控制访问和保护应用程序的功能,同时也支持基于角色和权限
- 学习初衷:在工作实际开发过程中,原有的安卓控件已不能满足实际的功能需求,而且有些应用还需要一些独特的展示效果,这时就需要自定义控件来定制控件
- 要讲到C#源码的执行过程 首先要提下程序集,因为Clr并不是和托管摸块打交道的,而是和程序集(dll,exe)1、从哪里来程序集是由一个或者
- 本文实例讲述了.net的序列化与反序列化的实现方法。分享给大家供大家参考。具体方法如下:1.序列化与反序列化概述C#中如果需要:将一个结构很
- 什么是 Intent ?Intent是Android开发中一个非常重要且常用的类,Intent是一个消息传递对象,可以用来从其他应用组件请求
- 一、html代码 &n
- 本文为大家分享了java实现百度云OCR识别的具体代码,高精度OCR识别身份证信息,供大家参考,具体内容如下1.通用OCR文字识别这种OCR
- 本文实例为大家分享了unity实现场景跳转的具体代码,供大家参考,具体内容如下话不多说直接开始操作步骤。1.打开我们的unity创建一个工程