创新项目实训学习笔记-Unity-7
UI的学习和使用
前两篇博客中我们讲到了按钮的创建以及基本的使用方法,这次我们学习一下按钮的进阶使用方法。
Button的进阶使用
本次学习重点放在了按钮双击触发事件以及长按按钮触发事件。
首先我们为按钮添加脚本名为click_event ,同时将以下代码写进脚本中
(注意,不要忘记引用UnityEngine.Events和UnityEngine.EventSystems)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
public class click_event : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler
{
public float pressDurationTime = 1;
public bool responseOnceByPress = false;
public float doubleClickIntervalTime = 0.5f;
public UnityEvent onDoubleClick;
public UnityEvent onPress;
public UnityEvent onClick;
private bool isDown = false;
private bool isPress = false;
private float downTime = 0;
private float clickIntervalTime = 0;
private int clickTimes = 0;
void Update()
{
if (isDown)
{
if (responseOnceByPress && isPress)
{
return;
}
downTime += Time.deltaTime;
if (downTime > pressDurationTime)
{
isPress = true;
onPress.Invoke();
}
}
if (clickTimes >= 1)
{
clickIntervalTime += Time.deltaTime;
if (clickIntervalTime >= doubleClickIntervalTime)
{
if (clickTimes >= 2)
{
onDoubleClick.Invoke();
}
else
{
onClick.Invoke();
}
clickTimes = 0;
clickIntervalTime = 0;
}
}
}
public void OnPointerDown(PointerEventData eventData)
{
isDown = true;
downTime = 0;
}
public void OnPointerUp(PointerEventData eventData)
{
isDown = false;
}
public void OnPointerExit(PointerEventData eventData)
{
isDown = false;
isPress = false;
}
public void OnPointerClick(PointerEventData eventData)
{
if (!isPress)
{
//onClick.Invoke();
clickTimes += 1;
}
else
isPress = false;
}
}
下方链接为文章中代码的原地址出处
学习文章地址
保存后,回到unity中,我们发现该组件的界面发生了变化
类似于前面的文章中提到的方法,我们在场景中创建一个空物体为click_test,并为其添加一个同名脚本
对该脚本进行编辑,分别编写三个类用于测试我们刚刚写好的代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class click_test : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void OneClick()
{
Debug.Log("单击");
}
public void DoubleClick()
{
Debug.Log("双击");
}
public void Press()
{
Debug.Log("长按");
}
}
同时使用之前提到过的方法将相对应的方法绑定到对应的事件上
运行并进行测试
- 单击
在相隔一段时间后点击两次按钮,消息提示两次单击 - 双击
在快速点击按钮两次后,提示双击并且没有单击提示- 长按
在长按一秒后,则出现了无数条长按的消息,说明该方法被调用了无数次,如果我们想长按只调用一次的话,需要将该组件上的responseOnceByPress勾选
将消息清空后再次尝试,该方法只调用了一次