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類(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)文章
C# WinForm開(kāi)發(fā)中使用XML配置文件實(shí)例
這篇文章主要介紹了C# WinForm開(kāi)發(fā)中使用XML配置文件實(shí)例,本文詳細(xì)講解了如何使用一個(gè)XML文件作為WinForm的配置文件,需要的朋友可以參考下2014-08-08
c# socket網(wǎng)絡(luò)編程接收發(fā)送數(shù)據(jù)示例代碼
這篇文章主要介紹了c# socket網(wǎng)絡(luò)編程,server端接收,client端發(fā)送數(shù)據(jù),大家參考使用吧2013-12-12
利用WCF雙工模式實(shí)現(xiàn)即時(shí)通訊
這篇文章主要介紹了利用WCF雙工模式實(shí)現(xiàn)即時(shí)通訊的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09
WinForm實(shí)現(xiàn)鼠標(biāo)拖動(dòng)控件跟隨效果
這篇文章主要為大家詳細(xì)介紹了WinForm實(shí)現(xiàn)鼠標(biāo)拖動(dòng)控件跟隨效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
使用 BenchmarkDotNet 對(duì) C# 代碼進(jìn)行基準(zhǔn)測(cè)試
這篇文章主要介紹了使用 BenchmarkDotNet 對(duì) C# 代碼進(jìn)行基準(zhǔn)測(cè)試,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C#使用讀寫(xiě)鎖解決多線程并發(fā)問(wèn)題
本文詳細(xì)講解了C#使用讀寫(xiě)鎖解決多線程并發(fā)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04

