Drag and release the fly-away trigger button (on-the-fly button)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using DG.Tweening;

public class FlyBtnScript : MonoBehaviour
{
    
    
    /// <summary>
    /// 拖拽时按钮最大位移距离
    /// </summary>
    [Tooltip(" 拖拽时按钮最大位移距离")]
    public float MaxDragPosition = 500;

    /// <summary>
    /// 放开时最小起可飞距离
    /// </summary>
    [Tooltip(" 放开时最小起可飞距离")]
    public float CanFlyDistance = 300;

    /// <summary>
    /// 按钮起飞后触发距离
    /// </summary>
    [Tooltip(" 按钮起飞后触发距离")]
    public float Bnt_TakeEffectDistance = 2000;


    public String Msg;


    [HideInInspector]
    public Button Btn;
    [HideInInspector]
    public EventTrigger eventTrigger;
    [HideInInspector]
    public Vector3 AwakePoint;
    [HideInInspector]
    public Vector3 StartPoint;
    [HideInInspector]
    public Vector3 EndPoint;
    [HideInInspector]
    public bool IsDown;
    [HideInInspector]
    public bool CanMove;

    private void Awake()
    {
    
    
        //AwakePoint = transform.position;
        AwakePoint = new Vector3(0.0F, 1.0F, 90.0F);
        print(AwakePoint);
    }
    // Start is called before the first frame update
    void Start()
    {
    
    
        Btn = transform.GetComponent<Button>();
        eventTrigger = transform.GetComponent<EventTrigger>();
        if (eventTrigger == null)
        {
    
    
            eventTrigger = gameObject.AddComponent<EventTrigger>();
        }
        AddPointerEvent(eventTrigger, EventTriggerType.PointerDown, PointDown);
        AddPointerEvent(eventTrigger, EventTriggerType.PointerEnter, PointerEnter);
        AddPointerEvent(eventTrigger, EventTriggerType.PointerUp, PointUp);
    }

    private void PointerEnter(BaseEventData arg0)
    {
    
    
       
    }

    private void PointUp(BaseEventData arg0)
    {
    
    
        print("transform.localPosition.y:" + transform.localPosition.y);
        if (transform.localPosition.y > CanFlyDistance)
        {
    
    
            Debug.Log("PointUp:" + transform.name);
            EndPoint =Input.mousePosition;
            float D = (EndPoint - StartPoint).magnitude;
            //print(D);
            if (D > 200)
            {
    
    
                CanMove = true;
            }
            else
            {
    
    
                print("D "+D);
                transform.DOMove(AwakePoint, 0.5f);
            }
        }
        else
        {
    
    
            transform.DOMove(AwakePoint, 0.5f);
        }
        IsDown = false;
    }

    private Vector3 distance;
    private void PointDown(BaseEventData arg0)
    {
    
    
        //Debug.Log("PointDown" + transform.name);
        StartPoint = Input.mousePosition;
        distance = transform.localPosition - Input.mousePosition;
        IsDown = true;
    }

    // Update is called once per frame
    void Update()
    {
    
    
        if (IsDown)
        {
    
    
            if (Vector3.Distance(Input.mousePosition, StartPoint)> MaxDragPosition)
            {
    
    
                //print(Vector3.Distance(Input.mousePosition, StartPoint));
                Vector3 point = ((Input.mousePosition - AwakePoint)) + AwakePoint;
                transform.localPosition = point+distance;
            }
            else
            {
    
    
                Vector3 mousePositionOnScreen = Input.mousePosition + distance;
                transform.localPosition = mousePositionOnScreen;
            }
        }
        if (CanMove)
        {
    
    
            //print("CanMove");
            transform.Translate((EndPoint - StartPoint).normalized*10);
            if ((transform.position - AwakePoint).magnitude > Bnt_TakeEffectDistance)
            {
    
    
                //print()
                Invok();
                CanMove = false;
                //transform.localPosition = AwakePoint;
            }
        }
       
    }

    public void Invok()
    {
    
    
        //print("触发");

        SendNetWorkMessage.Instance.SocketSendMessage(Msg);

        MessageManager1.Instance.SendMsgToOtherScreen(Msg);

        PageManager.Instance.ShowOnePage(2);

        Page2Script.Instance.ShowOneTittle(transform.GetSiblingIndex());
    }

    

    /// <summary>
    /// 为EventTrigger注册事件
    /// </summary>
    /// <param name="eventTrigger">需要添加事件的EventTrigger</param>
    /// <param name="eventTriggerType">事件类型</param>
    /// <param name="callback">回调函数</param>
    void AddPointerEvent(EventTrigger eventTrigger, EventTriggerType eventTriggerType, UnityEngine.Events.UnityAction<BaseEventData> callback)
    {
    
    
        EventTrigger.Entry entry = new EventTrigger.Entry();
        entry.eventID = eventTriggerType;
        entry.callback = new EventTrigger.TriggerEvent();
        entry.callback.AddListener(callback);
        eventTrigger.triggers.Add(entry);
        //Debug.Log("AddPointerEnterEvent");
    }
}

Guess you like

Origin blog.csdn.net/weixin_45023328/article/details/121902217