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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

虚拟摇杆实现移动

發(fā)布時(shí)間:2023/12/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 虚拟摇杆实现移动 小編覺(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ò),歡迎將生活随笔推薦給好友。