Unity實現(xiàn)簡單虛擬搖桿
最近一直在倒騰用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,這樣的話上面的代碼是不能滿足要求的,花了一點時間才發(fā)現(xiàn)是這個原因,導致上面的代碼不適用的,最后把代碼重寫了一下,終于可以成功了!
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就知道坐標的偏移值了,看一下代碼應該都可以了解意思,這里就不過多的解釋了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C#將Sql數(shù)據(jù)保存到Excel文件中的方法
這篇文章主要介紹了C#將Sql數(shù)據(jù)保存到Excel文件中的方法,文中的ExportExcel可起到將sql數(shù)據(jù)導出為Excel的作用,需要的朋友可以參考下2014-08-08
C#抓取網頁數(shù)據(jù) 解析標題描述圖片等信息 去除HTML標簽
本文主要一步一步介紹利用C#抓取頁面數(shù)據(jù)的過程,抓取HTML,獲取標題、描述、圖片等信息,并去除HTML,希望對大家有所幫助。2016-04-04
C#利用IDbCommand實現(xiàn)通用數(shù)據(jù)庫腳本執(zhí)行程序
在.net 應用中,在數(shù)據(jù)庫中執(zhí)行腳本程序是經常用到的功能,如數(shù)據(jù)操作(新增、修改、刪除等),執(zhí)行一個存儲過程等,本文將介紹如何通過利用IDbCommand 實現(xiàn)通用數(shù)據(jù)庫腳本執(zhí)行程序,感興趣的朋友可以參考下2024-04-04

