英文原文:https://opsive.com/support/documentation/ultimate-inventory-system/item/item-skills/
Item skills(项目技能) 介绍
ITEM SKILLS
由于属性系统令人难以置信的灵活性,人们经常会问如何将物品用作技能。
就我们的目的而言,技能是具有可以在同一类别内的项目之间变化的功能的项目。 这与 UI 中使用的经典类别项目操作集系统不同,其中类别中的任何项目都将运行相同的项目操作。
关于如何实施物品技能,没有正确或错误的答案。 这完全取决于您希望实现的目标以及游戏中现有的系统是什么。 以下是一些最常见的选项,但请注意它们并不是唯一可能的选项。
选项 1:使用可编写脚本的对象作为属性
第一个选项是在项目上使用可编写脚本的对象属性。 这样,您就可以在代码中的任何位置获取项目的属性并调用其函数,将项目和其他信息作为参数传递。
脚本对象的类型可以是自定义的,或者您可以简单地使用“Item Action Set(项目操作集)”。
例子:
让我们设置一个项目操作集属性。 它可以在任何属性集合上设置,尽管您很可能希望将其添加为项目定义属性。
然后,您可以通过代码获取该可编写脚本的对象并对其调用项目操作:
/// <summary>
/// Check if the action can be invoked.
/// </summary>
/// <param name="itemInfo">The item.</param>
/// <param name="itemUser">The item user (can be null).</param>
/// <returns>True if the action can be invoked.</returns>
protected bool TryUseItem(ItemInfo itemInfo, ItemUser itemUser){
//Cannot use the item if null.
if (itemInfo.Item == null) { return false; }
//Get the Attribute with your scriptable object
var attribute = itemInfo.Item.GetAttribute<Attribute<ItemActionSet>>(m_AttributeName);
//Make sure the attribute exists
if (attribute == null) { return false;}
// Get the scriptable object (in this case the Item Action Set)
var actionSet = attribute.GetValue();
if (actionSet == null) { return false; }
//Since the Item Action has a list of items we need to choose which one we will use by specifying the index (or we could have executed all the actions).
if (m_ActionIndex < 0 || actionSet.ItemActionCollection.Count >= m_ActionIndex) { return false; }
// Use the item action on a single item, or the entire amount of item?
if (m_UseOne) { itemInfo = (1, itemInfo); }
//Call the function on the scriptable Object.
actionSet.ItemActionCollection[m_ActionIndex].InvokeAction(itemInfo,itemUser);
// You may wish to remove the item once used.
if (m_RemoveOnUse) {
itemInfo.ItemCollection?.RemoveItem(itemInfo);
}
return true;
}
如果项目操作集作为属性,您可以使用“使用项目操作集属性”项目操作轻松地将项目用作 UI 中的技能。 它本质上与上面的代码示例相同。
现在,您可以从那里向每个项目添加不同的可编写脚本的对象(具有与设置为属性的基本类型相同的基本类型)。
提示:充分利用 Item User 参数来获取其游戏对象上的任何组件。 例如,获取角色的transform来生成东西是非常有用的。
选项 2:在项目对象旁边添加组件
仅当您计划用作技能的项目在游戏世界和场景中作为项目对象生成时,此选项才相关。
这个想法是通过根据绑定到项目对象的项目编辑其游戏对象上的一些组件来更改项目对象的功能。
有多种方法可以做到这一点。 一种选择是将项目对象行为处理程序与许多项目对象行为一起使用,并更改行为数组中行为的索引。
选项 3:结合选项 1 和 2
最通用的选择是这个。 在项目上使用可编写脚本的对象以获得每个项目的不同功能。
如果该功能需要附加信息/功能,则可以通过项目用户在场景中获取其组件。 例如,项目动作可以简单地调用角色的恢复健康功能。
提示:在多次获取同一组件时,使用 itemUser.gameobject.GetCachedComponent<MyComponentType>() 函数可以提高效率。