【UE 接口和事件分发器】 使用场景?

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:UE虚幻引擎专栏
  • 💥 标题:【UE 接口和事件分发器】
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎大家留言讨论。

0 引言

什么时候使用接口通信:例如游戏中有很多东西都要和玩家进行交互时,玩家通过“交互”功能可以和不同的物体进行交互,对门按下交互键可以打开门,对窗户按下交互键可以打开窗户,对食物按下交互键可以吃掉食物。此时同一种功能作用不同的对象会有不同的效果,此时就可以将这个功能设计为 蓝图接口。

那什么时候用事件分发器呢?事件分发器更像是一个广播,例如一个关卡中的BOSS死亡时,玩家会增加经验,关卡会打开隐藏门等等事件被触发。此时就可以将 BOSS死亡 创建一个事件分发器,然后其他的类和这个分发器进行绑定。然后当事件分发器被调用的时候,和这个事件分发器绑定的事件都会被触发。

1 接口的使用场景

今天学习UE C++实战项目时用到了接口实现一些功能。其实接口早就学过了,但是一直对使用场景和为什么用接口不太熟悉。今天就总结一下。

背景:在游戏中经常会有玩家交互按钮,例如第五人格的交互键,遇到受伤的队友会治疗队友,遇到窗户可以翻窗,遇到挡板可以翻越。也就是调用一种函数可以有多钟表现形式(多态)。

解决方案:

  • 方案一: 使用判断语句来解决,判断传递进来的对象类型,然后调用对应类型中的函数,来实现不同的逻辑。(这是小白的做法,也是我以前的做法)

  • 方案二:可能有些人就会想可以在基类中写个虚函数,然后子类重写虚函数来实现。也就是传递进来的对象是UObject类型(最基础的基类),然后类型转换成BaseClass类型,然后调用BaseClass中的虚函数实现多态(原理是虚函数运行时的动态绑定,C++中的虚函数是通过虚函数表vtable和虚函数指针vptr实现。每个对象中都有一个指向虚函数表的指针,这个虚函数表是一个指针数组,存储了该类中所有虚函数的地址,当调用虚函数时,实际上是通过对象的虚函数指针来访问相应的虚函数表,然后根据虚函数的索引确定具体执行哪个函数)。

  • 方案三:其实可以想想,让人物,物体等继承同一个类,那也就只能是UObject这种基类了。所以在面对不同类型的时候就需要使用接口了,接口就是用来解决这种类型相差很大,然后实现多态的场景。创建一个Interface,然后让这些类都继承这个接口,然后重写虚函数。然后可以通过他们共同继承的接口类指针访问虚函数了。

总结:当需要添加新的交互类时,方案一不仅需要修改玩家类中的判断函数,也要新添加一个交互类。当时此时可以看到方案二和方案三,则不需要对玩家类中的函数进行修改。因为他们都是通过父类指针来访问函数,而不是通过具体的对象访问函数。这就是抽象编程的思想。

2 事件分发器的使用场景

在Unreal Engine(UE)中,事件分发器(Event Dispatcher)是一种用于实现事件驱动编程的机制。它允许一个对象(通常是一个类的实例)在发生特定事件时通知其他对象,并触发相应的响应动作。事件分发器通常与委托(Delegate)一起使用,以实现事件的订阅和处理。

以下是在UE中使用事件分发器的一些常见场景:

  1. 交互系统:事件分发器可以用于实现游戏中的交互系统。例如,当玩家与一个物体交互时,该物体可以触发一个事件分发器,并通知其他物体或系统来执行相应的操作,比如开启门、播放音效等。

  2. UI系统:事件分发器可以用于UI系统中。例如,当用户点击一个按钮时,按钮可以触发一个事件分发器,并通知其他UI元素或系统来执行相应的操作,比如显示/隐藏窗口、切换界面等。

  3. 自定义游戏逻辑:事件分发器可以用于自定义游戏逻辑。例如,在一个多人游戏中,当玩家加入游戏或离开游戏时,服务器可以触发一个事件分发器,并通知所有客户端来同步玩家信息。

  4. 系统间通信:事件分发器可以用于实现系统间的通信。例如,当一个系统生成了新的任务时,它可以触发一个事件分发器,并通知另一个系统来处理这个任务。

  5. 动画和特效:事件分发器可以用于触发动画和特效。例如,当某个条件满足时,角色可以触发一个事件分发器,并通知动画系统来播放相应的动画。

  6. 自定义蓝图逻辑:在UE中,事件分发器可以在蓝图中使用,用于实现自定义的逻辑。蓝图中的事件分发器可以连接到其他蓝图节点,从而实现复杂的游戏行为。

总之,事件分发器在UE中可以帮助开发者实现事件驱动的编程模式,使得游戏系统能够更加灵活、可扩展,并促进各个系统之间的解耦合。

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uE中的事件分发可以帮助用户在程序中管理和处理事件使用事件分发可以将事件从一个对象传递到另一个对象,实现对象之间的解耦。在uE中,事件分发使用了观察者模式,当一个事件发生时,事件分发会通知已注册的监听并执行相应的操作。 使用uE事件分发的方法如下: 1. 创建一个事件分发对象。 2. 注册监听对象,可以是任何实现了监听接口的对象。 3. 在需要触发事件的地方,调用事件分发的方法并传递事件对象作为参数。 4. 事件分发会自动通知已注册的监听对象,并执行相应的操作。 示例代码如下: ```c++ // 定义一个事件类型 class MyEvent { public: int data; }; // 定义一个监听接口 class MyListener { public: virtual void onEvent(MyEvent event) = 0; }; // 定义一个事件分发 class MyEventDispatcher { private: std::vector<MyListener*> listeners; public: void registerListener(MyListener* listener) { listeners.push_back(listener); } void dispatchEvent(MyEvent event) { for (auto listener : listeners) { listener->onEvent(event); } } }; // 实现一个监听 class MyEventListener : public MyListener { public: void onEvent(MyEvent event) override { std::cout << "Event data: " << event.data << std::endl; } }; // 使用事件分发 int main() { MyEventDispatcher dispatcher; MyEventListener listener; dispatcher.registerListener(&listener); MyEvent event; event.data = 123; dispatcher.dispatchEvent(event); return 0; } ``` 在上面的示例代码中,我们创建了一个名为`MyEventDispatcher`的事件分发,并实现了一个名为`MyEventListener`的监听。我们使用`registerListener`方法将`MyEventListener`对象注册到事件分发中,并使用`dispatchEvent`方法触发事件,并将`MyEvent`对象作为参数传递给事件分发。当事件被触发时,事件分发会自动通知已注册的监听对象,并执行相应的操作。在上面的示例代码中,我们实现了`MyEventListener`监听的`onEvent`方法,当事件被触发时,会输出事件的数据到控制台上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值