原文連結:http://blog.csdn.net/qinyuanpei/article/details/49510021
因為最近的項目要增加一個虛拟搖杆,然後檢視了一些相關資料後,就自己做了一個,分享出來:
隻有兩個腳本,一個是用來控制按鈕的,一個是用來被控制物體移動的腳本:
如下:
/*************************************************************************
* FileName: JoyStick.cs
* Author: LaiZhangYin(Eagle) Version: 1.0 Date: 6/12/2017
* if you have some question, please call
* QQ/Wechat : 782966734
*************************************************************************/
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.EventSystems;
public class JoyStick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
public float radius = 50.0f;
public float speed = 5.0f;
private RectTransform selfTransform;
private bool isTouched = false;
private Vector2 originPosition;
private Vector2 touchedAxis;
public Vector2 TouchedAxis
{
get
{
if (touchedAxis.magnitude < radius)
return touchedAxis.normalized / radius;
return touchedAxis.normalized;
}
}
public delegate void TouchBegin(Vector2 vec);
public delegate void TouchMove(Vector2 vec);
public delegate void TouchEnd();
public event TouchBegin Begin;
public event TouchMove Move;
public event TouchEnd End;
void Start()
{
selfTransform = this.GetComponent<RectTransform>();
originPosition = selfTransform.anchoredPosition;
}
public void OnPointerDown(PointerEventData eventData)
{
isTouched = true;
touchedAxis = GetAxis(eventData);
if (this.Begin != null)
this.Begin(TouchedAxis);
}
void Update()
{
if(isTouched && touchedAxis.magnitude >= radius)
{
if (this.Move != null)
this.Move(TouchedAxis);
}
if (selfTransform.anchoredPosition.magnitude > originPosition.magnitude)
selfTransform.anchoredPosition -= TouchedAxis * Time.deltaTime * speed;
}
private Vector2 GetAxis(PointerEventData eventData)
{
Vector3 worldPosition;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(selfTransform,
eventData.position, eventData.pressEventCamera, out worldPosition))
selfTransform.position = worldPosition;
Vector2 touchAxis = selfTransform.anchoredPosition - originPosition;
if(touchAxis.magnitude >= radius)
{
touchAxis = touchAxis.normalized * radius;
selfTransform.anchoredPosition = touchAxis;
}
return touchAxis;
}
public void OnPointerUp(PointerEventData eventData)
{
isTouched = false;
selfTransform.anchoredPosition = originPosition;
touchedAxis = Vector2.zero;
if (this.End != null)
this.End();
}
public void OnDrag(PointerEventData eventData)
{
touchedAxis = GetAxis(eventData);
if (this.Move != null)
this.Move(TouchedAxis);
}
}
/*************************************************************************
* FileName: JoyStickTest.cs
* Author: LaiZhangYin(Eagle) Version: 1.0 Date: 6/12/2017
* if you have some question, please call
* QQ/Wechat : 782966734
*************************************************************************/
using UnityEngine;
using System.Collections;
public class JoyStickTest : MonoBehaviour
{
public JoyStick js;
public Vector2 vec;
public float speed = 10.0f;
void Start()
{
vec = Vector2.right;
js.Begin += Begin;
js.Move += Move;
js.End += End;
}
void Update()
{
transform.Translate(vec * Time.deltaTime * speed);
}
private void Begin(Vector2 vec)
{
}
private void Move(Vector2 vec)
{
//規範化,避免數值過小暫停了
this.vec = vec.normalized;
}
private void End()
{
}
}
/*************************************************************************
* FileName: JoyStickTest.cs
* Author: LaiZhangYin(Eagle) Version: 1.0 Date: 6/12/2017
* if you have some question, please call
* QQ/Wechat : 782966734
*************************************************************************/
using UnityEngine;
using System.Collections;
public class JoyStickTest : MonoBehaviour
{
public JoyStick js;
public Vector2 vec;
public float speed = 10.0f;
void Start()
{
vec = Vector2.right;
js.Begin += Begin;
js.Move += Move;
js.End += End;
}
void Update()
{
transform.Translate(vec * Time.deltaTime * speed);
}
private void Begin(Vector2 vec)
{
}
private void Move(Vector2 vec)
{
//規範化,避免數值過小暫停了
this.vec = vec.normalized;
}
private void End()
{
}
void OnDestroy()
{
js.Begin -= Begin;
js.Move -= Move;
js.End -= End;
}
}
運作效果:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9UERPRTRq1UenpWTmZEWjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jN4ATNygjM1EjMxYDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)