IN THIS ARTICLE
Spawning Player Entities
In most networking multiplayer games, when a player joins a session, the host must spawn an
autonomous networked entity for the player. Likewise, when a player leaves, the host must remove the entity and clean up. In Open 3D Engine (O3DE), you can set up your spawning logic in this way, or handle join and leave events in other ways by using OnPlayerJoin
and OnPlayerLeave
events, which the IMultiplayerSpawner
interface of the Multiplayer Gem provides. Alternatively, to get started sooner, you can bypass programming these events and use the
Simple Network Player Spawner component, which sets up OnPlayerJoin
and OnPlayerLeave
for this common use case.
IMultiplayerSpawner
interface
IMultiplayerSpawner is an
AZ::Interface<T>
that provides a mechanism to tell the Multiplayer Gem what to spawn and where to spawn it when a player joins a session. IMultiplayerSpawner
also provides a hook to clean up when a player leaves. All multiplayer games should provide an implementation to handle the events delivered for player join and player leave events.
Player join events
A player is defined as having joined a session when either:
- A client application begins hosting a session, in which case the host may need to spawn a new player entity.
- A client connects to an ongoing hosted session.
The OnPlayerJoin
method of IMultiplayerSpawner
provides a hook for when the server may want to spawn an autonomous player prefab on the behalf of a user. It takes both an identifier and custom data provided by the user, and the implementation is required to determine which prefab to spawn and its world location. For example, data provided with the connection could be used to select a specific character or team.
OnPlayerJoin
is expected to return a NetworkEntityHandle
, making it the caller’s responsibility to instantiate a networked prefab for the user. The Multiplayer Gem then takes the returned NetworkEntityHandle
and both marks it as autonomous and associates it with the player’s connection.
Player leave events
A player is having defined as left a session when a client disconnects from the server. Unlike with player connections, there is no special case for when a client stops hosting their own session - one of the steps should always be disconnecting all clients before shutting down the server.
The OnPlayerLeave
method of IMultiplayerSpawner
provides a hook so that when the client disconnects, the server can clean up any entities that were spawned for the client. OnPlayerLeave
takes an entity handle to the prefab spawned by OnPlayerJoin
so that the player entity can be removed. It also takes the replication set for the connection which allows the server to remove associated entities as well (for example, objects deployed by the leaving player).
OnPlayerLeave
also takes a disconnect reason which allows responding to different kinds of disconnects. For example, it may be undesirable to clean up objects if a player times out if they can attempt to reconnect to the session.
Examples in MultiplayerSample Project
A practical example of an implementation for a spawner is
MultiplayerSampleSystemComponent
in
MultiplayerSample Project . MultiplayerSample Project implements a “round robin”-style spawning system that gathers entities with NetworkPlayerSpawnerComponents
. MultiplayerSampleSystemComponent
then queries that system during the OnPlayerJoin
event. The OnPlayerLeave
event simply marks the entity that’s passed in for removal.
For more information about MultiplayerSample Project, refer to the MultiplayerSample README .
Simple Player Spawning component
The Simple Network Player Spawner level component provides a straightforward way to set up OnPlayerJoin
and OnPlayerLeave
events. It implements a common use case for handling those events, specifically: when a player joins, create a networked entity for that player, and when a player leaves, remove that entity.
For more information, refer to Simple Network Player Spawner component.