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);
}
效果如下:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C#實現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法
這篇文章主要介紹了C#實現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法,其中包括了遍歷與遞歸的應用,需要的朋友可以參考下2014-08-08
C#實現(xiàn)定義一套中間SQL可以跨庫執(zhí)行的SQL語句(案例詳解)
這篇文章主要介紹了C#實現(xiàn)定義一套中間SQL可以跨庫執(zhí)行的SQL語句,主要包括hisql查詢樣例、group by查詢、鏈式查詢及hisql語句和鏈式查詢混用的sql語句,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07

