前言
一个Button的UI它自带一个OnClick事件的接口,如下所示:
那么,如何给一个非Button的UI也添加一个OnClick接口,例如,给一个Cube也增加这个功能:
或者当他被点击的时候,发送一个指定的消息,激活后面的流程。
一、如何在inspector面板上暴露一个function
解决之道:UnityEvent (1)引用UnityEvent
using UnityEngine.Events;
(2)定义一个public的UnityEvent对象
/// <summary>
/// 点击后响应的事件方法
/// </summary>
[Header("点击后要响应的事件")]
public UnityEvent clickAction;
二、响应mouse事件的接口有哪些?
(1)用 OnMouseDown/Up…(本文不作讨论) 特点:比较直观,但是只适用于鼠标键盘的环境,如果是VR或者一体机则失效 物体加上碰撞器组件。
(2)用Pointer 下面的 OnPointerDown/Up/Enter… 特点:从物体到UI,从PC到VR都适用
三、鼠标点击物体后,响应指定的方法
四、用Pointer相关接口与UI及物体交互时的配置注意事项
/*********************************************************************************************
* 1、[功能作用] 鼠标点击2D或者3D物体时,响应点击事件,invoke指定的方法或者发送一个定制的消息出来
* 2、[使用场合] 主要用于脚本解耦,举例:点击3D object【启动按钮】时,发送一个消息【启动@1号机器】,主流程收到该消息后,则启动【1号机器】
* 3、[适用对象]
* 3D物体,所有的都适用,注意碰撞组件的添加
* 2D物体:一共有三种布局方式,无论哪种布局方式,只要勾选[Raycast target]即可
* (1)、screen space - camera
* (2)、screen space - overlay
* (3)、world space
*
* 4、[实现原理] 继承Pointer相关Handler的接口,底层使用射线来进行碰撞侦测,好处:鼠标键盘或者VR头盔手柄都适用,2D或者3D的脚本都是一致的
* IPointerClickHandler -- OnPointerClick()
* IPointerDownHandler -- OnPointerDown()
* IPointerEnterHandler -- OnPointerEnter()
* IPointerExitHandler -- OnPointerExit()
* IPointerUpHandler -- OnPointerUp()
* 5、[配置组件]场景组件配置有下列4点注意事项
* 1、项目里务必存在 EventSystem 组件
* 2、3D 物体需要添加碰组件
* 3、UI 元素需要勾选[Raycast target],让射线可以侦测到它
* 4、特别重要:相机需要添加射线组件[PhysicsRaycaster],相机发射射线进行碰撞侦测
*********************************************************************************************
*/
附录:完整代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEngine.Events;
/// <summary>
/// 鼠标点击物体,发送指定的消息,或者调用指定的方法
/// </summary>
public class clickToSendMessage : MonoBehaviour,
IPointerDownHandler,
IPointerEnterHandler,
IPointerExitHandler
{
/*********************************************************************************************
* 1、[功能作用] 鼠标点击2D或者3D物体时,响应点击事件,invoke指定的方法或者发送一个定制的消息出来
* 2、[使用场合] 主要用于脚本解耦,举例:点击3D object【启动按钮】时,发送一个消息【启动@1号机器】,主流程收到该消息后,则启动【1号机器】
* 3、[适用对象]
* 3D物体,所有的都适用,注意碰撞组件的添加
* 2D物体:一共有三种布局方式,无论哪种布局方式,只要勾选[Raycast target]即可
* (1)、screen space - camera
* (2)、screen space - overlay
* (3)、world space
*
* 4、[实现原理] 继承Pointer相关Handler的接口,底层使用射线来进行碰撞侦测,好处:鼠标键盘或者VR头盔手柄都适用,2D或者3D的脚本都是一致的
* IPointerClickHandler -- OnPointerClick()
* IPointerDownHandler -- OnPointerDown()
* IPointerEnterHandler -- OnPointerEnter()
* IPointerExitHandler -- OnPointerExit()
* IPointerUpHandler -- OnPointerUp()
* 5、[配置组件]场景组件配置有下列4点注意事项
* 1、项目里务必存在 EventSystem 组件
* 2、3D 物体需要添加碰组件
* 3、UI 元素需要勾选[Raycast target],让射线可以侦测到它
* 4、特别重要:相机需要添加射线组件[PhysicsRaycaster],相机发射射线进行碰撞侦测
*********************************************************************************************
*/
/// <summary>
/// 消息内容:注意格式[消息头@参数1#参数2#...]
/// 消息内容举例:启动@1号引擎#前进 ——
/// </summary>
public string msg = "message@arg1";
/// <summary>
/// 点击后响应的事件方法
/// </summary>
[Header("点击后要响应的事件")]
public UnityEvent clickAction;
/// <summary>
/// 消息名称
/// </summary>
private string _msg;
/// <summary>
/// 消息参数
/// </summary>
private string _arg;
/// <summary>
/// 具体的Down逻辑
/// </summary>
public void PointerDown()
{
_msg = msg.Split('@')[0];
_arg = msg.Split('@')[1];
Debug.Log($"点了物体{this.name} from - <clickToSendMessage> - ");
MessageManager.SendMsg(_msg, _arg);
//Invoke指定的方法
if(clickAction != null)
{
clickAction.Invoke();
}
}
/// <summary>
/// Down事件
/// </summary>
/// <param name="eventData"></param>
public void OnPointerDown(PointerEventData eventData)
{
PointerDown();
}
/// <summary>
/// Enter事件
/// </summary>
/// <param name="eventData"></param>
public void OnPointerEnter(PointerEventData eventData)
{
//
}
/// <summary>
/// Exit事件
/// </summary>
/// <param name="eventData"></param>
public void OnPointerExit(PointerEventData eventData)
{
//
}
public void Test()
{
Debug.Log("unityEvent事件绑定指定的方法!");
}
}
|