Unity 控制物体旋转缩放移动
PC端鼠标控制
public class ModelControl : MonoBehaviour
{
float scaleparam = 0f;
Vector3 oldScale;
public Vector3 pos;
public Vector3 rot;
public Vector3 scl;
private void Start()
{
pos = transform.localPosition;
rot = transform.localEulerAngles;
scl = transform.localScale;
oldScale = transform.localScale;
}
private void Update()
{
if (GlobalVariable.CanDrag && Input.touchCount <= 0 )
{
void Trans_Rotation()
{
float mouse_x = -Input.GetAxis("Mouse X");//鼠标X轴移动
float mouse_y = Input.GetAxis("Mouse Y");//鼠标Y轴移动
if (Input.GetMouseButton(0))
{
Debug.Log(111);
transform.RotateAround(transform.position, Vector3.up, mouse_x * 10);
transform.RotateAround(transform.position, -Vector3.right, -mouse_y * 10);
}
}
Trans_Rotation();//自由旋转
void Trans_Scale()
{
if (Input.GetAxis("Mouse ScrollWheel") != 0f)
{
scaleparam += Input.GetAxis("Mouse ScrollWheel");
Vector3 newScale = new Vector3(Mathf.Clamp(oldScale.x + scaleparam, 0f, 100f), Mathf.Clamp(oldScale.y + scaleparam, 0f, 100f), Mathf.Clamp(oldScale.z + scaleparam, 0f, 100f));
transform.localScale = newScale;
}
}
Trans_Scale();//缩放
void Trans_Mv()
{
if (Input.GetMouseButton(1))
{
Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPos.z);
transform.position = Camera.main.ScreenToWorldPoint(mousePos);
}
}
Trans_Mv();//移动
}
if (Input.GetKeyDown(KeyCode.Space))
ModelReset();
}
/// <summary>
/// 重置模型位置
/// </summary>
public void ModelReset()
{
transform.DOLocalMove(pos, 1f);
transform.DOLocalRotate(rot, 1f);
transform.DOScale(scl, 1f);
}
}
移动端触摸控制
using UnityEngine;
using System.Collections;
using System.IO;
public class ModelControl : UnitySingleton<ModelControl>
{
/// <summary>
/// 上次触摸点1(手指1)
/// </summary>
private Touch oldTouch1;
/// <summary>
/// 上次触摸点2(手指2)
/// </summary>
private Touch oldTouch2;
/// <summary>
/// 用于显示滑动距离
/// </summary>
private float oldDis = 0;
private float newDis = 0;
private float scaler = 0;
public Vector3 recordRotation;
public Vector3 recordScale;
[Tooltip ("缩放物体大小倍率")]
[Range (0, 1)]
public float lerpT = 1f;
public bool isRotate;
public bool isScale;
public bool isMove;
void Update ()
{
if(GlobalVariable.touchArea != GlobalVariable.TouchArea.PDF1 && GlobalVariable.touchArea != GlobalVariable.TouchArea.PDF2)
{
//没有触摸
if (Input.touchCount <= 0)
{
return;
}
if (isRotate)
{
//单点触摸, 水平上下旋转
if (1 == Input.touchCount)
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Moved)
{
Vector2 deltaPos = touch.deltaPosition;
transform.Rotate(Vector3.down * deltaPos.x, Space.World);
transform.Rotate(Vector3.right * deltaPos.y, Space.World);
}
}
}
if (isScale)
{
if (Input.touchCount > 1)
{
//多点触摸, 放大缩小
Touch newTouch1 = Input.GetTouch(0);
Touch newTouch2 = Input.GetTouch(1);
//第2点刚开始接触屏幕, 只记录,不做处理
if (newTouch2.phase == TouchPhase.Began)
{
oldTouch2 = newTouch2;
oldTouch1 = newTouch1;
return;
}
//计算老的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
oldDis = oldDistance;
newDis = newDistance;
//两个距离之差,为正表示放大手势, 为负表示缩小手势
float offset = newDistance - oldDistance;
//放大因子, 一个像素按 0.01倍来算(100可调整)
float scaleFactor = offset / 100f;
Vector3 localScale = transform.localScale;
Vector3 scale = new Vector3(localScale.x + scaleFactor,
localScale.y + scaleFactor,
localScale.z + scaleFactor);
scaler = scaleFactor;
//允许模型最小缩放到 0.3 倍最大放大2倍
if (scale.x > 0f && scale.y > 0f && scale.z > 0f)
{
//实用差值运算,模型平滑缩放
transform.localScale = Vector3.Lerp(transform.localScale, new Vector3(Mathf.Clamp(localScale.x + scaleFactor, 0f, 1000f),
Mathf.Clamp(localScale.y + scaleFactor, 0f, 1000f),
Mathf.Clamp(localScale.z + scaleFactor, 0f, 1000f)), lerpT);
}
//记住最新的触摸点,下次使用
oldTouch1 = newTouch1;
oldTouch2 = newTouch2;
}
}
if (isMove)
{
if (Input.touchCount > 1)
{
var touch1 = Input.GetTouch(0);
var touch2 = Input.GetTouch(1);
var dir = Vector3.Dot(touch1.deltaPosition, touch2.deltaPosition) > 0.9f;
if (touch1.phase == TouchPhase.Moved && touch2.phase == TouchPhase.Moved && dir)
{
float fMouseX = 200 * touch1.deltaPosition.x / Screen.width;
float fMouseY = 200 * touch1.deltaPosition.y / Screen.height;
var objPos = Camera.main.WorldToScreenPoint(transform.position);
objPos.x += fMouseX;
objPos.y += fMouseY;
transform.position = Camera.main.ScreenToWorldPoint(objPos);
}
}
}
}
}
/// <summary>
/// 重置模型大小、旋转
/// </summary>
public void ModelReset ()
{
this.transform.localRotation = Quaternion.Euler (recordRotation);
this.transform.localScale = Vector3.one;
}
}
//单例模式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UnitySingleton<T> : MonoBehaviour
where T : Component
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType(typeof(T)) as T;
if (_instance == null)
{
GameObject obj = new GameObject();
obj.hideFlags = HideFlags.HideAndDontSave;//隐藏实例化的new game object,下同
_instance = obj.AddComponent(typeof(T)) as T;
}
}
return _instance;
}
}
}