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()}");
}
}