Skip to content

事件触发组件

事件回调函数绑定(NEventTrigger)

属性面板介绍

alt text

  • PointerEnter:当指针(鼠标或触摸)首次进入 UI 元素的可交互区域时触发。
  • PointerExit:当指针离开 UI 元素的可交互区域时触发。
  • PointerDown:当指针在 UI 元素上按下时触发。
  • PointerUp:当指针在 UI 元素上释放时触发。
  • PointerClick:完整的点击事件(包含按下和释放)。
  • BeginDrag:当开始拖拽操作时触发。
  • Dragging:在拖拽过程中持续触发。
  • EndDrag:当拖拽操作结束时触发。
  • PointerStay:- 当指针停留在 UI 元素上时持续触发。

NEventTrigger

NEventTrigger 是引擎中一个专门用于管理事件触发的组件。它允许开发者为不同的控件(如按钮、滑动条、面板,模型等)添加事件处理逻辑。通过NEventTrigger,你可以为控件设置多种类型的输入事件,诸如点击、悬停、拖动等。

接口返回值说明
SetPointerEnterHandlervoid设置选中事件回调函数
SetPointerExitHandlervoid设置移出事件回调函数
SetPointerDownHandlervoid设置按下事件回调函数
SetPointerUpHandlervoid设置抬起事件回调函数
SetPointerClickHandlervoid设置点击事件回调函数
SetBeginDragHandlervoid设置开始拖拽事件回调函数
SetDragHandlervoid设置拖拽事件回调函数
SetEndDragHandlervoid设置结束拖拽事件回调函数

事件回调函数绑定

void SetPointerEnterHandler(const NInputEventHandler& handler);
void SetPointerExitHandler(const NInputEventHandler& handler);
void SetPointerDownHandler(const NInputEventHandler& handler);
void SetPointerUpHandler(const NInputEventHandler& handler);
void SetPointerClickHandler(const NInputEventHandler& handler);
void SetBeginDragHandler(const NInputEventHandler& handler);
void SetDragHandler(const NInputEventHandler& handler);
void SetEndDragHandler(const NInputEventHandler& handler);
void SetPointerStayHandler(const NInputEventHandler& handler);

参数:
handler:事件回调函数要绑定的函数句柄

描述:
事件回调触发,需要一些条件,首先场景中需要有EventSystem控件,这个控件是控制着场景中所有物体的事件系统,然后就是控件是可交互的控件。如果是模型控件还需要在MainCamera上挂载物理射线拾取组件NPhysicsRaycaster,同时模型控件还需要添加碰撞盒。

  • 当射线移入控件时会触发SetPointerEnterHandler绑定的回调函数
  • 当射线移出控件时会触发SetPointerExitHandler绑定的回调函数
  • 当按下确认键时会触发SetPointerDownHandler绑定的回调函数
  • 当抬起按下事件时会触发SetPointerUpHandler绑定的回调函数
  • 当点击控件时会触发SetPointerClickHandler绑定的回调函数
  • 当开始拖拽控件时会触发SetBeginDragHandler绑定的回调函数
  • 在拖拽过程中会触发SetDragHandler绑定的回调函数
  • 当拖拽结束时会触发SetEndDragHandler绑定的回调函数

代码示例1:

