原文链接: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;
}
}
运行效果: