Do Once 节点像一个“单次开关”,能确保它后面的逻辑只被触发一次,再次触发会直接被忽略。这是一个很常用的工具,可以用来实现“仅一次”的游戏逻辑,比如初始化、首次事件触发等。下面是一些具体的使用场景。
🤖 场景一:AI首次发现玩家 (Do Once基础用法)
这个例子能让你更直观地理解它的工作方式。目标是当AI首次与玩家进入“已发现”状态时,触发一段对话逻辑,并确保这个过程只发生一次。
-
创建蓝图:创建一个继承自
Character的新蓝图,命名为BP_Enemy。 -
添加碰撞体:在
BP_Enemy蓝图中添加一个Sphere Collision(球形碰撞体),调整为合适大小,并确保在其细节面板中,Collision Presets设置为Custom,并勾选Generate Overlap Events。 -
添加自定义事件:在
BP_Enemy的事件图表中,右键添加一个自定义事件,命名为OnFirstSpotPlayer。这个事件将用于播放对话。 -
设置核心逻辑 (Do Once):
-
选中
BP_Enemy蓝图中的Sphere Collision组件,在细节面板点击On Component Begin Overlap (Sphere Collision)旁边的绿色加号。 -
从
OnComponentBeginOverlap节点拖出引脚,搜索并放置Do Once节点。 -
从
Do Once节点的Out引脚连接到Cast To BP_ThirdPersonCharacter(将其目标设置为从OnComponentBeginOverlap节点引出的Other Actor,注意替换为你的角色蓝图名称)。成功转换后,再从As BP_ThirdPersonCharacter引脚拖出,调用OnFirstSpotPlayer事件。 -
最终连接如下图:
-
-
测试逻辑:编译并保存
BP_Enemy,将其放入关卡。运行游戏,控制角色第一次接触AI的球形触发器时,会播放对话;之后无论怎么触发,对话都不会再播放,且Print String不会再打印新内容。
🧩 场景二:可重置的一次性钥匙门 (配合Reset使用)
这个案例展示了如何通过Reset输入引脚让Do Once节点“重置”,恢复执行能力。
-
创建蓝图接口:创建一个蓝图接口,命名为
BPI_Door,并添加一个函数ResetDoor。 -
创建门Actor:新建蓝图类,继承自
Actor,命名为BP_Door。-
为其添加
Static Mesh等视觉组件。 -
在事件图表中,实现逻辑:
-
从
BeginPlay事件拖出,连接到一个Do Once节点。 -
从
Do Once的Out引脚连接,设置门为“上锁”的初始状态。 -
实现接口:实现
BPI_Door接口,在ResetDoor事件后,连接一个Reset引脚连接到Do Once节点的Reset输入引脚,用于重置节点。
-
-
-
创建钥匙Actor:新建蓝图类,继承自
Actor,命名为BP_Key。-
添加
Box Collision作为触发器。 -
在其事件图表中,实现
OnComponentBeginOverlap事件。 -
从
Other Actor引脚拖出,尝试Cast To BP_Door。如果转换成功,则从As BP_Door引脚调用接口函数ResetDoor。
-
-
测试逻辑:运行游戏,门最初处于上锁状态;当角色拾取钥匙(与
BP_Key重叠)后,BP_Key会调用BP_Door的ResetDoor函数,Do Once节点被重置,门恢复正常功能。再次碰门,“门是锁着的”信息将不再打印。
🕒 场景三:技能冷却管理系统 (Do Once与Delay组合)
这个组合是一种非常经典的技能冷却、攻击间隔的实现方式。
-
技能冷却:每次使用技能,通过
Do Once限制技能逻辑只执行一次,然后进入Delay等待冷却。在Delay结束后再通过其他逻辑重置Do Once,允许技能再次使用。 -
防止高频触发:对于连续攻击,可在攻击动作末尾调用
Reset重置Do Once;对于单次大伤害,可利用Do Once确保伤害只生效一次,再用Delay控制伤害判定窗口的持续时间。
💡 高级用法与技巧:Do Once MultiInput 节点
如果你需要一次性重置多个Do Once节点,使用布尔变量的方式可能比较繁琐。这时可以使用 Do Once MultiInput 节点来实现集中管理。
-
核心特性:每个输入引脚都相当于一个独立的
Do Once节点,但共享同一个重置 (Reset)引脚。勾选其细节面板中的Start Closed选项,可以让节点在开始时处于“已使用”状态,需要重置后才能第一次执行。
🔧 常见问题与排查
-
动画未重置:请确保
Reset输入引脚只控制Do Once节点的状态。要重置动画状态,你需要单独调用重置动画的逻辑。 -
网络同步问题:
Do Once节点的状态默认是局部的。在多人游戏中,你需要将重置它的逻辑放在服务器上执行,并通过Run on Server和Multicast等RPC(远程过程调用)来同步。 -
接口实现混乱:如果多个Actor需要被重置,统一使用蓝图接口是一种更整洁、解耦的方式。确保你的重置事件是由接口定义的。
Do Once节点是一个看似简单但很有用的工具。希望这几个案例能帮你更好地掌握它的用法。
感谢您的来访,获取更多精彩文章请收藏本站。







暂无评论内容