UEFN气球生命值系统开发:事件与Print格式化问题排查
UEFN气球生命值系统:事件绑定与Print格式化问题排查
我正在基于UEFN开发一款“气球生命值系统”——玩家受击时减少气球数,气球耗尽后被淘汰,但在事件绑定与Print格式化环节遇到了一些小问题,相关Verse代码如下:
using { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Verse.org/Simulation } using { /Verse.org/Simulation/Playspace } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/SpatialMath } balloon_life_system := class(): var playerBalloonCounts: [character]int = {} # Called when a character spawns on_player_added(char: character): void = playerBalloonCounts[char] = 3 Print("Spawned with 3 balloons: {char}") # Called when a character leaves on_player_removed(char: character): void = playerBalloonCounts.remove(char) # Called when a character takes damage on_player_damaged(char: character, damage: float): void = if (char : playerBalloonCounts): currentCount = playerBalloonCounts[char] if (currentCount > 0): newCount = currentCount - 1 playerBalloonCounts[char] = newCount Print("{char} lost a balloon! Remaining: {newCount}") if (newCount <= 0): char.Eliminate() Print("No balloons left! Eliminated {char}") OnBegin(): void = if (playspace := GetPlayspace()): Print("Balloon life system started") # Setup existing players for (char in playspace.GetPlayers()): on_player_added(char) # Subscribe to events playspace.PlayerAddedEvent().Subscribe(on_player_added) playspace.PlayerRemovedEvent().Subscribe(on_player_removed) playspace.PlayerDamageEvent().Subscribe(on_player_damaged)
问题分析与修正方案
1. Print格式化问题
原代码中直接输出{char}会打印角色对象的内存引用,而非玩家昵称,日志可读性极差。需要调用char.GetPlayerName()获取玩家的显示名称,修改后的Print语句示例:
Print("Spawned with 3 balloons: {char.GetPlayerName()}") Print("{char.GetPlayerName()} lost a balloon! Remaining: {newCount}") Print("No balloons left! Eliminated {char.GetPlayerName()}")
2. 事件绑定潜在问题
- PlayerDamageEvent范围过广:原代码会响应所有伤害(包括环境伤害、队友误伤),如果需要限制为玩家间伤害,可增加伤害来源判断:
on_player_damaged(char: character, damage: float, damage_source: damage_source): void = if (char : playerBalloonCounts): # 仅处理玩家发起的伤害 if (damage_source.GetInstigatorCharacter() is instigator_char: character): currentCount = playerBalloonCounts[char] # 后续逻辑不变
- 重生未重置气球:原代码仅在玩家首次加入时初始化气球,玩家重生后不会重新赋值,需新增
CharacterSpawnedEvent监听:
OnBegin(): void = if (playspace := GetPlayspace()): # 原有逻辑... # 监听玩家重生事件,重新初始化气球 playspace.CharacterSpawnedEvent().Subscribe(on_player_added)
修正后的完整代码
using { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Verse.org/Simulation } using { /Verse.org/Simulation/Playspace } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/SpatialMath } using { /Fortnite.com/Damage } balloon_life_system := class(): var playerBalloonCounts: [character]int = {} on_player_added(char: character): void = playerBalloonCounts[char] = 3 Print("Spawned with 3 balloons: {char.GetPlayerName()}") on_player_removed(char: character): void = playerBalloonCounts.remove(char) on_player_damaged(char: character, damage: float, damage_source: damage_source): void = if (char : playerBalloonCounts): # 仅响应玩家造成的伤害(可选) if (damage_source.GetInstigatorCharacter() is instigator_char: character): currentCount = playerBalloonCounts[char] if (currentCount > 0): newCount = currentCount - 1 playerBalloonCounts[char] = newCount Print("{char.GetPlayerName()} lost a balloon! Remaining: {newCount}") if (newCount <= 0): char.Eliminate() Print("No balloons left! Eliminated {char.GetPlayerName()}") OnBegin(): void = if (playspace := GetPlayspace()): Print("Balloon life system started") for (char in playspace.GetPlayers()): on_player_added(char) playspace.PlayerAddedEvent().Subscribe(on_player_added) playspace.PlayerRemovedEvent().Subscribe(on_player_removed) playspace.PlayerDamageEvent().Subscribe(on_player_damaged) # 监听玩家重生,重新初始化气球 playspace.CharacterSpawnedEvent().Subscribe(on_player_added)
内容的提问来源于stack exchange,提问作者Amr Mahmoud
相关产品推荐
相关产品推荐

