2020.02.12 重写了,代码有注释,结构更简单,也有源工程:Unity - UGUI快速制作虚拟摇杆 - 移动方向摇杆
代码:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
///
/// author : jave.lin
/// date : 2017-12-26
///
namespace Assets.Scripts.InputSimulater
{
class InputSimulaterCtrl :
MonoBehaviour,
IPointerDownHandler,
IPointerUpHandler,
IDragHandler,
IEndDragHandler
{
public RawImage m_pTouchBg;
public RawImage m_pTouchTracker;
public float m_fDeadZone = 0.2f;
private float _m_fLimitRadius;
private Vector3 _m_vMsDownBgPos;
private Vector2 _m_vMsDownBgPosHelper;
public Vector2 offset
{
get
{
return m_pTouchTracker.transform.localPosition.normalized;
}
}
private void _resetAlpha( float a )
{
var c = m_pTouchTracker.color;
c.a = a;
m_pTouchTracker.color = c;
}
private void _resetPos()
{
m_pTouchTracker.transform.localPosition = m_pTouchBg.transform.localPosition;
}
void Start()
{
_m_fLimitRadius = m_pTouchBg.rectTransform.rect.width * 0.5f;
_resetAlpha(0.2f);
}
void Update()
{
//Debug.Log( "offset:" + offset );
}
public void OnPointerDown(PointerEventData eventData)
{
_m_vMsDownBgPos = m_pTouchBg.transform.TransformPoint(0, 0, 0);
_m_vMsDownBgPosHelper.Set(_m_vMsDownBgPos.x, _m_vMsDownBgPos.y);
_resetAlpha(1f);
}
public void OnPointerUp(PointerEventData eventData)
{
_resetAlpha(0.2f);
}
public void OnDrag(PointerEventData eventData)
{
var pos = eventData.position - _m_vMsDownBgPosHelper;
var mag = pos.magnitude ;
if ((mag / _m_fLimitRadius) > m_fDeadZone)
{
if (mag > _m_fLimitRadius)
{
pos = pos.normalized * _m_fLimitRadius;
}
if (!pos.Equals(m_pTouchTracker.transform.localPosition))
{
m_pTouchTracker.transform.localPosition = pos;
}
}
else
{
_resetPos();
}
}
public void OnEndDrag(PointerEventData eventData)
{
_resetPos();
}
}
}
#运行效果