因为 UI Tookit 自带的PointerUpEvent和PointerMoveEvent只能在点击区域内相应,快速移动或者限制UI移动范围会导致断触,随手用协程鼓捣了,现版本的EventSystem和Uitookit联系的还很不完善,谁有好的方法指教一下。
public class JoyDrag: MonoBehaviour
{
private VisualElement _mVisualElement;
private Vector2 _pos;
private bool _canMove;
private Vector2 _diff;
private Coroutine _corMove;
private Vector3 _initialPosition;
public int radio;
void Start()
{
UIDocument document = GetComponent<UIDocument>();
var root = document.rootVisualElement;
_mVisualElement = root.Q<VisualElement>("Point");
_initialPosition = _mVisualElement.transform.position;
_mVisualElement.RegisterCallback<PointerDownEvent>(OnPointerDown);
}
private void OnPointerDown(PointerDownEvent evt)
{
//在这里处理按下鼠标时的操作
Vector2 mousePosition = Mouse.current.position.ReadValue();
_pos = RuntimePanelUtils.ScreenToPanel(_mVisualElement.panel, new Vector2(mousePosition.x, Screen.height - mousePosition.y));
_canMove = true;
_diff = _pos - (Vector2)_mVisualElement.transform.position;
_corMove=StartCoroutine("Move");
}
IEnumerator Move()
{
while (Mouse.current.leftButton.isPressed)
{
//在这里处理按下鼠标并拖拽时的操作
Vector2 mousePosition = Mouse.current.position.ReadValue();
_pos = RuntimePanelUtils.ScreenToPanel(_mVisualElement.panel, new Vector2(mousePosition.x, Screen.height - mousePosition.y));
if (_canMove)
{
_pos.x -= _diff.x;
_pos.y -= _diff.y;
_pos = Vector2.ClampMagnitude(_pos, radio);
_mVisualElement.transform.position = _pos;
}
yield return null;
}
//在这里处理松开鼠标时的操作
_canMove = false;
_mVisualElement.transform.position = _initialPosition;
}
}
UItookit 简易摇杆