Unity 控制物体旋转缩放移动

文章介绍了如何在Unity中使用PC端鼠标和移动端触摸事件控制游戏对象的旋转、缩放和移动,包括了使用`MonoBehaviour`中的方法实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值