收缩缩放没有移动到正确的位置



我正在尝试实现捏缩缩放,缩放正在工作,但它总是缩放到RectTransform的中心,我试图计算手指之间的中心,并使用DOAnchorPos移动到该点,但它使我退出了RectTransfer

以下是我如何计算中心并尝试移动到它:

Vector3 center = (touchZero + touchOne) / 2f;
content.DOAnchorPos(center, 0.3f);

这是有效的缩放:

public class PinchZoom : MonoBehaviour
{
public RectTransform content;
private void Update()
{
if (Input.touchCount != 2) return;
var touchZero = Input.GetTouch(0);
var touchOne = Input.GetTouch(1);
var touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
var touchOnePrevPos = touchOne.position - touchOne.deltaPosition;
var prevMagnitude = (touchZeroPrevPos - touchOnePrevPos).magnitude;
var currentMagnitude = (touchZero.position - touchOne.position).magnitude;
var difference = prevMagnitude - currentMagnitude;
var localScale1 = content.localScale;
var scale = localScale1;
var localScale = scale;
var zoomX = Mathf.Clamp(localScale.x - difference * 0.01f, 0.9f, 7f);
var zoomY = Mathf.Clamp(localScale.y - difference * 0.01f, 0.9f, 7f);
content.DOScale(new Vector3(zoomX, zoomY, 1f), 0.1f);
}
}

我在ArtS的这个问题中找到了代码,但如果我使用透视相机,它对我来说不太管用。经过一些实质性的调整,我认为它运行得很好:

public class ZoomController: MonoBehaviour
{
public float zoomSpeedPinch = 0.001f;
public float zoomMin = 0.1f;
public float zoomMax = 1f;
Camera mainCam;
public RectTransform content;
private void Awake()
{
mainCam = Camera.main;
}
private void LateUpdate()
{
Zoom();
}
void Zoom()
{
if (Input.touchCount != 2) return;
float scaleChange = 0f;
Vector2 midPoint = Vector2.zero;
var touchZero = Input.GetTouch(0);
var touchOne = Input.GetTouch(1);
var touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
var touchOnePrevPos = touchOne.position - touchOne.deltaPosition;
float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;
float deltaMagnitudeDiff = touchDeltaMag - prevTouchDeltaMag;
scaleChange = deltaMagnitudeDiff * zoomSpeedPinch;
midPoint = (touchOne.position + touchZero.position) / 2f;
if (scaleChange != 0)
{
var scaleX = transform.localScale.x;
scaleX += scaleChange;
scaleX = Mathf.Clamp(scaleX, zoomMin, zoomMax);
var size = content.rect.size;
size.Scale(content.localScale);
var clickPlane = new Plane(mainCam.transform.forward, transform.position);
var camRay = mainCam.ScreenPointToRay(midPoint);
clickPlane.Raycast(camRay,out var dist);
var p1 = camRay.GetPoint(dist);
var p2 = transform.InverseTransformPoint(p1); 
var pivotP = content.pivot * content.rect.size; 
var p3 = (Vector2)p2 + pivotP; 
var newPivot = p3 / content.rect.size;
content.SetPivot(newPivot);
transform.localScale = new Vector3(scaleX, scaleX, transform.localScale.z);
}
}
}
public static class RectTransformExtension
{
/// <summary>
/// Set pivot without changing the position of the element
/// </summary>
public static void SetPivot(this RectTransform rectTransform, Vector2 pivot)
{
Vector3 deltaPosition = rectTransform.pivot - pivot;    // get change in pivot
deltaPosition.Scale(rectTransform.rect.size);           // apply sizing
deltaPosition.Scale(rectTransform.localScale);          // apply scaling
deltaPosition = rectTransform.rotation * deltaPosition; // apply rotation
rectTransform.pivot = pivot;                            // change the pivot
rectTransform.localPosition -= deltaPosition;           // reverse the position change
}
}

最新更新