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

UEFN-Verse自定义Player类Getter/Setter失效问题求助

UEFN Verse自定义Player类Getter/Setter调用失效问题

在UEFN中使用Verse编写带有Getter和Setter的custom_player类,但调用读写方法时无法正常工作。运行时仅打印Going into custom player code!,后续代码无输出。

相关代码

Game Manager Device代码

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Verse.org/Random}
using { /Fortnite.com/Characters }
using { /Fortnite.com/Game }
using { /Verse.org/Simulation/Tags }
using { /UnrealEngine.com/Temporary/Diagnostics }

spawner := class(tag){}
chest := class(tag){}

game_manager_device := class(creative_device):
    var CustomPlayers : [player]custom_player = map{}

        # Runs when the device is started in a running game
    OnBegin<override>()<suspends>:void=
        InitSpawners()

    InitSpawners():void=
        Spawners := GetCreativeObjectsWithTag(spawner{})
        for (Obj : Spawners):
            if (Spawner := player_spawner_device[Obj]):
                Spawner.SpawnedEvent.Subscribe(OnPlayerSpawned)
                
    OnPlayerSpawned(Agent : agent):void=
        Print("Player spawned")
        if (Player := player[Agent]):
            InitPlayer(Player)

    InitPlayer(Player : player):void=
        Print("initializing player")
        if:
            Agent := agent[Player]
            Fort := Agent.GetFortCharacter[]

        then:
            if (Existing := CustomPlayers[Player]){}
            else:
                Fort.EliminatedEvent().Subscribe(OnPlayerEliminated)
                CustomPlayer := custom_player{Player := Player}
                CustomPlayer.Init()
                if (set CustomPlayers[Player] = CustomPlayer) {}

    OnPlayerEliminated(Result : elimination_result):void=
        if:
            Killer := Result.EliminatingCharacter?
            Agent := Killer.GetAgent[]
            Player := player[Agent]
            CustomPlayer := CustomPlayers[Player]
        then:
            if (not (Result.EliminatedCharacter = Result.EliminatingCharacter?)):
                CustomPlayer.AwardElimination()

    OnPlayerLeftServer(PlayerLeaving : player):void=
        var NewCustomPlayerMap:[player]custom_player = map{}

        for (Key -> Value : CustomPlayers, Key <> PlayerLeaving):
            set NewCustomPlayerMap = ConcatenateMaps(NewCustomPlayerMap, map{Key => Value})
        
        set CustomPlayers = NewCustomPlayerMap

Custom Player类代码

using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /UnrealEngine.com/Temporary/SpatialMath }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

custom_player := class<unique>():
    Player : player
    var CurrentElims<private> : int = 0
    var DamageNumber<private> : float = 0.0
    var TeamNumber<private> : int = 0 
    var SkillLevel<private> : int = 0
    var PlayerID<private> : int = 0

    SetDamageNumber(Damage:float):void=
        set DamageNumber += Damage

    GetDamageNumber()<transacts>:float=
        return DamageNumber

    SetSkillLevel(Skill:int):void=
        set SkillLevel = Skill      
    
    GetSkillLevel()<transacts>:int=
        return SkillLevel

    SetTeamNumber(Team:int):void=
        set TeamNumber = Team

    GetTeamNumber()<transacts>:int=
        return TeamNumber

    SetPlayerID(ID:int):void=
        set PlayerID = ID

    GetPlayerID()<transacts>:int=
        return PlayerID

    AwardElimination():void=
        set CurrentElims += 1

    GetElimCount()<transacts>:int=
        return CurrentElims
    
    Init():void=
        if:
            Agent := agent[Player]
            Fort := Agent.GetFortCharacter[]

调用代码

var CustomPlayers : [player]custom_player = map{}

... (irrelevant code here)
Print("Going into custom player code!")
if (CustomPlayer := CustomPlayers[AllPlayers[MyPlayerIndex]]):
    Print("Setting CustomPlayer team number...")
    CustomPlayer.SetTeamNumber(PlayerTeamNumber)
    CustomPlayerTeamText := CustomPlayer.GetTeamNumber()
    Print("Custom player team number {CustomPlayerTeamText}")

问题根源与修复方案

核心问题

调用代码中重新定义了空的CustomPlayers映射,和Game Manager设备中维护的、存储了玩家实例的CustomPlayers完全是两个独立对象,因此CustomPlayers[AllPlayers[MyPlayerIndex]]找不到对应的custom_player实例,直接跳过if分支,导致后续代码不执行。

修复步骤

  1. 移除调用代码中的局部CustomPlayers定义,不要自己创建空映射。
  2. 获取Game Manager设备实例,通过它访问真正存储了玩家数据的CustomPlayers:
    • 给game_manager_device添加全局标签,方便查找:
      game_manager_tag := class(tag){}
      game_manager_device := class(creative_device, game_manager_tag){}
      
    • 在调用代码中获取Game Manager实例:
      if (GameManager := GetCreativeDeviceByType(game_manager_device)):
          # 使用GameManager.CustomPlayers访问映射
          if (CustomPlayer := GameManager.CustomPlayers[AllPlayers[MyPlayerIndex]]):
              Print("Setting CustomPlayer team number...")
              CustomPlayer.SetTeamNumber(PlayerTeamNumber)
              CustomPlayerTeamText := CustomPlayer.GetTeamNumber()
              Print("Custom player team number {CustomPlayerTeamText}")
      
  3. 验证玩家初始化流程:确保玩家已经触发SpawnedEvent,Game Manager完成了InitPlayer,将custom_player实例存入了它的CustomPlayers映射。可以在InitPlayer的set CustomPlayers[Player] = CustomPlayer后添加打印,确认实例已存入。
  4. 检查玩家索引有效性:确保AllPlayers[MyPlayerIndex]是有效的player对象,没有越界或为空,可添加打印验证:
    Print("Target player: {AllPlayers[MyPlayerIndex]}")
    

其他潜在优化

  • custom_player的Init方法目前只有if判断没有执行逻辑,可以补充必要的初始化操作(比如设置初始TeamNumber),但不影响当前问题的修复。

内容的提问来源于stack exchange,提问作者Harryeffinpotter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:15:39