欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【UGUI】侧面滑出的菜单栏,宽度自适应

程序员文章站 2022-05-30 17:38:11
...

首先看下项目效果

【UGUI】侧面滑出的菜单栏,宽度自适应

实现效果

【UGUI】侧面滑出的菜单栏,宽度自适应

发现实现效果并不难,利用动画(iTween)+UGUI 有一个长按的判断处理即可

附上项目和代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UICont : MonoBehaviour {
    public RectTransform mainUI;
    public Button showHideBtn;
    public RepeatButton dragBtn;

    private bool m_isShow = true;
   // public RectTransform 
	// Use this for initialization
	void Start () {
        dragBtn.onPress.AddListener(DragBtn);
        showHideBtn.onClick.AddListener(ShowHide);
	}
    void ShowHide() {
        Vector3 vec3Tmp = mainUI.position;
        if(m_isShow) {
            vec3Tmp.x = -mainUI.sizeDelta.x;
            iTween.MoveTo(mainUI.gameObject, vec3Tmp, 1f);
            m_isShow = false;
        } else {
            vec3Tmp.x = 0;
            iTween.MoveTo(mainUI.gameObject, vec3Tmp, 1f);
            m_isShow = true;
        }
    }
    void DragBtn() {
        Vector2 vec2Tmp = mainUI.sizeDelta;
        vec2Tmp.x = Mathf.Clamp(Input.mousePosition.x, 100, 500);
        mainUI.sizeDelta = vec2Tmp;
    }
	
	// Update is called once per frame
    //void Update () {
		
    //}
}
/*******
 * 
 * button长按的代理
 * http://blog.csdn.net/lyh916/article/details/51454673
 * 
 * 
 * */

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.Events;

public class RepeatButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler {

    public bool invokeOnce = false;//是否只调用一次
    private bool hadInvoke = false;//是否已经调用过

    public float interval = 0.1f;//按下后超过这个时间则认定为"长按"
    private bool isPointerDown = false;
    private float recordTime;

    public UnityEvent onDown = new UnityEvent();//按下时调用
    public UnityEvent onPress = new UnityEvent();//按住时调用
    public UnityEvent onRelease = new UnityEvent();//松开时调用

    void Start() {

    }

    void Update() {
        if (invokeOnce && hadInvoke)
            return;
        if (isPointerDown) {
            if ((Time.time - recordTime) > interval) {
                onPress.Invoke();
                hadInvoke = true;
            }
        }
    }

    public void OnPointerDown(PointerEventData eventData) {
        isPointerDown = true;
        recordTime = Time.time;
        onDown.Invoke();
    }

    public void OnPointerUp(PointerEventData eventData) {
        isPointerDown = false;
        hadInvoke = false;
        onRelease.Invoke();
    }

    public void OnPointerExit(PointerEventData eventData) {
        //isPointerDown = false;
        //hadInvoke = false;
        //onRelease.Invoke();
    }
}

最后附上demo:http://download.csdn.net/download/ldy597321444/10249594

效果地址:http://www.manew.com/thread-113570-1-1.html