事件触发组件
事件回调函数绑定(NEventTrigger)
属性面板介绍

- PointerEnter:当指针(鼠标或触摸)首次进入 UI 元素的可交互区域时触发。
- PointerExit:当指针离开 UI 元素的可交互区域时触发。
- PointerDown:当指针在 UI 元素上按下时触发。
- PointerUp:当指针在 UI 元素上释放时触发。
- PointerClick:完整的点击事件(包含按下和释放)。
- BeginDrag:当开始拖拽操作时触发。
- Dragging:在拖拽过程中持续触发。
- EndDrag:当拖拽操作结束时触发。
- PointerStay:- 当指针停留在 UI 元素上时持续触发。
NEventTrigger
NEventTrigger 是引擎中一个专门用于管理事件触发的组件。它允许开发者为不同的控件(如按钮、滑动条、面板,模型等)添加事件处理逻辑。通过NEventTrigger,你可以为控件设置多种类型的输入事件,诸如点击、悬停、拖动等。
| 接口 | 返回值 | 说明 |
|---|---|---|
| SetPointerEnterHandler | void | 设置选中事件回调函数 |
| SetPointerExitHandler | void | 设置移出事件回调函数 |
| SetPointerDownHandler | void | 设置按下事件回调函数 |
| SetPointerUpHandler | void | 设置抬起事件回调函数 |
| SetPointerClickHandler | void | 设置点击事件回调函数 |
| SetBeginDragHandler | void | 设置开始拖拽事件回调函数 |
| SetDragHandler | void | 设置拖拽事件回调函数 |
| SetEndDragHandler | void | 设置结束拖拽事件回调函数 |
事件回调函数绑定
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:
先是添加要绑定的回调函数
#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:
//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)
{
}
最后在编辑器下,属性面板上进行事件绑定即可。
