生活随笔
收集整理的這篇文章主要介紹了
虚拟摇杆实现移动
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一.首先點(diǎn)擊UI創(chuàng)建兩個(gè)Image,將Image的Source Image改成自己想要的Texture即可,然后在Canvas下創(chuàng)建一空物體,將兩個(gè)Image放在空物體下作為他的子對(duì)象;
然后為可以拖動(dòng)的Image編寫腳本,腳本如下:(有注釋,就不多說(shuō)了)
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler//需要注意繼承的接口,接口內(nèi)的方法需要實(shí)現(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>
/// 虛擬搖桿的默認(rèn)位置
/// </summary>
private Vector2 originPosition;/// <summary>
/// 虛擬搖桿的移動(dòng)方向
/// </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>
/// 定義觸摸過(guò)程事件委托
/// </summary>
/// <param name="vec">虛擬搖桿的移動(dòng)方向</param>
public delegate void JoyStickTouchMove(Vector2 vec);/// <summary>
/// 定義觸摸結(jié)束事件委托
/// </summary>
public delegate void JoyStickTouchEnd();/// <summary>
/// 注冊(cè)觸摸開始事件
/// </summary>
public event JoyStickTouchBegin OnJoyStickTouchBegin;/// <summary>
/// 注冊(cè)觸摸過(guò)程事件
/// </summary>
public event JoyStickTouchMove OnJoyStickTouchMove;/// <summary>
/// 注冊(cè)觸摸結(jié)束事件
/// </summary>
public event JoyStickTouchEnd OnJoyStickTouchEnd;void Start()
{//初始化虛擬搖桿的默認(rèn)方向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)虛擬搖桿移動(dòng)到最大半徑時(shí)搖桿無(wú)法拖動(dòng)//為了確保被控制物體可以繼續(xù)移動(dòng)//在這里手動(dòng)觸發(fā)OnJoyStickTouchMove事件if (isTouched && touchedAxis.magnitude >= JoyStickRadius){if (this.OnJoyStickTouchMove != null)this.OnJoyStickTouchMove(TouchedAxis);}//松開虛擬搖桿后讓虛擬搖桿回到默認(rèn)位置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;
}
}
二.接下來(lái),就是拖拽p_w_picpath使物體能夠移動(dòng)了;
為該物體添加腳本:
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("正在移動(dòng)虛擬搖桿");//設(shè)置角色朝向Quaternion q = Quaternion.LookRotation(new Vector3(vec.x, 0, vec.y));transform.rotation = q;//移動(dòng)角色transform.Translate(Vector3.forward * 75f * Time.deltaTime);
}void OnJoyStickEnd()
{Debug.Log("觸摸移動(dòng)搖桿結(jié)束");}void OnGUI()
{GUI.Label(new Rect(30, 30, 200, 30), "3D模式下的虛擬搖桿測(cè)試");
}
}
三.接著可以試著運(yùn)行,可以看到物體可以隨著p_w_picpath的拖動(dòng)而移動(dòng),但是有不好的地方,就是拖拽的p_w_picpath超過(guò)半徑所設(shè)置的半徑JoyStickRadius時(shí),p_w_picpath的位置就會(huì)固定在一個(gè)位置不動(dòng),
總結(jié)
以上是生活随笔為你收集整理的虚拟摇杆实现移动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。