unity实现UGUI的摇杆

游戏摇杆是一个比较常用的UI功能,通过摇杆的操作,获得UI界面输入的方向和力度。unity自身的UGUI 系统并没有自带这个输入空间。另外也有一些Unity摇杆插件(例如EasyTouch),但是引入第三方插件会新增许多不必要的代码,增加项目的复杂度。

GGUI实现摇杆功能也非常简单。主要思路是实现对摇杆的GameObject实现IPointerDownHandler,IPointerUpHandler,IDragHandler 三个接口,鼠标按下,拖动,弹起事件。根据得到的开始点位置和结束点位置计算方向向量。

UI界面结构

JoyStick对象作为摇杆的背景图片,Center对象作为摇杆的中心。把以下脚本挂载到JoyStick对象上,JoyStick对象接受事件输入。

摇杆代码

Joystick实现UGUI事件输入的三个接口,在OnDrag中计算起始点到结束的的方向单位向量moveDir中,摇杆的力度记录到moveLen(0-1)中。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

/// <summary>
/// UGUI游戏摇杆
/// </summary>
public class Joystick :MonoBehaviour ,IPointerDownHandler,IPointerUpHandler,IDragHandler
{

	public static Joystick Instance = null;

	public Transform centerTrans;
	public Vector2 moveDir=Vector2.zero;
	public float moveLen = 0;
	public bool isDraging = false;

	private float MaxMoveLen = 125;

	protected float mRadius=0f;

	void Awake(){
		Instance = this;
	}

	public  void Start()
	{
		//计算摇杆块的半径
		MaxMoveLen = (transform as RectTransform).sizeDelta.x * 0.5f;
	}

	public  void OnPointerDown(PointerEventData data){
		//Debug.Log ("OnBeginDrag");
		isDraging = true;
	}
	public  void OnDrag (PointerEventData eventData)
	{
		
		Vector2 v2Pos = eventData.position;
		Vector3 v3Pos= Camera.main.ScreenToWorldPoint(new Vector3(v2Pos.x,v2Pos.y,0f)); //屏幕坐标转世界坐标
		v3Pos.z = 0;
		Vector3 localPos = transform.worldToLocalMatrix.MultiplyPoint (v3Pos); //世界坐标 转本地坐标
		localPos.z = 0;

	
		moveDir.x = localPos.x;
		moveDir.y = localPos.y;
		moveDir.Normalize (); //摇杆方向

		float len = localPos.magnitude;
		if (len > MaxMoveLen)
			len = MaxMoveLen;

		moveLen = len / MaxMoveLen;  //摇杆力度

		Vector3 pointPos = localPos.normalized*len;
		centerTrans.localPosition = pointPos;
	}

	public  void OnPointerUp(PointerEventData data){
		//Debug.Log ("OnEndDrag");
		isDraging = false;
		centerTrans.localPosition = Vector3.zero;
	}
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注