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

Unity UI實(shí)現(xiàn)拖拽旋轉(zhuǎn)

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

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

跟隨鼠標(biāo)旋轉(zhuǎn)

第一種效果是跟隨鼠標(biāo)旋轉(zhuǎn),原理是計(jì)算下鼠標(biāo)位置與拖拽物體的相對(duì)位移

旋轉(zhuǎn)方向即可

注意轉(zhuǎn)換對(duì)應(yīng)空間坐標(biāo)

新建腳本mono類(lèi)繼承 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;
        
        //計(jì)算當(dāng)前物體距離畫(huà)布左下角位置
        Vector3? curScreenPos = CalculateWorldToScreenPos(transform.position);
        if (curScreenPos == null) return;
        //鼠標(biāo)位置偏移量
        Vector2 offset = eventData.position - (Vector2)curScreenPos.Value;
        if (offset != Vector2.zero)
        {
            transform.rotation = Quaternion.FromToRotation(Vector3.up, offset);
        }
    }

設(shè)置下箭頭錨點(diǎn)

效果如下:

手指拖拽旋轉(zhuǎn)

第二種是根據(jù)旋轉(zhuǎn)速度來(lái)旋轉(zhuǎn)UI 可以實(shí)現(xiàn)一些齒輪交互滾動(dòng)和車(chē)把方向盤(pán)交互滾動(dòng)

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

        //手指滑動(dòng)偏移量
        Vector2 mouseXY = eventData.delta;
        mouseXY *= m_RotateSpeed;

        //計(jì)算當(dāng)前物體距離畫(huà)布左下角位置
        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)) // 判斷水平滑動(dòng)還是垂直滑動(dòng)
        {
            //手指往水平滑動(dòng)   下面旋轉(zhuǎn)跟隨偏移參數(shù)  上面與偏移參數(shù)相反
            value = mouseXY.x * Mathf.Sign(-offset.y);
        }
        else
        {
            //手指垂直滑動(dòng)    右邊跟隨偏移參數(shù)    左邊與偏移參數(shù)相反
            value = mouseXY.y * Mathf.Sign(offset.x);
        }

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

    }

效果如下:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

子长县| 红安县| 通化县| 自贡市| 温州市| 永德县| 金山区| 遂昌县| 张掖市| 阿鲁科尔沁旗| 平罗县| 呼和浩特市| 浪卡子县| 宝坻区| 辽中县| 紫阳县| 大厂| 藁城市| 灵台县| 武宣县| 信宜市| 如东县| 嘉峪关市| 大足县| 西乡县| 云林县| 德钦县| 海南省| 洮南市| 同仁县| 海阳市| 定边县| 灵宝市| 靖边县| 醴陵市| 加查县| 垣曲县| 炉霍县| 南昌县| 砚山县| 琼中|