Unity UI實(shí)現(xiàn)拖拽旋轉(zhuǎn)
本文實(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類繼承 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)前物體距離畫布左下角位置 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)和車把方向盤交互滾動(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)前物體距離畫布左下角位置 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)文章
Unity之Luaframework框架lua調(diào)用C#方法
這篇文章主要介紹了Unity之Luaframework框架lua調(diào)用C#方法,在這里需要寫一個(gè)C#腳本,腳本里寫方法需要在lua中調(diào)用,具體實(shí)例代碼參考下本文吧2021-09-09C#實(shí)現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法
這篇文章主要介紹了C#實(shí)現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法,其中包括了遍歷與遞歸的應(yīng)用,需要的朋友可以參考下2014-08-08C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實(shí)例
這篇文章主要介紹了C#導(dǎo)入導(dǎo)出EXCEL文件代碼實(shí)例,代碼的流程和方法都很詳細(xì),需要的朋友可以參考下2014-04-04基于Unity3D實(shí)現(xiàn)仿真時(shí)鐘詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Unity3D模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單是時(shí)鐘效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-01-01C#實(shí)現(xiàn)定義一套中間SQL可以跨庫(kù)執(zhí)行的SQL語(yǔ)句(案例詳解)
這篇文章主要介紹了C#實(shí)現(xiàn)定義一套中間SQL可以跨庫(kù)執(zhí)行的SQL語(yǔ)句,主要包括hisql查詢樣例、group by查詢、鏈?zhǔn)讲樵兗癶isql語(yǔ)句和鏈?zhǔn)讲樵兓煊玫膕ql語(yǔ)句,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07C#實(shí)現(xiàn)的SN快速輸入工具實(shí)例
這篇文章主要介紹了C#實(shí)現(xiàn)的SN快速輸入工具,以實(shí)例的形式詳細(xì)講述了C#實(shí)現(xiàn)序列號(hào)快速輸入的方法,是非常實(shí)用的技巧,需要的朋友可以參考下2014-11-11