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分支,导致后续代码不执行。
修复步骤
- 移除调用代码中的局部
CustomPlayers定义,不要自己创建空映射。 - 获取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}")
- 给
- 验证玩家初始化流程:确保玩家已经触发
SpawnedEvent,Game Manager完成了InitPlayer,将custom_player实例存入了它的CustomPlayers映射。可以在InitPlayer的set CustomPlayers[Player] = CustomPlayer后添加打印,确认实例已存入。 - 检查玩家索引有效性:确保
AllPlayers[MyPlayerIndex]是有效的player对象,没有越界或为空,可添加打印验证:Print("Target player: {AllPlayers[MyPlayerIndex]}")
其他潜在优化
custom_player的Init方法目前只有if判断没有执行逻辑,可以补充必要的初始化操作(比如设置初始TeamNumber),但不影响当前问题的修复。
内容的提问来源于stack exchange,提问作者Harryeffinpotter
相关产品推荐
相关产品推荐

