跳到主要内容

GlobalGameData

一次游玩会话的主要可存档状态容器——难度、徽章、已访问场景、最后治疗/玩家位置、步数计数,以及 附加系统(跟随者、秘密基地、玩家道馆、塔层挑战)的持久状态。它是一个通过 Zenject 注入的 ScriptableObject 资产,并通过其可存档镜像 SavableGlobalGameData 将自身序列化到磁盘。

Namespace: OpenMon.MCE.Player

部分字段仅用于存档预览

GlobalGameData 上的 Money、DexNumber 和 RosterPreview 仅用于存档槽预览 UI——它们在 保存时快照。真实值位于别处:金钱在玩家的 Bag,真正的队伍在 Roster(PlayerCharacter.PlayerRoster)。游戏逻辑应读取那些,而非此处的预览 字段。

定义​

[CreateAssetMenu(menuName = "MCE/Player/GlobalGameData", fileName = "GlobalGameData")]
public class GlobalGameData : GameVariableHolder
{
// 版本信息(保存时写入)
public string LastSaveDate;
public string LastGameVersion;
public string LastMCEVersion;
public string LastMCEAssetsVersion;

// 选项
public GameDifficulty GameDifficulty;
public CatchDifficulty CatchDifficulty;

// 通用
public bool HasDex;
public SceneLocation LastHealLocation;
public uint StepsTaken;
public SerializableDictionary<Region, List<Badge>> ObtainedBadges;
public List<SceneInfoAsset> VisitedScenes;
public Ball LastUsedBall;

// 玩家位置
public SceneLocation LastPlayerLocation;
public bool WasPlayerOnBridgeOnLastLocation;

// 仅存档预览
public uint DexNumber;
public uint Money;
public List<MonsterPreview> RosterPreview;

// 附加系统状态(对旧存档容忍 null)
public FollowerSaveData FollowerData;
public SecretBaseData SecretBase;
public SceneLocation SecretBaseReturn;
public PlayerGymData PlayerGym;
public List<string> EarnedGymBadges;
public TowerRunState TowerRun;

public void AddBadge(Badge badge, Region region);
public bool HasBadge(Badge badge, Region region);
public List<Badge> GetBadges(Region region);
public int GetTotalNumberOfBadges();
public float GetCatchDifficultyMultiplier();

public override string SaveToText(ISerializer<string> serializer, PlayerCharacter playerCharacter);
public override IEnumerator LoadFromText(ISerializer<string> serializer, string data,
MCESettings mceSettings, MonsterDatabaseInstance monsterDatabase);
public override IEnumerator ResetSave();
}

字段与属性​

GameDifficulty​

本次游玩的难度。

类型: GameDifficulty

CatchDifficulty​

捕获难度。供给 GetCatchDifficultyMultiplier()。

类型: CatchDifficulty

HasDex​

玩家是否已获得图鉴。

类型: bool

LastHealLocation​

玩家最后治疗的地点——失败后的重生点。

类型: SceneLocation

LastPlayerLocation​

保存时写入的玩家最后已知位置。

类型: SceneLocation

WasPlayerOnBridgeOnLastLocation​

玩家在其最后位置是否站在桥上(加载时恢复)。

类型: bool

StepsTaken​

玩家已行走的总步数(驱动孵蛋、漫游等)。

类型: uint

ObtainedBadges​

已获得的徽章,按 Region 作键。请通过 AddBadge / HasBadge / GetBadges 操作,而非直接 修改。

类型: SerializableDictionary<Region, List<Badge>>

VisitedScenes​

玩家已访问的场景(一个装饰性的“我是否来过这里”面包屑)。

类型: List<SceneInfoAsset>

LastUsedBall​

玩家最后投掷的球(用于在对战中预选)。

类型: Ball

Money​

存档预览用的金钱快照(并非实时钱包——见上方说明)。

类型: uint

DexNumber​

已捕获物种数的存档预览计数(仅预览)。

类型: uint

RosterPreview​

队伍的存档预览快照(物种/形态/性别/蛋),每个槽位一个 MonsterPreview。保存时从实时队伍构建。

类型: List<MonsterPreview>

FollowerData​

当前世界跟随者的持久状态。

类型: FollowerSaveData(OpenMon.MCE.Characters.Followers)

SecretBase​

玩家秘密基地(已放置装饰)的持久状态。对旧存档容忍 null。

类型: SecretBaseData(OpenMon.MCE.World.SecretBase)

SecretBaseReturn​

玩家进入其秘密基地内部时离开的世界位置,使内部出口传送能将其准确送回来处。Scene 为 null/空 表示“无待返回”,出口回退到 LastHealLocation。

