Unreal Client Guide #
The official Unreal module is C++ client which handles all communication in real-time with the server. It implements all features in the server and is written with C++11.
The Unreal client is open source on GitHub. Please report issues and contribute code to help us improve it.
Full API documentation #
For the full API documentation please visit the API docs.
Download #
The client SDK can be downloaded from the GitHub releases. You can download nakama-unreal-$version.zip
.
For upgrades you can see changes and enhancements in the CHANGELOG before you update to newer versions.
Setup #
To use nakama-unreal in your Unreal project, you’ll need to copy the nakama-unreal files you downloaded into the appropriate place. To do this:
- Open your Unreal project folder (for example,
D:\\MyUnrealProject\\
) in Explorer or Finder. - If one does not already exist, create a
Plugins
folder here. - Copy the
Nakama
folder from the nakama-unreal release you downloaded, into thisPlugins
folder. - Now, edit your project’s
.Build.cs
file, located in the project folder underSource\\[ProjectFolder]
(for example,D:\\MyUnrealProject\\Source\\MyUnrealProject\\MyUnrealProject.Build.cs
). Add this line to the constructor:
PrivateDependencyModuleNames.AddRange(new string[] { "Nakama" });
So, you might end up with the file that looks something like this:
|
|
At this point, you are done. Restart Unreal. After it compiles things, open Edit->Plugins and scroll to the bottom. If all went well, you should see HeroicLabs.Nakama listed as a plugin.
Setup for Android projects #
Android uses a permissions system which determines which platform services the application will request to use and ask permission for from the user. The client uses the network to communicate with the server so you must add the “INTERNET” permission to AndroidManifest.xml
.
|
|
Usage #
Include nakama header.
|
|
Use nakama namespace.
|
|
The client object is used to execute all logic against the server.
|
|
Tick #
The tick
method pumps requests queue and executes callbacks in your thread. You must call it periodically, the Tick
method of actor is good place for this.
|
|
Without this the default client and real-time client will not work, and you will not receive responses from the server.
Authenticate #
With a client object you can authenticate against the server. You can register or login a [user]((../../concepts/user-accounts/) with one of the authenticate options.
To authenticate you should follow our recommended pattern in your client code:
- Build an instance of the client.
|
|
- Authenticate a user. By default Nakama will try and create a user if it doesn’t exist.
|
|
It’s good practice to cache a device identifier on Android when it’s used to authenticate because they can change with device OS updates.
In the code above we use authenticateDevice()
but for other authentication options have a look at the code examples.
Sessions #
When authenticated the server responds with an auth token (JWT) which contains useful properties and gets deserialized into a NSession
object.
|
|
It is recommended to store the auth token from the session and check at startup if it has expired. If the token has expired you must reauthenticate. The expiry time of the token can be changed as a setting in the server.
Send requests #
When a user has been authenticated a session is used to connect with the server. You can then send messages for all the different features in the server.
This could be to add friends, join groups, or submit scores in leaderboards. You can also execute remote code on the server via RPC.
All requests are sent with a session object which authorizes the client.
|
|
Have a look at other sections of documentation for more code examples.
Real-time client #
The client can create one or more real-time clients. Each real-time client can have it’s own event listener registered for responses received from the server.
The socket is exposed on a different port on the server to the client. You’ll need to specify a different port here to ensure that connection is established successfully.
|
|
Don’t forget to call tick
method. See Tick section for details.
You can use real-time client to send and receive chat messages, get notifications, and matchmake into a multiplayer match. You can also execute remote code on the server via RPC.
To join a chat channel and receive messages:
|
|
There are more examples for chat channels here.
Handle events #
A real-time client has event handlers which are called on various messages received from the server.
|
|
Event handlers only need to be implemented for the features you want to use.
Callbacks | Description |
---|---|
onDisconnect | Handles an event for when the client is disconnected from the server. |
onNotification | Receives live in-app notifications sent from the server. |
onChannelMessage | Receives real-time chat messages sent by other users. |
onChannelPresence | Receives join and leave events within chat. |
onMatchState | Receives real-time multiplayer match data. |
onMatchPresence | Receives join and leave events within real-time multiplayer. |
onMatchmakerMatched | Received when the matchmaker has found a suitable match. |
onStatusPresence | Receives status updates when subscribed to a user status feed. |
onStreamPresence | Receives stream join and leave event. |
onStreamState | Receives stream data sent by the server. |
Logging #
Client logging is off by default.
To enable logs output to console with debug logging level:
|
|
Errors #
The server and the client can generate logs which are helpful to debug code.
To enable client logs see Logging section.
In every request in the client you can set error callback. It will be called when request fails. The callback has NError
structure which contains details of the error:
|
|
The client writes all errors to logger so you don’t need to do this.
Client reference #
You can find the C++ Client Reference here.