UGUI 自定义摇杆

自定义一个虚拟摇杆,具体需要是:1、未点击时中心的小圆点隐藏 2、点击透明背景范围内时操作栏移动到点击位置 3、拖拽小圆点输出拖拽方向 4、松开时操作栏复位,小圆点隐藏
一、UI制作
1、创建一个Joystick的背景透明的Image,作为点击的范围
2、创建Joystick下创建一个子物体TouchBg,作为操作栏
3、创建TouchBg下创建一个子物体TouchPoint
UGUI 自定义摇杆_第1张图片

二、创建脚本Joystick附加在Joystick物体上,继承ScrollRect,将TouchPoint赋值给Content参数,将TouchBg赋值给ViewPort参数
UGUI 自定义摇杆_第2张图片

三、编写Joystick脚本

/********************************************************************
    文件:Joystick.cs
    作者:Panngdudu
    日期:2020/12/19
    描述: 虚拟摇杆功能
*********************************************************************/

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

public class Joystick : ScrollRect, IPointerDownHandler, IPointerUpHandler, IDragHandler
{
    public GameObject touchBgGo;
    public GameObject touchPointGo;

    //事件触发的回调
    public Action onDragCallback;//拖拽事件的回调,参数1:方向

    protected float radius = 100;

    protected override void Start()
    {
        radius = touchPointGo.GetComponent().sizeDelta.x * 0.7f;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        touchPointGo.SetActive(true);
        touchBgGo.transform.position = eventData.position;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        touchPointGo.SetActive(false);
        touchBgGo.transform.localPosition = Vector2.zero;
    }

    public void OnDrag(PointerEventData eventData)
    {
        base.OnDrag(eventData);
        var contentPos = this.content.anchoredPosition;
        if (contentPos.magnitude > radius)
        {
            contentPos = contentPos.normalized * radius;
            SetContentAnchoredPosition(contentPos);
        }

        onDragCallback?.Invoke(contentPos.normalized);
    }
}

gitee地址:https://gitee.com/pangdudu010...

你可能感兴趣的:(unity)