You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:07:43