Unity实现模型预览功能——缩放和旋转

废话不多说,先粘贴代码(新建一个脚本,挂载在需要实现功能的物体上即可)

using UnityEngine;

public class RotateAndZoom : MonoBehaviour
{
    // 缩放比例限制
    private float MinScale = 0.2f;
    private float MaxScale = 3.0f;
    // 缩放速率
    private float scaleRate = 1f;
    // 新尺寸
    private float newScale;

    // 射线
    private Ray ray;
    private RaycastHit hitInfo;

    private bool isDragging = false;
    private Vector3 offset;

    // 旋转
    private float rotationSpeed = 5.0f;

    private void Awake()
    {
        MinScale = gameObject.transform.localScale.x * 0.5f;
        MaxScale = gameObject.transform.localScale.x * 3;
        scaleRate = gameObject.transform.localScale.x;
    }
    private void OnMouseDown()
    {
        isDragging = true;
        offset = gameObject.transform.position - GetMouseWorldPosition();
    }

    private void OnMouseUp()
    {
        isDragging = false;
    }

    private void Update()
    {
        // 拖拽
        if (isDragging)
        {
            Vector3 newPosition = GetMouseWorldPosition() + offset;
            transform.position = newPosition;
        }
        if (Input.GetMouseButton(1))
        {
            float mousX = Input.GetAxis("Mouse X");
            float mousY = Input.GetAxis("Mouse Y");
            transform.Rotate(mousY * rotationSpeed, -mousX * rotationSpeed, 0, Space.World);
        }
        if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            newScale += Input.GetAxis("Mouse ScrollWheel") * scaleRate;
            newScale = Mathf.Clamp(newScale, MinScale, MaxScale);
            transform.localScale = new Vector3(newScale, newScale, newScale);
        }
  
    }

    private Vector3 GetMouseWorldPosition()
    {
        Vector3 mousePos = Input.mousePosition;
        mousePos.z = -Camera.main.transform.position.z;
        return Camera.main.ScreenToWorldPoint(mousePos);
    }
}

此脚本依据物体原有尺寸进行缩放,泛用性比较强,适用于不同缩放程度的物体,代码中缩放的数值可以根据需要进行修改

我是一只北辰星,不定时分享干货内容~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity实现UI的拖拽、缩放旋转功能,可以通过以下步骤实现: 1. 拖拽功能: 首先,需要为UI元素添加一个EventTrigger组件。在EventTrigger组件中,添加一个PointerDown、PointerUp、Drag三个事件。然后,在代码中实现相应的事件处理。例如: ```csharp using UnityEngine; using UnityEngine.EventSystems; public class UIDrag : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { private RectTransform rectTransform; private Vector2 offset; private void Start() { rectTransform = GetComponent<RectTransform>(); } public void OnPointerDown(PointerEventData eventData) { offset = rectTransform.anchoredPosition - eventData.position; } public void OnPointerUp(PointerEventData eventData) { } public void OnDrag(PointerEventData eventData) { rectTransform.anchoredPosition = eventData.position + offset; } } ``` 这里使用了RectTransform组件,通过计算鼠标点击位置与UI元素位置的偏移量,实现了UI元素的拖拽。 2. 缩放功能: 为UI元素添加一个EventTrigger组件,添加一个PointerDown、PointerUp、Drag三个事件。然后,在代码中实现相应的事件处理。例如: ```csharp using UnityEngine; using UnityEngine.EventSystems; public class UIScale : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { private RectTransform rectTransform; private Vector2 offset; private Vector2 originalSize; private void Start() { rectTransform = GetComponent<RectTransform>(); originalSize = rectTransform.sizeDelta; } public void OnPointerDown(PointerEventData eventData) { offset = eventData.position - rectTransform.position; } public void OnPointerUp(PointerEventData eventData) { } public void OnDrag(PointerEventData eventData) { Vector2 currentPos = eventData.position; float distance = Vector2.Distance(currentPos, rectTransform.position); float scale = distance / offset.magnitude; rectTransform.sizeDelta = originalSize * scale; } } ``` 这里使用了RectTransform组件,通过计算鼠标点击位置与UI元素中心点的距离,实现了UI元素的缩放。 3. 旋转功能: 为UI元素添加一个EventTrigger组件,添加一个PointerDown、PointerUp、Drag三个事件。然后,在代码中实现相应的事件处理。例如: ```csharp using UnityEngine; using UnityEngine.EventSystems; public class UIRotate : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { private RectTransform rectTransform; private Vector2 offset; private float originalRotation; private void Start() { rectTransform = GetComponent<RectTransform>(); originalRotation = rectTransform.localEulerAngles.z; } public void OnPointerDown(PointerEventData eventData) { offset = eventData.position - rectTransform.position; } public void OnPointerUp(PointerEventData eventData) { } public void OnDrag(PointerEventData eventData) { Vector2 currentPos = eventData.position; Vector2 dir = currentPos - rectTransform.position; float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg; rectTransform.localEulerAngles = new Vector3(0, 0, angle - offset.magnitude); } } ``` 这里使用了RectTransform组件,通过计算鼠标点击位置与UI元素中心点的方向,计算出旋转角度,实现了UI元素的旋转。 以上就是实现UI元素拖拽、缩放旋转的步骤,可以根据自己的需求进行相应的修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值