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;

}

}

以上是 Unity3D实现物体旋转缩放移动效果 的全部内容, 来源链接: utcz.com/z/342086.html

回到顶部