Unity的虚拟摇杆
生活随笔
收集整理的這篇文章主要介紹了
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的虚拟摇杆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Ansys Workbench】—响应
- 下一篇: Linux之忘记密码解决方案