【发布时间】:2021-05-23 00:41:55
【问题描述】:
对于 Unity 中的此设置,有一个圆形表盘。旋转值用于缩放模型。实际的缩放代码已被删除,因为zAngle 值的计算方式存在错误。理想情况下,它应该在所有方向上都保持稳定的增量,但在这里,值会跨越水平轴和垂直轴,但当向其他方向拖动刻度盘时,它们会缓慢增长。
在使用屏幕拖动位置计算旋转值时,是否有针对此类情况的推荐做法?
zAngle是用于旋转表盘的最终角度值,也将在一些夹紧后用于缩放模型,但这不是这里的要求。
public class CircularScaleDial : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
{
RectTransform rectTransform;
public GameObject model;
[SerializeField] Vector2 delta = Vector2.one;
[SerializeField] CanvasScaler canvasScaler;
private Vector3 startPosition;
[SerializeField] int zAngle;
Vector3 gd1 = Vector3.zero;
private void Awake()
{
rectTransform = GetComponent<RectTransform>();
}
public void OnBeginDrag(PointerEventData eventData)
{
startPosition = GetDelta_3(eventData);
}
int GetAngleFromPosition(Vector2 pos) {
var angleRadians = Mathf.Atan2(pos.y, pos.x);
var angleDegrees = angleRadians * Mathf.Rad2Deg;
return (int)angleDegrees;
}
Vector3 GetDelta_3(PointerEventData data)
{
Vector3 pos = new Vector3(data.position.x, data.position.y, 0);
Vector3 s2vp = Camera.main.ScreenToViewportPoint(pos);
return s2vp;
}
public void OnDrag(PointerEventData data)
{
if (data.dragging)
{
gd1 = GetDelta_3(data);
delta.x = gd1.x;
delta.y = gd1.y;
zAngle = GetAngleFromPosition(delta);
rectTransform.localRotation = Quaternion.Euler(new Vector3(0, 0, zAngle));
}
}
}
【问题讨论】: