日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity的虚拟摇杆

發布時間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity的虚拟摇杆 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近一直在倒騰用UGUI做虛擬搖桿,網上普遍的的做法就是使用以下的代碼,但是這個有些注意事項,第一點就是Canvas的Render Mode必須是Screen Space Overlay,第二點就是掛載這個腳本的錨點的x,y必須是0.5,如圖下:

using UnityEngine; using UnityEngine.EventSystems; public class JoyStick : MonoBehaviour, IDragHandler, IEndDragHandler {Transform point;Vector3 startPos;//開始位置Vector3 dir;//方向float radius = 0;//需要移動的半徑void Start(){point = transform.GetChild(0);radius = (transform as RectTransform).sizeDelta.x * 0.5f;startPos = point.position;}public void OnDrag(PointerEventData eventData){point.position = eventData.position;dir = (point.position - startPos).normalized;if (Vector3.SqrMagnitude(point.position - startPos) > radius * radius)point.position = startPos + dir * radius;}public void OnEndDrag(PointerEventData eventData){point.localPosition = Vector3.zero;} }

?如果Canvas的Render Mode是Screen Space Camera,這樣的話上面的代碼是不能滿足要求的,花了一點時間才發現是這個原因,導致上面的代碼不適用的,最后把代碼重寫了一下,終于可以成功了!

public class JoyStick : MonoBehaviour, IDragEvent {private Canvas canvas;private RectTransform rectTransform;//坐標private static Quaternion amendAngle;private static float mRadius = 0,v=0, h=0;private static Transform point;private static Vector3 initPos;private static Vector2 startPos;private void Start(){point = transform.GetChild(0);canvas = GameObject.Find("UIRoot").GetComponent<Canvas>();rectTransform = transform as RectTransform; //也可以寫成this.GetComponent<RectTransform>(),但是不建議;mRadius = (transform as RectTransform).sizeDelta.x * 0.5f;initPos = point.localPosition;h = v = 0;}public void OnBeginDrag(PointerEventData eventData){RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, canvas.worldCamera, out startPos);startPos = eventData.position - startPos;h = v = 0; }public void OnDrag(PointerEventData eventData){point.localPosition = eventData.position - startPos;Vector3 dir = (point.localPosition - initPos).normalized;v = dir.normalized.x; h = dir.normalized.y;if (Vector3.SqrMagnitude(point.localPosition - initPos) > mRadius * mRadius)point.localPosition = initPos + dir * mRadius;}public void OnEndDrag(PointerEventData eventData){point.localPosition = Vector3.zero;h = v = 0; } }

?RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, canvas.worldCamera, out startPos)這個的startPos返回的是點擊屏幕的坐標,rectTransform是這個腳本掛載物體上的RectTransform的組件,然后減去eventData.position就知道坐標的偏移值了,看一下代碼應該都可以了解意思,這里就不過多的解釋了。

總結

以上是生活随笔為你收集整理的Unity的虚拟摇杆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。