IN THIS ARTICLE
System Components in O3DE
System components are similar to other components in the component entity framework of Open 3D Engine (O3DE). However, instead of creating game entity behavior, they control the behavior of the engine itself. System components are first-class elements of the game engine and are included at a deep level early in the initialization process. System components are registered onto the main
Az::Module
class of a Gem, activated when the Gem is loaded, and deactivated when the Gem is unloaded.
Like any O3DE component, a system component can provide services and can depend on or require other system component services. O3DE provides precise control over the order of engine initialization and system dependencies.
When you author system components, follow the best practices for component authoring. For example, your system components should use:
- The EBus system to expose their interfaces.
- Reflection contexts to serialize and edit settings.
- The AZ::Component class to activate or deactivate the system component.
Important:Just like game components, system components often provide request and notification buses. However, because system components are global systems, they should not specify IDs for their buses like game components. Game developers should be able to call your system’s EBuses without having to deal with or know about the system entity that contains all system components.
For an example of a Gem that provides system components, the HttpRequestor
Gem that O3DE ships with has an implementation of a system component referenced throughout this topic. The Gem source is located at Gems/HttpRequestor/Code
in the O3DE source.
Creating a system component in a Gem
O3DE enables the creation of custom system components through Gems and AZ modules. Gems are a specialization of AZ modules. Most O3DE games organize their game code in one or more Gems. These Gems can contain system components that integrate with the game engine in addition to runtime and editor components for use with game entities.
When you create a system component as part of a Gem, follow these requirements:
- The Gem’s
GetRequiredSystemComponents()
function must return the system component. - The
<GemName>Bus.h
file goes under theCode/Include/<GemName>
directory. - The component source files go under the
Code/Source
directory.
Making a component a system component
After you create the code for your component, add it to your project’s system entity to make it a system component. Use the GetRequiredSystemComponents()
function to add your component to the system entity for your project during application startup.
The following example is from HttpRequestorModule.cpp
.
#include "HttpRequestorSystemComponent.h"
#include <AzCore/Module/Module.h>
namespace HttpRequestor
{
class HttpRequestorModule
: public AZ::Module
{
public:
AZ_RTTI(HttpRequestorModule, "{FD411E40-AF83-4F6B-A5A3-F59AB71150BF}", AZ::Module);
HttpRequestorModule()
: AZ::Module()
{
// Push results of [MyComponent]::CreateDescriptor() into m_descriptors here.
m_descriptors.insert(m_descriptors.end(), {
HttpRequestorSystemComponent::CreateDescriptor(),
});
}
/**
* Add required SystemComponents to the SystemEntity.
*/
AZ::ComponentTypeList GetRequiredSystemComponents() const override
{
return AZ::ComponentTypeList{
azrtti_typeid<HttpRequestorSystemComponent>(),
};
}
};
}
...