THE INVENTORY SYSTEM'S V1.72 UPDATE
AC的Inventory 系统作为其v1.72.0更新的一部分进行了全面重构。本页既概述了它如何从API级别工作,也为希望将自定义脚本移植到新系统的开发人员提供了指南。
输入Inventory Manager的Inventory Item数据存储在InvItem类中。
在v1.72.0之前,每当玩家处理一个物品时,都会在运行时生成这个类的副本——无论是在他们自己的Inventory 中,还是在Crafting中,或是放在Container中。这意味着,在脚本中处理这个类时,对InvItem的实际来源存在歧义。此类InvItem类存储在Lists中,并通过外部函数进行修改。
新的Inventory 系统对此做了两个根本性的改变:
- 在运行时处理Inventory 时,原始InvItem类将被单独保留。而是创建一个引用InvItem的InvInstance类。这个新类有额外的属性来记录它所代表的Item的数量、选择模式(Use vs Give)等等。虽然原始的InvItem类仍然可以访问,但这意味着它的来源不再模棱两可。
- 每当记录物品列表时,无论是用于玩家的Inventory 、Crafting还是Container,它们都会被放置在专用的InvCollection类中。InvCollection类具有内部函数来处理Item的添加和删除,以及Item从一个集合转移到另一个集合。这就不需要根据访问的Item设置多组修改功能。
与以前的版本一样,可以通过以下方式获取当前选定的Item:
1 | AC.KickStarter.runtimeInventory.SelectedItem; |
但是,这不再表示该item的运行时实例。为此,我们可以使用:
1 | AC.KickStarter.runtimeInventory.SelectedInstance; |
需要注意的是,由于项目实例可能无效,例如“计数”为零,因此在访问之前检查其有效性很重要。这可以通过以下方式实现:
1 | InvInstance myInvInstance; |
要获取InvInstance类的关联InvItem,请执行以下操作:
1 | myInvInstance.InvItem; |
InvInstance也是Inventory 交互功能的新家:
1 | myInvInstance.Select (); |
要获取玩家的Inventory项目集合:
1 | KickStarter.runtimeInventory.PlayerInvCollection; |
或者
1 | KickStarter.player.Inventory; |
要获取Container的集合,请执行如下操作:
1 | myContainer.InvCollection; |
使用InvCollection类,我们可以通过引用其索引来访问各个实例,例如:
1 | InvInstance myInvInstance = KickStarter.player.Inventory.GetInstanceAtIndex (indexValue); |
InvCollection类具有许多函数和属性,可以访问和修改其内容。有关更多信息,请参阅Scripting guide中的条目。
在选择和修改Inventory项时触发的自定义事件仍然与以前的版本保持一致,但是:InvItem参数现在引用Inventory Manager中的原始项目。如果我们想访问受影响的运行时InvInstance,可以使用以下替代方法:
1 | OnInventoryAdd_Alt (InvCollection invCollection, InvInstance invInstance, int amount) |