类型: SceneLocation

PlayerGym​

玩家自己的自定义道馆:装饰过的内部房间、馆主队伍槽位、自定义徽章与对话。对旧存档容忍 null。

类型: PlayerGymData(OpenMon.MCE.World.Gym)

EarnedGymBadges​

该玩家通过击败其他玩家的道馆而赢得的自定义道馆徽章的不透明 id(一次性、去重)。不同于 ObtainedBadges——后者保存作者编写的地区馆主 Badge 资产。

类型: List<string>

TowerRun​

进行中的对战塔挑战的持久状态。

类型: TowerRunState(OpenMon.MCE.Battle.Tower)

方法​

AddBadge(Badge badge, Region region)​

向某地区添加徽章(必要时创建该地区的列表)。

HasBadge(Badge badge, Region region)​

玩家是否在某地区拥有特定徽章。

返回: bool。

GetBadges(Region region)​

玩家在某地区拥有的所有徽章(没有则为空列表)。

返回: List<Badge>。

GetTotalNumberOfBadges()​

所有地区徽章的总数。

返回: int。

GetCatchDifficultyMultiplier()​

当前 CatchDifficulty 的捕获率乘数(Guaranteed → -1、Easy → 1.5、Normal → 1、 Hard → 0.5)。

返回: float。

SaveToText(ISerializer<string> serializer, PlayerCharacter playerCharacter)​

快照实时玩家状态(位置、金钱、图鉴数、队伍预览),盖上版本戳,并序列化为 SavableGlobalGameData 字符串。

返回: string。

LoadFromText(ISerializer<string> serializer, string data, MCESettings mceSettings, MonsterDatabaseInstance monsterDatabase)​

反序列化 SavableGlobalGameData 并将其重新应用到此资产的协程(先运行存档迁移)。

返回: IEnumerator。

ResetSave()​

重置为全新游戏状态(Normal 难度、无图鉴、初始治疗位置、清空徽章/场景、重置附加系统)的协程。

返回: IEnumerator。

SavableGlobalGameData​

GlobalGameData 便于序列化的镜像。引用型 Unity 对象(场景、徽章、球、物种)按名称保存, 使存档在不同运行环境间保持稳定,而 SaveFormatVersion 戳驱动加载时的迁移。

[Serializable]
public class SavableGlobalGameData
{
public int SaveFormatVersion;

public string LastSaveDate;
public string LastGameVersion;
public string LastMCEVersion;
public string LastMCEAssetsVersion;

public GameDifficulty GameDifficulty;
public bool HasDex;
public SavableSceneLocation LastHealLocation;
public SavableSceneLocation LastPlayerLocation;
public uint StepsTaken;
public List<ObjectPair<string, string>> ObtainedBadges; // (地区名, 徽章名)
public List<string> VisitedScenes; // 场景名
public string LastUsedBallName; // 规范 id
public uint DexNumber;
public uint Money;
public List<SavableMonsterPreview> RosterPreview;
public GameVariables GameVariables;
public FollowerSaveData FollowerData;
public SecretBaseData SecretBase;
public SavableSceneLocation SecretBaseReturn;
public PlayerGymData PlayerGym;
public List<string> EarnedGymBadges;
public TowerRunState TowerRun;

public SavableGlobalGameData(GlobalGameData globalGameData);
public void LoadGlobalGameData(GlobalGameData globalGameData,
MonsterDatabaseInstance monsterDatabase,
WorldDatabase worldDatabase);
}

SaveFormatVersion​

写入存档时盖上的存档格式版本。加载时,LoadGlobalGameData 将其与当前版本比较,并在应用数据前 运行待处理的迁移。早于该戳的存档会将其反序列化为 0。

类型: int

LoadGlobalGameData(GlobalGameData globalGameData, MonsterDatabaseInstance monsterDatabase, WorldDatabase worldDatabase)​

将每个名称解析回其实时资产并将数据应用到 GlobalGameData。装饰性引用(徽章、已访问场景)是 容忍的:被移除/重命名的资产会丢弃该单条目,而非使整个加载失败。

用法示例​

using OpenMon.MCE.Player;
using OpenMon.MCE.Badges;
using OpenMon.MCE.World;
using Zenject;

public class BadgeCounter : MonoBehaviour
{
[Inject] private GlobalGameData gameData;

private void Start()
{
Debug.Log($"Steps walked : {gameData.StepsTaken}");
Debug.Log($"Total badges : {gameData.GetTotalNumberOfBadges()}");
Debug.Log($"Has Dex : {gameData.HasDex}");
Debug.Log($"Catch mult. : {gameData.GetCatchDifficultyMultiplier()}");
}
}