最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity UI實現(xiàn)拖拽旋轉

 更新時間:2021年06月06日 17:11:01   作者:ᴸᴵᴬᴺᴳᴬᴬ  
這篇文章主要為大家詳細介紹了Unity UI實現(xiàn)拖拽旋轉,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Unity UI實現(xiàn)拖拽旋轉的具體代碼,供大家參考,具體內容如下

跟隨鼠標旋轉

第一種效果是跟隨鼠標旋轉,原理是計算下鼠標位置與拖拽物體的相對位移

旋轉方向即可

注意轉換對應空間坐標

新建腳本mono類繼承 IBeginDragHandler, IDragHandler, IEndDragHandler 接口

[SerializeField] private Canvas m_Canvas;
    
    private Vector3? CalculateWorldToScreenPos(Vector3 worldPos)
    {
        if (m_Canvas.renderMode == RenderMode.ScreenSpaceCamera)
        {
            return m_Canvas.worldCamera.WorldToScreenPoint(worldPos);
        }
        else if (m_Canvas.renderMode == RenderMode.ScreenSpaceOverlay)
        {
            Vector3 screenPos = m_Canvas.transform.InverseTransformPoint(worldPos);
            var rectTrans = m_Canvas.transform as RectTransform;
            screenPos.x += rectTrans.rect.width * 0.5f * rectTrans.localScale.x;
            screenPos.y += rectTrans.rect.height * 0.5f * rectTrans.localScale.y;
            return screenPos;
        }

        return null;
    }
    
    public void OnDrag(PointerEventData eventData)
    {
        if (eventData.button != PointerEventData.InputButton.Left) return;
        
        //計算當前物體距離畫布左下角位置
        Vector3? curScreenPos = CalculateWorldToScreenPos(transform.position);
        if (curScreenPos == null) return;
        //鼠標位置偏移量
        Vector2 offset = eventData.position - (Vector2)curScreenPos.Value;
        if (offset != Vector2.zero)
        {
            transform.rotation = Quaternion.FromToRotation(Vector3.up, offset);
        }
    }

設置下箭頭錨點

效果如下:

手指拖拽旋轉

第二種是根據(jù)旋轉速度來旋轉UI 可以實現(xiàn)一些齒輪交互滾動和車把方向盤交互滾動

//旋轉速度
[SerializeField] private float m_RotateSpeed;
    
    public void OnDrag(PointerEventData eventData)
    {
        if (eventData.button != PointerEventData.InputButton.Left) return;

        //手指滑動偏移量
        Vector2 mouseXY = eventData.delta;
        mouseXY *= m_RotateSpeed;

        //計算當前物體距離畫布左下角位置
        Vector3? curScreenPos = CalculateWorldToScreenPos(transform.position);
        if (curScreenPos == null) return;
        //手指位置偏移量
        Vector2 offset = eventData.position - (Vector2)curScreenPos.Value;

        float value;
        if (Mathf.Abs(mouseXY.x) > Mathf.Abs(mouseXY.y)) // 判斷水平滑動還是垂直滑動
        {
            //手指往水平滑動   下面旋轉跟隨偏移參數(shù)  上面與偏移參數(shù)相反
            value = mouseXY.x * Mathf.Sign(-offset.y);
        }
        else
        {
            //手指垂直滑動    右邊跟隨偏移參數(shù)    左邊與偏移參數(shù)相反
            value = mouseXY.y * Mathf.Sign(offset.x);
        }

        transform.Rotate(Vector3.forward, value, Space.Self);

    }

效果如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

最新評論

五台县| 肇庆市| 新龙县| 屏东县| 龙南县| 密山市| 乌兰察布市| 东城区| 扎赉特旗| 鹤峰县| 湄潭县| 曲阳县| 唐海县| 九台市| 合山市| 大渡口区| 宜川县| 聂荣县| 阿克苏市| 临泽县| 曲靖市| 新兴县| 莱芜市| 化德县| 新竹县| 应城市| 泗阳县| 天津市| 海晏县| 茶陵县| 西城区| 霍林郭勒市| 屯昌县| 丰台区| 虹口区| 云阳县| 滦南县| 繁峙县| 长治县| 麻城市| 瑞安市|