跳到主要内容

MonsterInstance

单只怪物的运行时数据容器 —— 物种、形态、能力值、招式、特性、持有道具、亲密度等等。当你对 Roster 进行索引时(例如 player.PlayerRoster[0])拿到的就是这个对象,因此它是你的游戏代码操作最频繁的类型。

命名空间:OpenMon.MCE.Monster

具体数据类型,而非 SDK 接口

与 OpenMon.MCE.SDK 中的接口不同,MonsterInstance 是一个具体的可序列化类。下面列出的成员是大多数买家会用到的主要接口面;完整的类还包含额外成员(繁殖、进化、遭遇与精灵图辅助方法)。完整 API 请参阅源代码(Source 版)。

定义​

[Serializable]
public class MonsterInstance : Loggable<MonsterInstance>, IWorldDataContainer, ICommandParameter
{
public MonsterEntry Species;
public Form Form;
public bool IsNullEntry { get; }
public DataByFormEntry FormData { get; }

public MonsterStatData StatData;
public MonsterPhysicalData PhysicalData;
public OriginData OriginData;

public bool HasNickname;
public string Nickname;
public string CurrentTrainer;
public byte Friendship;
public uint CurrentHP;

public MoveSlot[] CurrentMoves;
public List<Move> LearntMoves;
public Item HeldItem;

public bool CanBattle { get; }
public float Height { get; }
public float Weight { get; }

public MonsterInstance(MCESettings settings, MonsterDatabaseInstance database,
MonsterEntry species, Form form, byte level, /* ...many optional overrides... */);

public string GetNameOrNickName(ILocalizer localizer);
public (int NewHP, int PreviousHP, bool TriggeredForceSurvive) ChangeHP(int amount, bool forceSurvive = false);
public void CompletelyHeal();
public bool IsAtMaxHP();
public void RaiseExperience(ExperienceLookupTable lookupTable, uint amount, Action<LevelUpData> levelUpCallback);
public int GetExperienceForNextLevel(ExperienceLookupTable lookupTable);
public void ChangeFriendship(int amount, SceneInfoAsset currentScene, ILocalizer localizer);
public Dictionary<Stat, uint> GetStats(BattleManager battleManager);
public (MonsterType, MonsterType) GetTypes(MCESettings settings, BattleManager battleManager);
public Ability GetAbility();
public void SetAbility(Ability ability);
public bool KnowsMove(Move move);
public bool CanLearnMove(Move move);
public List<MoveSlot> GetMovesWithPP();
public MonsterInstance Clone();
}

字段与属性​

Species​

这只怪物的物种。

类型:MonsterEntry

Form​

这只怪物的形态(地区变种、性别形态、闪光等)。

类型:Form

IsNullEntry​

该条目是否为空?很有用,因为 Unity 在序列化空的队伍槽位时会创建一个所有字段都为 null 的实例。

类型:bool(只读)—— 当 Species == null || Form == null 时为 true。

FormData​

获取这只怪物物种的形态数据(保存基础能力值、属性、可学招式表等信息的每形态记录)。

类型:DataByFormEntry(只读)—— 等价于 Species[Form]。

StatData​

这只怪物的能力值数据。怪物的等级就存放在这里(StatData.Level,一个 byte),此外还有它的 Nature(性格)和 CurrentLevelExperience。

类型:MonsterStatData

PhysicalData​

这只怪物的物理数据(性别、身高/体重修正)。通过 PhysicalData.Gender 读取性别。

类型:MonsterPhysicalData

OriginData​

这只怪物的来源数据(地区、地点、捕捉精灵球、原训练家、是否为 alpha)。

类型:OriginData

HasNickname / Nickname​

怪物是否拥有昵称,以及拥有时的昵称本身。

类型:bool / string

CurrentTrainer​

这只怪物当前的训练家。

类型:string

Friendship​

这只怪物的亲密度数值。

类型:byte(0–255)

CurrentHP​

这只怪物当前的 HP。

类型:uint

CurrentMoves​

怪物的招式槽位。一只怪物有 4 个槽位;每个 MoveSlot 携带一个 Move 及其当前 PP。

类型:MoveSlot[]

LearntMoves​

这只怪物在其生涯中习得过的招式。

类型:List<Move>

HeldItem​

这只怪物的持有道具。

类型:Item

CanBattle​

这只怪物能否战斗?当 CurrentHP > 0 且怪物不是蛋时为 true。

类型:bool(只读)

Height​

获取怪物的身高(形态身高 × 物理身高修正)。

类型:float(只读)

Weight​

获取怪物的体重(形态体重 × 物理修正,再由特性的体重修正调整)。

类型:float(只读)

方法​

MonsterInstance(...) 构造函数​

