【问题标题】:Circular Slider for Rotation in UnityUnity 中用于旋转的圆形滑块
【发布时间】: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));
        }
    }
}

【问题讨论】:

    标签: unity3d math


    【解决方案1】:

    它是用更简单的代码修复的。进行了其他调整,但这是主要的变化。这里的本质是解决沿 y 的增量。对于这种情况,我只使用 y 组件,但理想情况下,我们会使用两个值的点积来解析另一个值。

    public void OnBeginDrag(PointerEventData eventData)
    {
        startV2 = eventData.position;
    }
    
    public void OnDrag(PointerEventData data)
    {
        if (data.dragging)
        {
            endV2 = data.position;
            Vector2 deltaV2 = endV2 - startV2;
            deltaV2 = deltaV2.normalized;
            rectTransform.Rotate(new Vector3(0, 0, -deltaV2.y), Space.Self);
    
            startV2 = endV2;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2023-03-31
      • 1970-01-01
      • 2021-09-09
      • 2018-11-16
      相关资源
      最近更新 更多