UGUI 虚拟摇杆

3 篇文章 0 订阅
1 篇文章 0 订阅

简介

虚拟摇杆在手游中是重要组成部分,Unity的UGUI可很容易实现虚拟摇杆功能。大致分成三部分介绍。第一部分介绍如何通过UGUI实现虚拟摇杆功能。第二部分介绍如何通过虚拟摇杆控制物体移动和旋转。第三部分介绍如何用Entitas、Ecs框架结合JobSystem实现虚拟摇杆功能。

UGUI实现虚拟摇杆原理

  • 利用IBeginDragHandler,IDragHandler,IEndDragHandler接口实现对控件拖动事件的监听
  • 在OnDrag事件中利用函数RectTransformUtility.ScreenPointToLocalPointInRectangle设置拖拽位置

功能实现

  • 布局(最外层为panel,JoyStick为背景图片,Handle_Ridged为中间圆盘)
    在这里插入图片描述
  • 代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine; 
using UnityEngine.EventSystems;
using System;

[RequireComponent(typeof(RectTransform))]
public class JoyStickHandle : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler{

	public event Action OnBeginDragEvent = delegate {  }; 
	public event Action<Vector2> OnDragEvent = delegate(Vector2 vector2) {  };
	public event Action OnEndDragEvent = delegate {  };

	public RectTransform rtJoyStick;
	private Transform tfHandle;
	private float radius = 0f;
	private float limit = 0f;
	
	private Vector2 targetPos;

	public Vector2 TargetPos
	{
		get { return targetPos; }
		private set { }
	}

	// Use this for initialization
	void Start ()
	{
		tfHandle = this.GetComponent<RectTransform>();
		radius = (rtJoyStick.rect.xMax - rtJoyStick.rect.xMin) / 2;
		limit = radius * radius;
	}
	
	public void OnBeginDrag(PointerEventData eventData)
	{
		if (OnBeginDragEvent != null)
		{
			OnBeginDragEvent();
		}
	}

	public void OnDrag(PointerEventData eventData)
	{
		if (RectTransformUtility.ScreenPointToLocalPointInRectangle(rtJoyStick, eventData.position,
			eventData.pressEventCamera, out targetPos))
		{
			DealDragEvent();
		}
	}

	private void DealDragEvent()
	{
		if (targetPos.sqrMagnitude > limit)
		{
			targetPos = targetPos.normalized * radius;
		}
		tfHandle.localPosition = targetPos;
		if (OnDragEvent != null)
		{
			OnDragEvent(targetPos);
		}
	}

	public void OnEndDrag(PointerEventData eventData)
	{
		tfHandle.localPosition = Vector3.zero;
		targetPos = Vector2.zero;
		if (OnEndDragEvent != null)
		{
			OnEndDragEvent();
		}
	}
}

资源下载

https://download.csdn.net/download/eie08027/10750360

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值