用于创建怪物实例的构造函数,可覆盖其大部分数据。只有 settings、database、species、form 和 level 是必需的 —— 其余参数都有合理的默认值(随机性格/特性、无昵称、OriginData.Type.Caught 等)。

参数类型说明
settingsMCESettingsMCE 引用的内部设置
databaseMonsterDatabaseInstance用于创建这只怪物的数据库
speciesMonsterEntry这只怪物的物种
formForm这只怪物的形态(无效形态回退为默认值)
levelbyte这只怪物的等级
(众多可选参数)性格、特性、性别、个体值/努力值、招式、昵称、训练家、精灵球、缎带、持有道具、isEgg 等等
优先使用 Roster.AddMonster

在常规玩法中,你通常通过 Roster.AddMonster(...) 创建怪物,它会转发到此构造函数并替你把怪物放入队伍。

GetNameOrNickName(ILocalizer localizer)​

获取这只怪物的名称或昵称。

参数类型说明
localizerILocalizer本地化器引用

返回:string —— 如果有昵称则返回本地化后的昵称,否则返回本地化后的物种名(或它是蛋时的 "Egg" 字符串)。

ChangeHP(int amount, bool forceSurvive = false)​

以一个未钳制的数值改变这只怪物的 HP(内部会钳制到 [0..maxHP],若设置了 forceSurvive 则钳制到 [1..maxHP])。

参数类型说明
amountint用于改变 HP 的未钳制数值
forceSurvivebool是否强制怪物在此次攻击中存活?

返回:(int NewHP, int PreviousHP, bool TriggeredForceSurvive)。

CompletelyHeal()​

完全治疗这只怪物 —— 将 HP 恢复至满值、补满每个招式槽的 PP,并清除其异常状态。

IsAtMaxHP()​

检查怪物是否处于满血状态。

返回:bool —— 若是则为 true。

RaiseExperience(ExperienceLookupTable lookupTable, uint amount, Action<LevelUpData> levelUpCallback)​

提升这只怪物的经验值,并在过程中处理升级(及其招式习得事件)。

参数类型说明
lookupTableExperienceLookupTable要使用的经验查找表
amountuint要提升的经验值数量
levelUpCallbackAction<LevelUpData>每次怪物升级时触发的回调

GetExperienceForNextLevel(ExperienceLookupTable lookupTable)​

获取升到下一等级所需的经验值。

返回:int —— 升到下一等级所需的经验值。

ChangeFriendship(int amount, SceneInfoAsset currentScene, ILocalizer localizer)​

改变这只怪物的亲密度(在钳制到 [0..255] 之前会应用地点和捕捉精灵球修正)。

参数类型说明
amountint要改变的数量
currentSceneSceneInfoAsset我们当前所在的场景
localizerILocalizer本地化器引用

GetStats(BattleManager battleManager)​

获取这只怪物当前的能力值。

参数类型说明
battleManagerBattleManager若处于战斗中则为战斗管理器引用;战斗之外请传入 null

返回:Dictionary<Stat, uint> —— 每项能力值映射到其计算后的数值。

GetTypes(MCESettings settings, BattleManager battleManager)​

获取这只怪物的属性。它们可能被临时的战斗状态修改。

返回:(MonsterType, MonsterType) —— 两个属性(单属性怪物的第二个可能为 null)。

GetAbility()​

获取这只怪物的特性。

返回:Ability。

SetAbility(Ability ability)​

设置这只怪物的新特性。

参数类型说明
abilityAbility新特性

KnowsMove(Move move)​

检查怪物是否会某个招式。

返回:bool —— 若会则为 true。

CanLearnMove(Move move)​

检查怪物是否能学会某个招式(即该招式在其可学招式表中且它尚未学会)。

返回:bool —— 若能则为 true。

GetMovesWithPP()​

获取仍有 PP 的招式列表。

返回:List<MoveSlot>。

Clone()​

克隆此实例。对空条目返回 null;深拷贝能力值数据并复制其余部分。

返回:MonsterInstance。

用法示例​

using OpenMon.MCE.SDK;
using OpenMon.MCE.Monster;
using Zenject;

public class LeadMonsterInspector : MonoBehaviour
{
[Inject] private IMonsterCaptureEngine engine;

private void Start()
{
Roster roster = engine.Player.PlayerRoster;
if (roster.RosterSize == 0) return;

MonsterInstance lead = roster[0];

Debug.Log($"Species : {lead.Species.name}");
Debug.Log($"Level : {lead.StatData.Level}");
Debug.Log($"HP : {lead.CurrentHP}");
Debug.Log($"Friend. : {lead.Friendship}");
Debug.Log($"Can battle: {lead.CanBattle}");

// Inspect the moveset.
foreach (MoveSlot slot in lead.GetMovesWithPP())
Debug.Log($"Move: {slot.Move.name} ({slot.CurrentPP} PP)");

// Full restore.
lead.CompletelyHeal();
}
}