Tested on: Windows 10 x64 and Linux x64
Disclaimer: This project is NOT affiliated with Epic Games Inc or Godot Engine. It doesn't endorse Epic Online Services. This project and sample Godot scenes are provided solely for educational purposes and may or may not comply with Epic Games' Design Guidelines, if you plan to release a game make sure you read the Guidelines and any other steps needed to release a public game like asking for user consent, option to delete user data, website with privacy policy and license, etc.
The main branch is for Godot 4
The godot3-mono branch is for Godot 3 Mono (C#) (un maintained)
Making this project took a lot of time and effort, reading the Epic Online Services documentation countless times and testing each method in Godot. I would really appreciate if you could support the project in any way.
Join the Discord server for discussing suggestions or bugs: 3ddelano Cafe
This project uses GDExtension to wrap the Epic Online Services C SDK so that it can be easily used in Godot using GDScript, C#, etc with similar class hierarchy and static type support. It makes use of signals for sending events like user login, logout, achievement unlock, etc.
This is a regular plugin for Godot 4.x
. To install the plugin follow the steps below:
- Goto the Releases section and download the latest release
- Extract the zip file and copy the
addons/epic-online-services-godot
folder into theaddons/
folder in of your project. - Goto
Project->Project Settings->Plugins
and enable theEpic Online Services Godot 4.x
plugin. - You can now use the plugin. Head to the Documentation for more information on how to use the plugin. Use the below simple script.
# In main script extends Node func _ready() -> void: # Initialize the SDK var init_options = EOS.Platform.InitializeOptions.new() init_options.product_name = "PRODUCT_NAME_HERE" init_options.product_version = "PRODUCT_VERSION_HERE" var init_result := EOS.Platform.PlatformInterface.initialize(init_options) if init_result != EOS.Result.Success: print("Failed to initialize EOS SDK: ", EOS.result_str(init_result)) return # Create platform var create_options = EOS.Platform.CreateOptions.new() create_options.product_id = "PRODUCT_ID_HERE" create_options.sandbox_id = "SANDBOX_ID_HERE" create_options.deployment_id = "DEPLOYMENT_ID_HERE" create_options.client_id = "CLIENT_ID_HERE" create_options.client_secret = "CLIENT_SECRET_HERE" create_options.encryption_key = "ENCRYPTION_KEY_HERE" # Enable Social Overlay on Windows if OS.get_name() == "Windows": create_options.flags = EOS.Platform.PlatformFlags.WindowsEnableOverlayOpengl var create_result := EOS.Platform.PlatformInterface.create(create_options) if not create_result: print("Failed to create EOS Platform") return # Setup Logs from EOS EOS.get_instance().logging_interface_callback.connect(_on_logging_interface_callback) var res := EOS.Logging.set_log_level(EOS.Logging.LogCategory.AllCategories, EOS.Logging.LogLevel.Info) if res != EOS.Result.Success: print("Failed to set log level: ", EOS.result_str(res)) _anon_login() func _on_logging_interface_callback(msg) -> void: msg = EOS.Logging.LogMessage.from(msg) as EOS.Logging.LogMessage print("SDK %s | %s" % [msg.category, msg.message]) func _anon_login() -> void: # Login using Device ID (no user interaction/credentials required) var opts = EOS.Connect.CreateDeviceIdOptions.new() opts.device_model = OS.get_name() + " " + OS.get_model_name() EOS.Connect.ConnectInterface.create_device_id(opts) await EOS.get_instance().connect_interface_create_device_id_callback var credentials = EOS.Connect.Credentials.new() credentials.token = null credentials.type = EOS.ExternalCredentialType.DeviceidAccessToken var login_options = EOS.Connect.LoginOptions.new() login_options.credentials = credentials var user_login_info = EOS.Connect.UserLoginInfo.new() user_login_info.display_name = "User" login_options.user_login_info = user_login_info EOS.Connect.ConnectInterface.login(login_options) EOS.get_instance().connect_interface_login_callback.connect(_on_connect_interface_login_callback) func _on_connect_interface_login_callback(data: Dictionary) -> void: if not data.success: print("Login failed") EOS.print_result(data) return print_rich("[b]Login successfull[/b]: local_user_id=", data.local_user_id)
- Godot Engine 4.x (Get it here Godot Engine Download)
- Epic Online Services C SDK (Download from Epic Developer Portal)
- Make sure you have accepted the Terms and Conditions for Epic Online Services
- A product registered with Epic Games Services (Make one for free Epic Developer Portal)
To develop this plugin, follow the below steps:
-
Download/clone the repository.
-
Extract the
EOS C SDK
zip downloaded from Epic Games, rename it toeos-sdk
and paste it in thethirdparty/
folder. Refer to the below folder structure. -
Follow the steps to generate the GDExtension bindings for C++ based on this tutorial. Now you should have dumped the GDextension API interface and built the
godot-cpp
library. -
Build the GDExtension plugin in debug mode (With debug symbols)
# In root folder scons platform=<platform> -j4 target=template_debug dev_build=yes
Eg.
scons platform=windows -j4 target=template_debug dev_build=yes
-
Build the GDExtension plugin for release (Optimized)
# In root folder scons platform=windows -j4 target=template_release
-
The built GDExtension library will be in the
addons/epic-online-services-godot/bin/
folder.
The sample Godot project is located in the Sample folder
-
Clone/Download the repo.
-
Download the latest release from the Releases section and replace the existing
/addons/epic-online-services-godot
with the one from the Release (this includes the built shared libraries). -
Copy your credentials (
Product Id
,Sandbox Id
,Deployment Id
,Client Id
,Client Secret
) of your Epic Games "Product" from the Epic Games Dev Portal and paste them inMain.gd
script in the relevant sections. The encryption key is a random 64 character long string. These credentials need to be kept as private as possible. One way is to make sure to encrypt all scripts when exporting the final game. (See Compiling with script key encryption) -
Configure your Product on the EOS Dev Portal with the following configuration:
- In the
Client Policies
section inProduct Settings
, enable all the features exceptConnect
(Disabled by Epic) - In the
Permissions
section ofEpic Account Services
, enable all three:Basic Profile
,Online Presence
andFriends
. - (Optional if you want some pre-made achievements)
In the
Achievements
section inGame Services
, use theBulk Import
option and import theHelloProduct.zip
file located atres://HelloProduct.zip
If you want to use the Account Portal
login option in Epic Online Services, you need to bootstrap the Godot/Game executable as needed by EOS-SDK 1.15
and greater. See Redistributable Installer
A sample of the generated .ini
file for the Godot Editor is shown below (during game development):
ApplicationPath=Godot_v4.0.0-stable_win64.exe
WorkingDirectory=
WaitForExit=0
NoOperation=0
Follow the instructions in Running the service for local development and:
-
During game development
Bootstrap the Godot Editor executable (eg.
Godot_v4.0.0-stable_win64.exe
) to test theAccount Portal
login -
After exporting the game
Bootstrap the exported game executable (eg.
My Amazing Game.exe
)
- Auth Interface
- Implementation
- Sample
- Achievements Interface
- Implementation
- Sample
- Connect Interface
- Implementation
- Sample
- CustomInvites Interface
- Implementation
- Sample
- Friends Interface
- Implementation
- Sample
- Stats Interface
- Implementation
- Sample
- UserInfo Interface
- Implementation
- Sample
- Leaderboards Interface
- Implementation
- Sample
- KWS Interface
- Implementation
- Sample (No general access yet)
- Lobby Interface
- Implementation
- Sample
- Metrics Interface
- Implementation
- Sample
- Mods Interface
- Implementation
- Sample
- P2P Interface
- Implementation
- Sample
- PlayerDataStorage Interface
- Implementation
- Sample
- Presence Interface
- Implementation
- Sample
- ProgressionSnapshot Interface
- Implementation
- Sample
- Reports Interface
- Implementation
- Sample
- RTC Interface
- Implementation
- Sample
- Sanctions Interface
- Implementation
- Sample
- Sessions Interface
- Implementation
- Sample
- TitleStorage Interface
- Implementation
- Sample
- UI Interface
- Implementation
- Sample
- Ecom Interface
- Implementation
- [] Sample (Needs Epic Games Store access)
- AntiCheatServer Interface
- Implementation
- Sample
- AntiCheatClient Interface
- Implementation
- Sample
- Version Interface
- Implementation
- Sample