英文原文:https://opsive.com/support/documentation/ultimate-inventory-system/item/item-stats/
Item stats(项目统计) 介绍
ITEM STATS
在许多游戏中,可以装备和/或使用物品来影响角色统计数据和/或角色携带的武器。 使用属性系统,您可以在物品上添加任何数据,如何使用这些数据完全取决于所制作的游戏类型。
有关引擎内的示例,请参阅功能场景“14 获取设置属性统计(带代码)”,其中展示了如何获取和设置属性值,以及如何在自己的代码中使用属性来计算统计信息。
这里有一些可以启发您的解决方案/想法,它们并不是唯一可用的选择,因此不要感到受到它们的限制。
项目集合或项目列表 Float 和 Int 的总和
ItemCollection 内置了一个函数,用于获取与集合中所有项目同名的所有 Int 和 Float 属性的总和。 这是获取装备统计数据总和的非常简单的方法。
var attributeName = "MyStat";
// Get the inventory reference.
var inventory = InventorySystemManager.GetInventoryIdentifier(1).Inventory;
var itemCollection = inventory.GetItemCollection("MyItemCollection");
var statSum = itemCollection.GetFloatSum(attributeName);
在某些情况下,您可能有一个 Item、ItemInfo、ItemStack 或 ItemDefinition 的列表。 在这种情况下,您可以使用 AttributeUtility 静态类来获取属性的总和。
var attributeName = "MyStat";
// Get the inventory reference.
var inventory = InventorySystemManager.GetInventoryIdentifier(1).Inventory;
var itemCollection = inventory.GetItemCollection("MyItemCollection");
var statSum = AttributeUtility.GetFloatSum(attributeName, itemCollection.GetAllItemStacks());
当然,您可能希望使用更高级的功能来计算统计数据。 为此,您可以手动获取属性来计算统计数据,无论是百分比、特殊效果(毒药、火焰等)还是其他任何东西。 在此处了解有关属性的更多信息。
角色统计(装备)
影响角色统计数据的最明显方式是装备物品时。 Equiper 组件是可视化装备物品的良好开端,它还有一个非常方便的事件,在物品装备或未装备时执行。 收听“EventNames.c_Equipper_OnChange”事件以了解何时必须更新角色统计数据。 演示场景中实际使用了与下面的解决方案非常相似的解决方案。
/// <summary>
/// Example of character stats.
/// </summary>
public class ExampleCharacterStats
{
protected IEquipper m_Equipper;
protected int m_BaseMaxHp;
protected int m_BaseAttack;
protected int m_BaseDefense;
protected int m_MaxHp;
protected int m_Attack;
protected int m_Defense;
public int BaseMaxHp => m_BaseMaxHp;
public int BaseAttack => m_BaseAttack;
public int BaseDefense => m_BaseDefense;
public int MaxHp => m_MaxHp;
public int Attack => m_Attack;
public int Defense => m_Defense;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="baseStats">The base stats.</param>
/// <param name="equipper">The equipper.</param>
public ExampleCharacterStats(int maxHp, int attack, int defense, IEquipper equipper)
{
m_BaseMaxHp = maxHp;
m_BaseAttack = attack;
m_BaseDefense = defense;
m_Equipper = equipper;
if (m_Equipper != null) {
EventHandler.RegisterEvent(m_Equipper, EventNames.c_Equipper_OnChange, UpdateStats);
}
UpdateStats();
}
/// <summary>
/// Update the character stats.
/// </summary>
public void UpdateStats()
{
m_MaxHp = BaseMaxHp + m_Equipper.GetEquipmentStatInt("MaxHp");
m_Attack = BaseAttack + m_Equipper.GetEquipmentStatInt("Attack");
m_Defense = BaseDefense + m_Equipper.GetEquipmentStatInt("Defense");
}
}
Equipper 附带一个有用的 GetEquipmentStat<Float/Int>(“AttributeName”) 函数,该函数可查找所有装备物品的属性并将它们添加到一个值中。
每次重新计算统计数据非常重要,因为在游戏中一遍又一遍地添加和删除浮点值可能会由于浮点精度误差而开始偏离正确值。 这就是为什么建议将基础统计数据与武器统计数据分开。
当然,您可以手动获取属性来计算统计数据,而不是使用 GetEqupimentStat<Float/Int>(“AttributeName”) 函数,无论是百分比、特殊效果(毒药、火焰等),还是 真的什么都可以。 在此处了解有关属性的更多信息。
您可以在此处了解有关装备组件以及如何装备武器的更多信息。
请注意,您可以自由地从头开始创建自己的 Equiper 脚本,您不受我们提供的解决方案的限制。
武器统计(物品绑定)
有时,您可能对更改武器统计数据感兴趣,而不是更改角色统计数据。 根据您的游戏,造成伤害的对象可以是角色或武器。
影响武器统计数据的最简单选项是使用项目绑定对象。 当生成/装备武器游戏对象时,强烈建议武器具有可用于将游戏对象绑定到项目的项目对象组件。 当绑定发生时,将执行“EventNames.c_ItemObject_OnItemChanged”。 您可以监听此事件来处理绑定到装备物品的新物品。 您可以使用此事件来更改模型、视觉效果、声音等……当然它也可以用于更改统计数据。
为了方便起见,我们添加了项目绑定组件,该组件允许您将绑定项目的属性值绑定到武器上的任何组件。 这可以完全在检查器中完成,无需一行代码! 要了解有关 Item Binding 对象的更多信息,请转到此处
消耗品统计(项目操作)
有时,不可装备的物品可以用来影响统计数据。 一个很好的例子是食物,它可以用来治疗角色或给予 X 秒的奖励。 为此,建议结合使用自定义项目操作和单体行为。 项目操作可用于调用自定义 Monobehavior 上的函数。 例如,“Heal Item Action”调用自定义“CharacterHealth”组件上的“Heal”函数。
要了解有关项目操作的更多信息,请访问此处,要了解有关如何将项目用作技能的更多信息,请访问此处
其他/自定义
还有许多其他方式可以使用物品来影响玩家角色统计数据和/或角色装备的武器。 例如,装备弓并交换箭以产生不同的效果(正常、火焰、毒药等)。
这些更高级的用例需要更多的自定义功能,但项目和属性系统比从头开始实现此类系统更容易扩展。