一.首先點擊UI創(chuàng)建兩個Image,將Image的Source Image改成自己想要的Texture即可,然后在Canvas下創(chuàng)建一空物體,將兩個Image放在空物體下作為他的子對象;
遂溪網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),遂溪網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為遂溪數(shù)千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的遂溪做網(wǎng)站的公司定做!
然后為可以拖動的Image編寫腳本,腳本如下:(有注釋,就不多說了)
using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler//需要注意繼承的接口,接口內(nèi)的方法需要實現(xiàn) { /// <summary> /// 搖桿最大半徑 /// 以像素為單位 /// </summary> public float JoyStickRadius = 50; /// <summary> /// 搖桿重置所訴 /// </summary> public float JoyStickResetSpeed = 5.0f; /// <summary> /// 當(dāng)前物體的Transform組件 /// </summary> private RectTransform selfTransform; /// <summary> /// 是否觸摸了虛擬搖桿 /// </summary> private bool isTouched = false; /// <summary> /// 虛擬搖桿的默認位置 /// </summary> private Vector2 originPosition; /// <summary> /// 虛擬搖桿的移動方向 /// </summary> private Vector2 touchedAxis; public Vector2 TouchedAxis { get { if (touchedAxis.magnitude < JoyStickRadius) return touchedAxis.normalized / JoyStickRadius; return touchedAxis.normalized; } } /// <summary> /// 定義觸摸開始事件委托 /// </summary> public delegate void JoyStickTouchBegin(Vector2 vec); /// <summary> /// 定義觸摸過程事件委托 /// </summary> /// <param name="vec">虛擬搖桿的移動方向</param> public delegate void JoyStickTouchMove(Vector2 vec); /// <summary> /// 定義觸摸結(jié)束事件委托 /// </summary> public delegate void JoyStickTouchEnd(); /// <summary> /// 注冊觸摸開始事件 /// </summary> public event JoyStickTouchBegin OnJoyStickTouchBegin; /// <summary> /// 注冊觸摸過程事件 /// </summary> public event JoyStickTouchMove OnJoyStickTouchMove; /// <summary> /// 注冊觸摸結(jié)束事件 /// </summary> public event JoyStickTouchEnd OnJoyStickTouchEnd; void Start() { //初始化虛擬搖桿的默認方向 selfTransform = this.GetComponent<RectTransform>(); originPosition = selfTransform.anchoredPosition; } public void OnPointerDown(PointerEventData eventData) { isTouched = true; touchedAxis = GetJoyStickAxis(eventData); if (this.OnJoyStickTouchBegin != null) this.OnJoyStickTouchBegin(TouchedAxis); } public void OnPointerUp(PointerEventData eventData) { isTouched = false; selfTransform.anchoredPosition = originPosition; touchedAxis = Vector2.zero; if (this.OnJoyStickTouchEnd != null) this.OnJoyStickTouchEnd(); } public void OnDrag(PointerEventData eventData) { touchedAxis = GetJoyStickAxis(eventData); if (this.OnJoyStickTouchMove != null) this.OnJoyStickTouchMove(TouchedAxis); } void Update() { //當(dāng)虛擬搖桿移動到最大半徑時搖桿無法拖動 //為了確保被控制物體可以繼續(xù)移動 //在這里手動觸發(fā)OnJoyStickTouchMove事件 if (isTouched && touchedAxis.magnitude >= JoyStickRadius) { if (this.OnJoyStickTouchMove != null) this.OnJoyStickTouchMove(TouchedAxis); } //松開虛擬搖桿后讓虛擬搖桿回到默認位置 if (selfTransform.anchoredPosition.magnitude > originPosition.magnitude) selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * JoyStickResetSpeed; } /// <summary> /// 返回虛擬搖桿的偏移量 /// </summary> /// <returns>The joy stick axis.</returns> /// <param name="eventData">Event data.</param> private Vector2 GetJoyStickAxis(PointerEventData eventData) { //獲取手指位置的世界坐標(biāo) Vector3 worldPosition; if (RectTransformUtility.ScreenPointToWorldPointInRectangle(selfTransform, eventData.position, eventData.pressEventCamera, out worldPosition)) selfTransform.position = worldPosition; //獲取搖桿的偏移量 Vector2 touchAxis = selfTransform.anchoredPosition - originPosition; //搖桿偏移量限制 if (touchAxis.magnitude >= JoyStickRadius) { touchAxis = touchAxis.normalized * JoyStickRadius; selfTransform.anchoredPosition = touchAxis; } return touchAxis; } }
二.接下來,就是拖拽p_w_picpath使物體能夠移動了;
為該物體添加腳本:
using UnityEngine; using System.Collections; public class JoyStick3D : MonoBehaviour { private JoyStick js; void Start() { js = GameObject.FindObjectOfType<JoyStick>(); js.OnJoyStickTouchBegin += OnJoyStickBegin; js.OnJoyStickTouchMove += OnJoyStickMove; js.OnJoyStickTouchEnd += OnJoyStickEnd; } void OnJoyStickBegin(Vector2 vec) { Debug.Log("開始觸摸虛擬搖桿"); } void OnJoyStickMove(Vector2 vec) { Debug.Log("正在移動虛擬搖桿"); //設(shè)置角色朝向 Quaternion q = Quaternion.LookRotation(new Vector3(vec.x, 0, vec.y)); transform.rotation = q; //移動角色 transform.Translate(Vector3.forward * 75f * Time.deltaTime); } void OnJoyStickEnd() { Debug.Log("觸摸移動搖桿結(jié)束"); } void OnGUI() { GUI.Label(new Rect(30, 30, 200, 30), "3D模式下的虛擬搖桿測試"); } }
三.接著可以試著運行,可以看到物體可以隨著p_w_picpath的拖動而移動,但是有不好的地方,就是拖拽的p_w_picpath超過半徑所設(shè)置的半徑JoyStickRadius時,p_w_picpath的位置就會固定在一個位置不動,
而且當(dāng)在半徑范圍內(nèi)時,物體不會持續(xù)移動,這個就不好了,不知道有那位大神能夠邦杰呢?
網(wǎng)頁題目:Unity用UGUI做虛擬搖桿
URL標(biāo)題:http://aaarwkj.com/article34/jjghse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司、企業(yè)建站、微信公眾號、品牌網(wǎng)站設(shè)計、標(biāo)簽優(yōu)化、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)