MonsterInstance
单只怪物的运行时数据容器 —— 物种、形态、能力值、招式、特性、持有道具、亲密度等等。当你对 Roster 进行索引时(例如 player.PlayerRoster[0])拿到的就是这个对象,因此它是你的游戏代码操作最频繁的类型。
命名空间:OpenMon.MCE.Monster
与 OpenMon.MCE.SDK 中的接口不同,MonsterInstance 是一个具体的可序列化类。下面列出的成员是大多数买家会用到的主要接口面;完整的类还包含额外成员(繁殖、进化、遭遇与精灵图辅助方法)。完整 API 请参阅源代码(Source 版和 Studio 版)。
定义
[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 等)。
| 参数 | 类型 | 说明 |
|---|---|---|
settings | MCESettings | MCE 引用的内部设置 |
database | MonsterDatabaseInstance | 用于创建这只怪物的数据库 |
species | MonsterEntry | 这只怪物的物种 |
form | Form | 这只怪物的形态(无效形态回退为默认值) |
level | byte | 这只怪物的等级 |
| (众多可选参数) | 性格、特性、性别、个体值/努力值、招式、昵称、训练家、精灵球、缎带、持有道具、isEgg 等等 |
Roster.AddMonster在常规玩法中,你通常通过 Roster.AddMonster(...) 创建怪物,它会转发到此构造函数并替你把怪物放入队伍。
GetNameOrNickName(ILocalizer localizer)
获取这只怪物的名称或昵称。
| 参数 | 类型 | 说明 |
|---|---|---|
localizer | ILocalizer | 本地化器引用 |
返回:string —— 如果有昵称则返回本地化后的昵称,否则返回本地化后的物种名(或它是蛋时的 "Egg" 字符串)。
ChangeHP(int amount, bool forceSurvive = false)
以一个未钳制的数值改变这只怪物的 HP(内部会钳制到 [0..maxHP],若设置了 forceSurvive 则钳制到 [1..maxHP])。
| 参数 | 类型 | 说明 |
|---|---|---|
amount | int | 用于改变 HP 的未钳制数值 |
forceSurvive | bool | 是否强制怪物在此次攻击中存活? |
返回:(int NewHP, int PreviousHP, bool TriggeredForceSurvive)。
CompletelyHeal()
完全治疗这只怪物 —— 将 HP 恢复至满值、补满每个招式槽的 PP,并清除其异常状态。
IsAtMaxHP()
检查怪物是否处于满血状态。
返回:bool —— 若是则为 true。
RaiseExperience(ExperienceLookupTable lookupTable, uint amount, Action<LevelUpData> levelUpCallback)
提升这只怪物的经验值,并在过程中处理升级(及其招式习得事件)。
| 参数 | 类型 | 说明 |
|---|---|---|
lookupTable | ExperienceLookupTable | 要使用的经验查找表 |
amount | uint | 要提升的经验值数量 |
levelUpCallback | Action<LevelUpData> | 每次怪物升级时触发的回调 |
GetExperienceForNextLevel(ExperienceLookupTable lookupTable)
获取升到下一等级所需的经验值。
返回:int —— 升到下一等级所需的经验值。
ChangeFriendship(int amount, SceneInfoAsset currentScene, ILocalizer localizer)
改变这只怪物的亲密度(在钳制到 [0..255] 之前会应用地点和捕捉精灵球修正)。
| 参数 | 类型 | 说明 |
|---|---|---|
amount | int | 要改变的数量 |
currentScene | SceneInfoAsset | 我们当前所在的场景 |
localizer | ILocalizer | 本地化器引用 |
GetStats(BattleManager battleManager)
获取这只怪物当前的能力值。
| 参数 | 类型 | 说明 |
|---|---|---|
battleManager | BattleManager | 若处于战斗中则为战斗管理器引用;战斗之外请传入 null |
返回:Dictionary<Stat, uint> —— 每项能力值映射到其计算后的数值。
GetTypes(MCESettings settings, BattleManager battleManager)
获取这只怪物的属性。它们可能被临时的战斗状态修改。
返回:(MonsterType, MonsterType) —— 两个属性(单属性怪物的第二个可能为 null)。
GetAbility()
获取这只怪物的特性。
返回:Ability。
SetAbility(Ability ability)
设置这只怪物的新特性。
| 参数 | 类型 | 说明 |
|---|---|---|
ability | Ability | 新特性 |
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();
}
}