gpt4 book ai didi

c# - 使用 Unity 5 UI 进行双指缩放

转载 作者:行者123 更新时间:2023-11-30 12:56:20 25 4
gpt4 key购买 nike

我正在尝试在基于 Unity UI 的应用程序中重新实现双指缩放系统。大约六个月前,我能够通过使 UI Canvas 成为常规 GameObject 的子对象并操纵该对象的变换来破解一个,但自从更新到 Unity 5.5+ 后,我发现这不起作用。我能得到的最接近的允许捏手势改变 Canvas 的比例因子,这 a) 可以使图像、面板等根据它们的对齐方式不正确地调整大小,并且 b) 不允许我在缩放后平移。

我目前的情况是这样的:

public class PinchToZoomScaler : MonoBehaviour {

public Canvas canvas; // The canvas
public float zoomSpeed = 0.5f; // The rate of change of the canvas scale factor

public float _resetDuration = 3.0f;
float _durationTimer = 0.0f;

float _startScale = 0.0f;

void Start() {
_startScale = canvas.scaleFactor;
}

void Update()
{
// If there are two touches on the device...
if (Input.touchCount == 2) {
// Store both touches.
Touch touchZero = Input.GetTouch (0);
Touch touchOne = Input.GetTouch (1);

// Find the position in the previous frame of each touch.
Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;

// Find the magnitude of the vector (the distance) between the touches in each frame.
float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;

// Find the difference in the distances between each frame.
float deltaMagnitudeDiff = prevTouchDeltaMag - touchDeltaMag;

// ... change the canvas size based on the change in distance between the touches.
canvas.scaleFactor -= deltaMagnitudeDiff * zoomSpeed;

// Make sure the canvas size never drops below 0.1
canvas.scaleFactor = Mathf.Max (canvas.scaleFactor, _startScale);
canvas.scaleFactor = Mathf.Min (canvas.scaleFactor, _startScale * 3.0f);

_durationTimer = 0.0f;
} else {
_durationTimer += Time.deltaTime;

if (_durationTimer >= _resetDuration) {
canvas.scaleFactor = _startScale;
}
}
}
}

正如我所说,这在一定程度上起作用,但不能给我很好的均匀缩放,也不能让我平移 Canvas 。在此先感谢您的帮助。

最佳答案

将此脚本附加到要缩放的 Canvas 对象中

using UnityEngine;
using UnityEngine.EventSystems;

public class ObjectScalling : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
private bool _isDragging;
private float _currentScale;
public float minScale, maxScale;
private float _temp = 0;
private float _scalingRate = 2;

private void Start()
{
_currentScale = transform.localScale.x;
}

public void OnPointerDown(PointerEventData eventData)
{
if (Input.touchCount == 1)
{
_isDragging = true;
}
}


public void OnPointerUp(PointerEventData eventData)
{
_isDragging = false;
}


private void Update()
{
if (_isDragging)
if (Input.touchCount == 2)
{
transform.localScale = new Vector2(_currentScale, _currentScale);
float distance = Vector3.Distance(Input.GetTouch(0).position, Input.GetTouch(1).position);
if (_temp > distance)
{
if (_currentScale < minScale)
return;
_currentScale -= (Time.deltaTime) * _scalingRate;
}

else if (_temp < distance)
{
if (_currentScale > maxScale)
return;
_currentScale += (Time.deltaTime) * _scalingRate;
}

_temp = distance;
}
}
}

提醒:此脚本仅适用于 Canvas 对象

关于c# - 使用 Unity 5 UI 进行双指缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41901253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com