I am a little sad about the custom inventory and items that was presented to us, and how it was done/implemented.
In short, what was released was basically just a “bridge” so they can make old systems (existing items, game systems and actor-based stuff) compatible with scene graph tech, and also making the custom SG items compatible with old systems for backward compatibility.
While I understand the reasons why they choose this approach, I believe that it can be evasive and limiting long term if we want to use the provided itemization API (Besides in the future we being able to create this from scratch ourselves).
To be honest, I was already aware of how custom items were supposed to work already on lots of updates ago (I keep track of internal digest changes on each game update), so how the implementation was intended to work was not a mystery at all and I even had written example pseudo-codes with friends many months before its actual experimental release.
That being said, since some time was past after the experimental release, I think it should be time for me to comment about the topic:
The Problem:
Fortnite has lots of “blueprint items” that was carried for the entire game lifetime. These items are not compatible with Scene Graph, and recreating all these thousands of items with new APIs and functionality from scratch would take much time (developing new tech needed, interactions, functionality, time spent, interfaces, keybinds and so on). This is absurdly unpractical to do, at least on short term.
What they did:
To “address” that problem, and keep support of old non-SG item/inventory systems, they choosed to create the “Itemization” module for SG (part of UE and Fortnite modules).
But all the utility provided by this module is nothing more to provide the “bridge” between old blueprint/hardcoded tech and the new Scene Graph, so creators could keep using old items “without issues”.
Some examples of this are:
-
fort_item_pickup_component
=> This is to “bridge” old items tech actor on world (as the name says, the pickup logic, including the interface, interaction, animation and so on) -
item_component
=> Don’t need to exist at all (at least I could not find a obvious reason for), but needing to exist just to be able to interact with the custominventory_component
they made on the Itemization module -
item_details_component
anditem_icon_component
=> To “bridge” with old items tech providing data-driven details, such as having a hardcoded place where the internal systems can “look” the icon and text data to display on interfaces -
item_category
=> Also only needed to exist to provide existing old hardcoded sytems the rules (such as pickaxe slot, traps, ammo, and even creative phone during edit mode) -
inventory_component
=> Only needed to exist to be able to use as bridge to hardcoded data definitions and internal old systems/logic, such as attaching to non exposed game rules, input mappings and so on… -
fort_inventory_component
andfort_inventory_XXXX_component
=> Subclasses of base inventory, specifically made for fortnite internal systems, also with the reason of providing hardcoded data driven and/or compatibility with old systems and logic (such as the base game config and container data) -
Itemization Configuration Asset
=> This is the “root” itemization configuration on the experience, when the island is set to use one, it will replace the old items config (quickbar/inv screens and keybinds) with the custom data-driven configuration defined inside the asset.
While I believe that we will be able to make our own variants of this asset on the future, this is still just another way they made to bridge old tech to the new itemization system in a hardcoded way (also explaining the need of other components above to link on internal systems).
These same rules also applies to unreleased/internal components:
item_ability_component
,item_attributes_component
,item_rarity_component
,item_type_component
=> All these just exist to provide bridges to non-SG tech, such as data-driven “where to look for this data” on non existing systems (for example to display item info on UI).
Basically all this were already possible before. The current provided Itemization API is just wacky workarounds with basically no new features.
Inventories are basically just container classes that holds data and interactions written in logic directly on code, other components that are also data-only we can make it all from scratch. The same with item definitions itself (both inside inventories or dropped on the world), we could do that from scratch by using other provided components, such as interactable_component for example.
While I understand the needs of this design choice on short term, I still think that the showcased state of custom items were made as an excuse like “implement items as fast as possible” while other proper scene graph tech and editor utility is not finished, or not ready for the public yet to make itemization in a better way.
The real utility to make custom items that were not possible before was not given at all, this include already planned unreleased features and future components tech, some examples are:
-
screen_space_ui_display_component
=> Used to render a UI on player screen, but anchored to a world position (to recreate thefort_item_pickup_component
interface) -
presentation_component
andreplication_component
=> Used to define custom replication and visibility rules (ex. make item visible or interactive to only certain players) -
item_attachment_component
=> Used to attach entities in a specific way (such as to bones or sockets of a skeletal mesh, like to make player “hold” the item). This is also not even something that is item exclusive functionality, for example, the component could have been named justattachment_component
and being part of the core tech instead of itemization tech. -
item_owner_pose_modifier_component
=> Used to provide modifiers to the player current pose while holding or having the item. This is also not needed to be related to itemization, should be part of core functionality to assign custom poses to the player regardless of being items or not. This is one of the most important tech needed to make new gameplay (together with other future planned tech such as skeletal mesh components and animation sequences) -
Property Interfaces
=> Data Assets to provide data-driven functionality between UMG Widgets and Verse, allowing more complex, detailed and powerful interfaces being made (since widgets in verse don’t have all properties and functionality that the same widgets in UMG has). This is used for everything needed, from the in-world pickup UI, to the Quickbar, Specific Item Details (such as durability and cooldown), Entire Inventories and other HUD screens as the developer need and/or want. -
Input Mapping Contexts
andInput Actions
=> This is to manage player input (such as keybinds, values, priority and per-platform rules), providing the interaction that can be used in verse to make anything wanted (user interface shortcut for buttons, ability keybinds for items and so on). Currently we have some VERY limited epic-curated actions and mappings, without possibility of modifying, disabling, making new ones or even configuring priority. This is also one of the most important tech to make custom items and abilities possible. -
Any data-only component (such as item icon, item details, rarity, type, attributes) can already be made by just making our own simple component to hold it, or even attaching the data somewhere else outside a component! The same for other functional behaviors such as attaching input mappings for example.
Again, basically all of the current Itemization API is just to provide internal bridges with old tech in a unflexible hardcoded way.
With the combination of the components and tech listed above (all mentioned already exist but is internal or unfinished), we could basically recreate the entire Itemization modules from scratch! And even better: we would not be limited by the current problems of itemization, such as relying on epic adding fields and customization for properties or functionality (One example is: we can’t change how the pickup popup ui looks, gravity and anims).
With the current state and how it was implemented, we will always be relying on epic providing the functionality or exposing more things to interact with the internal/hardcoded API…
Sure, Epic can improve the itemization module over time, adding more flexibility and features, but it would still be on Epic hands, instead of being on creators hand (which is totally possible), where epic could have provided only the necessary hardcoded data on their part (such as existing items and native fortnite inventories), instead of making the entire itemization tech relying on their own “core module” for all creator implementations of it even when not needed.
Don’t get me wrong, I am not talking that epic providing templates or a guide on how to make custom items are useless, but it could be done completely differently while also being more flexible. I understand the needs to keep support to old existing items/weapons, but making the entire scene graph itemization as a bridge for the old stuff was not a good thing for flexibility, and some details seems to even go against what scene graph promises…
Would be much better to just finish these mentioned internal components, and giving examples using them to build the custom items and inventories with it, instead of doing all the wacky workaround for backwards compatibility that could have been done in other less intrusive ways.
Obviously, in the future we could also do our own itemization module from scratch if we wanted (like using the components mentioned), but that would lead to more and more problems due to incompatibility with the epic given itemization, fragmentation of the functionality and more side effects of that decision later on.
If we compare with Creative 1.0 Devices, we have not received entities/components with the hardcoded devices functionality, as epic plans to deprecate the current actor devices over time and port the functionality to their own core engine components in the future so we can make it from scratch (While epic also can provide templates and examples of devices if wanted). Why they have done it differently with items, in a even more intrusive way?
They also removed the bridge_component
which was available before (A component that allowed us to attach blueprint actors as child of scene graph entities), with the exact same excuse that bridging actors and blueprint functionality was not in fit with scene graph design desicions on long term and they did not wanted to push that usage.
The same can be thought about backwards compatibility of items: Instead of making hardcoded api to bridge them, why not doing the inverse? Such as working on new necessary tech/components mentioned to make the core functionality. And, to add support for old blueprint items while not ported to scene graph, we could have other alternatives such as making all fort items classes in verse holding interfaces with the item details on it (such as icon, name, category, durability and so on).
This way we could read the item data from the old system if we want to make it work with new systems made by ourselves, not needing any of the “bridge” related tech on core SG functionality, and only having the exposed items and its data, even being able to be something like /Fortnite.com//Temporary/Itemization
to be deprecated on the future if wanted…
This would be fine to epic having the hardcoded functionality related to backwards compatibility to blueprint items, while still providing the flexibility of allowing creators decide how they want to design their items, inventories and which features/usability these can have.
The existing “core tech” of item_component
, inventory_component
and related utility could have just been a example/template project with the implementation in raw “user written” verse to be reused across projects.
Conclusion: While I understand most of the reasons behind lots of these decisions, I think that the current implementation can cause a chain-reaction as time goes on, due to the core tech being ruled by internal epic-driven functionality instead of relying on non internal implementations (such as only bridging the items itself). The current state has lots of room to improve, limitations to address, and I think that if epic communicated better with what developers expect before deciding the priority or design of some features, it would be much better for the future of the platform.
For example, if someone asked me if I prefered “itemization template module” sg tech, or the unfinished components that I listed above, I would have answered that I prefered the components mentioned, since they were providing more powerful usage cases, and would also cover custom raw implementation of basically all needed custom items (and even weapons) functionality.