cpp
先是添加要绑定的回调函数
#pragma once
#include "Apis/NComponent.h"
#include "Event/NEventTrigger.h"
ENGINE_NAMESPACE_BEGIN
#define NImageViewTest_API DLLEXPORT
OBJECT_CLASS(NImageViewTest)
class NImageViewTest_API NImageViewTest : public NComponent
{
DECLARE_CLASS(NImageViewTest, NComponent)
DECLARE_RTTI
ENABLE_REFLECTION
public:
NImageViewTest() = default;
virtual ~NImageViewTest() = default;
virtual void Start() override;
virtual void Update() override;
virtual void OnDestroy() override;
virtual void PostEditChangeProperty(std::string& propertyName) override;
virtual void Serialize(Archive& ar) override;
virtual void LateDeserialize(Archive& ar) override;
protected:
    void OnPointerEnter(const NInputPointerEventData& data);
    void OnPointerExit(const NInputPointerEventData& data);
    void OnPointerDown(const NInputPointerEventData& data);
    void OnPointerUp(const NInputPointerEventData& data);
    void OnPointerClick(const NInputPointerEventData& data);
    void OnBeginDrag(const NInputPointerEventData& data);
    void OnDrag(const NInputPointerEventData& data);
    void OnEndDrag(const NInputPointerEventData& data);
};
DECLARE_PTR(NImageViewTest)
ENGINE_NAMESPACE_END
//然后在Start里面进行绑定
void NImageViewTest::Start()
{
    auto eventtrigger=GetNActor()->AddComponent< NEventTrigger>();
    if (eventtrigger)
    {
        eventtrigger->SetPointerEnterHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnPointerEnter, this));
        eventtrigger->SetPointerExitHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnPointerExit, this));
        eventtrigger->SetPointerDownHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnPointerDown, this));
        eventtrigger->SetPointerUpHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnPointerUp, this));
        eventtrigger->SetPointerClickHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnPointerClick, this));
        eventtrigger->SetBeginDragHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnBeginDrag, this));
        eventtrigger->SetDragHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnDrag, this));
        eventtrigger->SetEndDragHandler(BIND_MEMBER_FUNCTION(&NImageViewTest::OnEndDrag, this));
    }
}

代码示例2:

cpp
//NEventTrigger也可以通过属性面板进行回调函数绑定
//显示定义要绑定的函数,注意参数必须是NActorPtr
#pragma once
#include "Apis/NComponent.h"
ENGINE_NAMESPACE_BEGIN
#define EventTest_API DLLEXPORT
OBJECT_CLASS(EventTest)
class EventTest_API EventTest : public NComponent
{
DECLARE_CLASS(EventTest, NComponent)
DECLARE_RTTI
ENABLE_REFLECTION
public:
EventTest() = default;
virtual ~EventTest() = default;
virtual void Start() override;
virtual void Update() override;
virtual void OnDestroy() override;
virtual void PostEditChangeProperty(std::string& propertyName) override;
virtual void Serialize(Archive& ar) override;
virtual void LateDeserialize(Archive& ar) override;
    void OnPointerEnter(NActorPtr actor);
    void OnPointerExit(NActorPtr actor);
    void OnPointerDown(NActorPtr actor);
    void OnPointerUp(NActorPtr actor);
    void OnPointerClick(NActorPtr actor);
    void OnBeginDrag(NActorPtr actor);
    void OnDrag(NActorPtr actor);
    void OnEndDrag(NActorPtr actor);
private:
};
DECLARE_PTR(EventTest)
ENGINE_NAMESPACE_END
//然后定义函数反射
REFLECTION_BEGIN(EventTest)
FUNCTION(OnPointerEnter, EventTest, OnPointerEnter)
FUNCTION(OnPointerExit, EventTest, OnPointerExit)
FUNCTION(OnPointerDown, EventTest, OnPointerDown)
FUNCTION(OnPointerUp, EventTest, OnPointerUp)
FUNCTION(OnPointerClick, EventTest, OnPointerClick)
FUNCTION(OnBeginDrag, EventTest, OnBeginDrag)
FUNCTION(OnDrag, EventTest, OnDrag)
FUNCTION(OnEndDrag, EventTest, OnEndDrag)
REFLECTION_END
void EventTest::OnPointerEnter(NActorPtr actor)
{
}
void EventTest::OnPointerExit(NActorPtr actor)
{
}
void EventTest::OnPointerDown(NActorPtr actor)
{
}
void EventTest::OnPointerUp(NActorPtr actor)
{
}
void EventTest::OnPointerClick(NActorPtr actor)
{
}
void EventTest::OnBeginDrag(NActorPtr actor)
{
}
void EventTest::OnDrag(NActorPtr actor)
{
}
void EventTest::OnEndDrag(NActorPtr actor)
{
}
最后在编辑器下,属性面板上进行事件绑定即可。