-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
feat: Stride Gamebuilder as an alternative for .NET IOC startup #2806
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 10 commits
75f1515
2372862
2f7f213
5e82aa1
7136214
aa3c9fe
257c458
e83810a
18397c5
2588b5f
f1f7b49
938a50c
c2de7f4
3b26a45
384dd48
ceaec04
8723abe
7590a43
6f02a8b
9f7bd52
848bd10
731610d
8c7eaea
415cd6f
08dc3ce
a51d8cf
1bcc2e5
c5d1c3d
1f8eba6
a315d2b
0ed0012
4718339
5d34b28
c252f6e
850659d
1432594
4e241b3
bdc76e1
0742e53
7bbfcea
4bbce68
8d64efd
4491da9
57a6118
57c0166
fa605db
a4da3df
9ea93a6
e6ac1c5
1628b23
4673500
f5b7d3c
52e78bf
cc1234a
a08ccec
f2ab0be
cf1ede1
1fc428e
b98d386
c9b912f
701d708
02c81e3
0fcec85
cfe5845
16e1996
e2a2774
9d39888
2cd09f2
4640016
f0756be
b30a7a0
da993ad
85c4fce
9315c0a
91869d4
33ab4ff
d8b3a70
6e04b89
a7c6325
9f356ff
fc3be41
4025681
51bb759
8c33853
c0e37e9
7509aa6
b09b949
2db7d4c
8088212
eec7b3a
4f1befe
53d2433
5c70930
bf03434
36a6c2a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -5,5 +5,5 @@ namespace Stride.Core.IO; | |||||
|
|
||||||
| public interface IDatabaseFileProviderService | ||||||
| { | ||||||
| DatabaseFileProvider FileProvider { get; } | ||||||
| } | ||||||
| DatabaseFileProvider FileProvider { get; set; } | ||||||
|
||||||
| DatabaseFileProvider FileProvider { get; set; } | |
| DatabaseFileProvider FileProvider { get; } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,125 @@ | ||
| using System; | ||
| using System.Collections.Generic; | ||
| using Microsoft.Extensions.DependencyInjection; | ||
| using Stride.Core; | ||
| using Stride.Core.Diagnostics; | ||
| using Stride.Core.IO; | ||
| using Stride.Games; | ||
| using Stride.Input; | ||
|
|
||
| namespace Stride.Engine.Builder; | ||
|
|
||
| /// <summary> | ||
| /// Helps build the game and preps it to be able to run after built. | ||
| /// </summary> | ||
| /// <typeparam name="T"></typeparam> | ||
Doprez marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| public class GameBuilder : IGameBuilder | ||
| { | ||
| public Dictionary<Type, object> Services { get; internal set; } = []; | ||
Doprez marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| public IServiceCollection DiServices { get; internal set; } = new ServiceCollection(); | ||
|
|
||
| public GameSystemCollection GameSystems { get; internal set; } | ||
|
|
||
| public List<LogListener> LogListeners { get; internal set; } = []; | ||
|
|
||
| public List<IInputSource> InputSources { get; internal set; } = []; | ||
|
|
||
| public DatabaseFileProvider DatabaseFileProvider { get; set; } | ||
|
|
||
| public GameBase Game { get; set; } | ||
|
|
||
| public GameContext Context { get; set; } | ||
|
|
||
| internal GameBuilder() | ||
| { | ||
| Game = new MinimalGame(null); | ||
| GameSystems = Game.GameSystems; | ||
| DiServices.AddSingleton<IServiceRegistry>(Game.Services); | ||
| Services.Add(typeof(IServiceRegistry), Game.Services); | ||
| } | ||
|
|
||
| public static GameBuilder Create() | ||
| { | ||
| return new GameBuilder(); | ||
| } | ||
|
|
||
| public virtual GameBase Build() | ||
| { | ||
|
|
||
| foreach (var logListener in LogListeners) | ||
| { | ||
| GlobalLogger.GlobalMessageLogged += logListener; | ||
| } | ||
|
|
||
| var provider = DiServices.BuildServiceProvider(); | ||
| foreach (var service in Services) | ||
| { | ||
| if (service.Key == typeof(IServiceRegistry) || service.Key == typeof(IServiceProvider)) | ||
| continue; | ||
|
|
||
| try | ||
| { | ||
| if (service.Value == null) | ||
| { | ||
| var instance = provider.GetService(service.Key); | ||
|
|
||
| if(instance == null) | ||
| { | ||
| //check if the type is inherited from another instance in the services. | ||
| foreach (var kvp in Services) | ||
| { | ||
| if (kvp.Key.IsAssignableFrom(service.Key) && kvp.Value != null) | ||
| { | ||
| instance = provider.GetService(kvp.Key); | ||
| if(instance is not null) | ||
| break; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| Game.Services.AddService(instance, service.Key); | ||
| Services[service.Key] = instance; | ||
| } | ||
| else | ||
| { | ||
| Game.Services.AddService(service.Value, service.Key); | ||
| } | ||
| } | ||
| catch (Exception ex) | ||
| { | ||
| // TODO: check if service is already registered first.' | ||
| GlobalLogger.GetLogger("GameBuilder").Error($"Failed to register service {service.Key.Name}.\n\n", ex); | ||
| } | ||
| } | ||
|
|
||
| // Add all game systems to the game. | ||
| foreach (var service in Services) | ||
| { | ||
| var system = provider.GetService(service.Key); | ||
| if (system is IGameSystemBase gameSystem && !Game.GameSystems.Contains(gameSystem)) | ||
| { | ||
| Game.GameSystems.Add(gameSystem); | ||
| } | ||
| } | ||
|
|
||
| if (Context != null) | ||
| { | ||
| Game.SetGameContext(Context); | ||
| } | ||
|
|
||
| if(InputSources.Count > 0) | ||
| { | ||
| var inputManager = Game.Services.GetService<InputManager>() ?? throw new InvalidOperationException("InputManager is not registered in the service registry."); | ||
| foreach (var inputSource in InputSources) | ||
| { | ||
| inputManager.Sources.Add(inputSource); | ||
| } | ||
| } | ||
|
|
||
| var dataBase = Game.Services.GetService<IDatabaseFileProviderService>(); | ||
| dataBase.FileProvider = DatabaseFileProvider; | ||
|
|
||
| return Game; | ||
| } | ||
| } | ||
Uh oh!
There was an error while loading. Please reload this page.