com.wallstop-studios.dxmessaging 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/format-on-demand.yml +2 -2
- package/.github/workflows/json-format-check.yml +1 -1
- package/.github/workflows/markdown-json.yml +1 -1
- package/.github/workflows/markdownlint.yml +1 -1
- package/.github/workflows/npm-publish.yml +1 -1
- package/.github/workflows/prettier-autofix.yml +2 -2
- package/.github/workflows/yaml-format-lint.yml +1 -1
- package/Docs/Advanced.md +26 -1
- package/Docs/Comparisons.md +1229 -146
- package/Docs/Compatibility.md +27 -0
- package/Docs/DesignAndArchitecture.md +41 -34
- package/Docs/EmitShorthands.md +34 -0
- package/Docs/Helpers.md +1 -1
- package/Docs/Index.md +28 -25
- package/Docs/Install.md +29 -6
- package/Docs/Integrations/Reflex.md +292 -0
- package/Docs/Integrations/Reflex.md.meta +7 -0
- package/Docs/Integrations/VContainer.md +324 -0
- package/Docs/Integrations/VContainer.md.meta +7 -0
- package/Docs/Integrations/Zenject.md +333 -0
- package/Docs/Integrations/Zenject.md.meta +7 -0
- package/{Editor/Analyzers/WallstopStudios.DxMessaging.SourceGenerators.pdb.meta → Docs/Integrations.meta} +2 -1
- package/Docs/InterceptorsAndOrdering.md +371 -17
- package/Docs/ListeningPatterns.md +206 -0
- package/Docs/MessageBusProviders.md +496 -0
- package/Docs/MessageBusProviders.md.meta +7 -0
- package/Docs/MessageTypes.md +27 -0
- package/Docs/MigrationGuide.md +45 -0
- package/Docs/Patterns.md +286 -0
- package/Docs/Performance.md +9 -9
- package/Docs/QuickReference.md +31 -0
- package/Docs/RuntimeConfiguration.md +407 -0
- package/Docs/RuntimeConfiguration.md.meta +7 -0
- package/Docs/UnityIntegration.md +3 -1
- package/Docs/VisualGuide.md +206 -157
- package/Editor/CustomEditors/MessagingComponentEditor.cs +15 -6
- package/README.md +148 -26
- package/Runtime/AssemblyInfo.cs +4 -0
- package/Runtime/Core/Extensions/MessageBusExtensions.cs +253 -0
- package/Runtime/Core/Extensions/MessageBusExtensions.cs.meta +12 -0
- package/Runtime/Core/Extensions/MessageExtensions.cs +137 -89
- package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs +23 -0
- package/Runtime/Core/MessageBus/GlobalMessageBusProvider.cs.meta +11 -0
- package/Runtime/Core/MessageBus/IMessageBusProvider.cs +14 -0
- package/Runtime/Core/MessageBus/IMessageBusProvider.cs.meta +11 -0
- package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs +18 -0
- package/Runtime/Core/MessageBus/IMessageRegistrationBuilder.cs.meta +11 -0
- package/Runtime/Core/MessageBus/MessageBusRebindMode.cs +26 -0
- package/Runtime/Core/MessageBus/MessageBusRebindMode.cs.meta +11 -0
- package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs +383 -0
- package/Runtime/Core/MessageBus/MessageRegistrationBuilder.cs.meta +11 -0
- package/Runtime/Core/MessageHandler.cs +198 -27
- package/Runtime/Core/MessageRegistrationToken.cs +67 -25
- package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs +31 -0
- package/Runtime/Unity/CurrentGlobalMessageBusProvider.cs.meta +12 -0
- package/Runtime/Unity/InitialGlobalMessageBusProvider.cs +38 -0
- package/Runtime/Unity/InitialGlobalMessageBusProvider.cs.meta +12 -0
- package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs +11 -0
- package/Runtime/Unity/Integrations/Reflex/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs +73 -0
- package/Runtime/Unity/Integrations/Reflex/ReflexRegistrationInstaller.cs.meta +11 -0
- package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef +20 -0
- package/Runtime/Unity/Integrations/Reflex/WallstopStudios.DxMessaging.Reflex.asmdef.meta +7 -0
- package/Runtime/Unity/Integrations/Reflex.meta +8 -0
- package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs +11 -0
- package/Runtime/Unity/Integrations/VContainer/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs +46 -0
- package/Runtime/Unity/Integrations/VContainer/VContainerRegistrationExtensions.cs.meta +11 -0
- package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef +30 -0
- package/Runtime/Unity/Integrations/VContainer/WallstopStudios.DxMessaging.VContainer.asmdef.meta +7 -0
- package/Runtime/Unity/Integrations/VContainer.meta +8 -0
- package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs +11 -0
- package/Runtime/Unity/Integrations/Zenject/AssemblyInfo.cs.meta +3 -0
- package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef +30 -0
- package/Runtime/Unity/Integrations/Zenject/WallstopStudios.DxMessaging.Zenject.asmdef.meta +7 -0
- package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs +55 -0
- package/Runtime/Unity/Integrations/Zenject/ZenjectRegistrationInstaller.cs.meta +11 -0
- package/Runtime/Unity/Integrations/Zenject.meta +8 -0
- package/Runtime/Unity/Integrations.meta +8 -0
- package/Runtime/Unity/MessageAwareComponent.cs +102 -0
- package/Runtime/Unity/MessageBusProviderHandle.cs +97 -0
- package/Runtime/Unity/MessageBusProviderHandle.cs.meta +12 -0
- package/Runtime/Unity/MessagingComponent.cs +164 -2
- package/Runtime/Unity/MessagingComponentInstaller.cs +120 -0
- package/Runtime/Unity/MessagingComponentInstaller.cs.meta +12 -0
- package/Runtime/Unity/ScriptableMessageBusProvider.cs +14 -0
- package/Runtime/Unity/ScriptableMessageBusProvider.cs.meta +12 -0
- package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab +98 -0
- package/Samples~/DI/Prefabs/MessagingInstallerSample.prefab.meta +7 -0
- package/Samples~/DI/Prefabs.meta +8 -0
- package/Samples~/DI/Providers/GlobalMessageBusProvider.asset +14 -0
- package/Samples~/DI/Providers/GlobalMessageBusProvider.asset.meta +8 -0
- package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset +14 -0
- package/Samples~/DI/Providers/InitialGlobalMessageBusProvider.asset.meta +8 -0
- package/Samples~/DI/Providers.meta +8 -0
- package/Samples~/DI/README.md +51 -0
- package/Samples~/DI/README.md.meta +7 -0
- package/Samples~/DI/Reflex/SampleInstaller.cs +75 -0
- package/Samples~/DI/Reflex/SampleInstaller.cs.meta +11 -0
- package/Samples~/DI/Reflex.meta +8 -0
- package/Samples~/DI/VContainer/SampleLifetimeScope.cs +81 -0
- package/Samples~/DI/VContainer/SampleLifetimeScope.cs.meta +11 -0
- package/Samples~/DI/VContainer.meta +8 -0
- package/Samples~/DI/Zenject/SampleInstaller.cs +67 -0
- package/Samples~/DI/Zenject/SampleInstaller.cs.meta +11 -0
- package/Samples~/DI/Zenject.meta +8 -0
- package/Samples~/DI.meta +8 -0
- package/Samples~/Mini Combat/README.md +5 -7
- package/Samples~/Mini Combat/Walkthrough.md +18 -24
- package/Samples~/UI Buttons + Inspector/DiagnosticsEnabler.cs +12 -2
- package/Samples~/UI Buttons + Inspector/README.md.meta +7 -0
- package/Tests/Runtime/Benchmarks/BenchmarkSession.cs +444 -0
- package/Tests/Runtime/Benchmarks/BenchmarkSession.cs.meta +11 -0
- package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs +94 -0
- package/Tests/Runtime/Benchmarks/BenchmarkTestBase.cs.meta +11 -0
- package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs +395 -0
- package/Tests/Runtime/Benchmarks/ComparisonPerformanceTests.cs.meta +11 -0
- package/Tests/Runtime/Benchmarks/PerformanceTests.cs +77 -429
- package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs +142 -0
- package/Tests/Runtime/Benchmarks/ProviderResolutionBenchmarks.cs.meta +12 -0
- package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef +50 -0
- package/Tests/Runtime/Benchmarks/WallstopStudios.DxMessaging.Tests.Runtime.Benchmarks.asmdef.meta +7 -0
- package/Tests/Runtime/Core/DefaultBusFallbackTests.cs +333 -0
- package/Tests/Runtime/Core/DefaultBusFallbackTests.cs.meta +11 -0
- package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs +278 -0
- package/Tests/Runtime/Core/Extensions/MessageBusExtensionsTests.cs.meta +11 -0
- package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs +289 -0
- package/Tests/Runtime/Core/Extensions/MessageExtensionsProviderTests.cs.meta +11 -0
- package/Tests/Runtime/Core/Extensions.meta +8 -0
- package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs +57 -0
- package/Tests/Runtime/Core/IntegrationShimSmokeTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs +219 -0
- package/Tests/Runtime/Core/MessageHandlerGlobalBusTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs +204 -0
- package/Tests/Runtime/Core/MessageRegistrationBuilderTests.cs.meta +11 -0
- package/Tests/Runtime/Core/MessagingTestBase.cs +4 -4
- package/Tests/Runtime/Core/NominalTests.cs +2 -2
- package/Tests/Runtime/Core/TypedShorthandTests.cs +2 -2
- package/Tests/Runtime/Core/UntargetedEquivalenceTests.cs +1 -1
- package/Tests/Runtime/Core/UntargetedPrefreezeTests.cs +2 -4
- package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs +162 -0
- package/Tests/Runtime/Integrations/Reflex/ReflexIntegrationTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset +16 -0
- package/Tests/Runtime/Integrations/Reflex/Resources/ReflexSettings.asset.meta +8 -0
- package/Tests/Runtime/Integrations/Reflex/Resources.meta +8 -0
- package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef +27 -0
- package/Tests/Runtime/Integrations/Reflex/WallstopStudios.DxMessaging.Tests.Runtime.Reflex.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/Reflex.meta +8 -0
- package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs +140 -0
- package/Tests/Runtime/Integrations/VContainer/VContainerIntegrationTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef +37 -0
- package/Tests/Runtime/Integrations/VContainer/WallstopStudios.DxMessaging.Tests.Runtime.VContainer.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/VContainer.meta +8 -0
- package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef +37 -0
- package/Tests/Runtime/Integrations/Zenject/WallstopStudios.DxMessaging.Tests.Runtime.Zenject.asmdef.meta +7 -0
- package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs +140 -0
- package/Tests/Runtime/Integrations/Zenject/ZenjectIntegrationTests.cs.meta +11 -0
- package/Tests/Runtime/Integrations/Zenject.meta +8 -0
- package/Tests/Runtime/Integrations.meta +8 -0
- package/Tests/Runtime/Scripts/Components/EmptyMessageAwareComponent.cs +1 -1
- package/Tests/Runtime/Scripts/Components/GenericMessageAwareComponent.cs +1 -1
- package/Tests/Runtime/Scripts/Components/SimpleMessageAwareComponent.cs +1 -1
- package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs +64 -0
- package/Tests/Runtime/TestUtilities/UnityFixtureBase.cs.meta +12 -0
- package/Tests/Runtime/TestUtilities.meta +9 -0
- package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs +57 -0
- package/Tests/Runtime/Unity/MessageBusProviderAssetTests.cs.meta +11 -0
- package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs +107 -0
- package/Tests/Runtime/Unity/MessageBusProviderHandleTests.cs.meta +12 -0
- package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs +210 -0
- package/Tests/Runtime/Unity/MessagingComponentProviderIntegrationTests.cs.meta +12 -0
- package/Tests/Runtime/Unity.meta +9 -0
- package/Tests/Runtime/WallstopStudios.DxMessaging.Tests.Runtime.asmdef +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
namespace DxMessaging.Unity
|
|
2
|
+
{
|
|
3
|
+
using System;
|
|
4
|
+
using DxMessaging.Core.MessageBus;
|
|
5
|
+
using UnityEngine;
|
|
6
|
+
using UnityEngine.Serialization;
|
|
7
|
+
|
|
8
|
+
/// <summary>
|
|
9
|
+
/// Serializable handle that references a <see cref="ScriptableMessageBusProvider"/> or runtime provider.
|
|
10
|
+
/// </summary>
|
|
11
|
+
[Serializable]
|
|
12
|
+
public struct MessageBusProviderHandle
|
|
13
|
+
{
|
|
14
|
+
[FormerlySerializedAs("providerAsset")]
|
|
15
|
+
[SerializeField]
|
|
16
|
+
private ScriptableMessageBusProvider _provider;
|
|
17
|
+
|
|
18
|
+
[NonSerialized]
|
|
19
|
+
private IMessageBusProvider _runtimeProvider;
|
|
20
|
+
|
|
21
|
+
/// <summary>
|
|
22
|
+
/// Initializes a new instance referencing the supplied provider asset.
|
|
23
|
+
/// </summary>
|
|
24
|
+
/// <param name="provider">Serialized provider asset.</param>
|
|
25
|
+
public MessageBusProviderHandle(ScriptableMessageBusProvider provider)
|
|
26
|
+
{
|
|
27
|
+
_provider = provider;
|
|
28
|
+
_runtimeProvider = provider;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// <summary>
|
|
32
|
+
/// Gets an empty handle.
|
|
33
|
+
/// </summary>
|
|
34
|
+
public static MessageBusProviderHandle Empty => default;
|
|
35
|
+
|
|
36
|
+
/// <summary>
|
|
37
|
+
/// Creates a handle that wraps a runtime-only provider instance.
|
|
38
|
+
/// </summary>
|
|
39
|
+
/// <param name="provider">Runtime provider.</param>
|
|
40
|
+
/// <returns>Handle referencing the provider.</returns>
|
|
41
|
+
public static MessageBusProviderHandle FromProvider(IMessageBusProvider provider)
|
|
42
|
+
{
|
|
43
|
+
MessageBusProviderHandle handle = default;
|
|
44
|
+
handle._runtimeProvider = provider;
|
|
45
|
+
return handle;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/// <summary>
|
|
49
|
+
/// Associates the handle with a runtime provider, returning a new handle.
|
|
50
|
+
/// </summary>
|
|
51
|
+
/// <param name="provider">Provider to associate.</param>
|
|
52
|
+
/// <returns>New handle referencing the provider.</returns>
|
|
53
|
+
public MessageBusProviderHandle WithRuntimeProvider(IMessageBusProvider provider)
|
|
54
|
+
{
|
|
55
|
+
MessageBusProviderHandle handle = this;
|
|
56
|
+
handle._runtimeProvider = provider;
|
|
57
|
+
return handle;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/// <summary>
|
|
61
|
+
/// Attempts to resolve the provider referenced by this handle.
|
|
62
|
+
/// </summary>
|
|
63
|
+
/// <param name="provider">Resolved provider.</param>
|
|
64
|
+
/// <returns><c>true</c> when a provider exists; otherwise <c>false</c>.</returns>
|
|
65
|
+
public bool TryGetProvider(out IMessageBusProvider provider)
|
|
66
|
+
{
|
|
67
|
+
if (_runtimeProvider != null)
|
|
68
|
+
{
|
|
69
|
+
provider = _runtimeProvider;
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (_provider != null)
|
|
74
|
+
{
|
|
75
|
+
provider = _provider;
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
provider = null;
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/// <summary>
|
|
84
|
+
/// Resolves the effective message bus for this handle.
|
|
85
|
+
/// </summary>
|
|
86
|
+
/// <returns>The resolved bus, or <see langword="null"/> if none available.</returns>
|
|
87
|
+
public IMessageBus ResolveBus()
|
|
88
|
+
{
|
|
89
|
+
if (!TryGetProvider(out IMessageBusProvider provider))
|
|
90
|
+
{
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return provider.Resolve();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -3,6 +3,7 @@ namespace DxMessaging.Unity
|
|
|
3
3
|
using System;
|
|
4
4
|
using System.Collections.Generic;
|
|
5
5
|
using Core;
|
|
6
|
+
using Core.MessageBus;
|
|
6
7
|
using UnityEngine;
|
|
7
8
|
using UnityEngine.Serialization;
|
|
8
9
|
|
|
@@ -26,11 +27,37 @@ namespace DxMessaging.Unity
|
|
|
26
27
|
[FormerlySerializedAs("_emitMessagesWhenDisabled")]
|
|
27
28
|
public bool emitMessagesWhenDisabled;
|
|
28
29
|
|
|
30
|
+
[SerializeField]
|
|
31
|
+
private bool autoConfigureSerializedProviderOnAwake;
|
|
32
|
+
|
|
33
|
+
[SerializeField]
|
|
34
|
+
private MessageBusProviderHandle _serializedProviderHandle;
|
|
35
|
+
|
|
29
36
|
private MessageHandler _messageHandler;
|
|
30
37
|
|
|
38
|
+
[NonSerialized]
|
|
39
|
+
private IMessageBus _messageBusOverride;
|
|
40
|
+
|
|
41
|
+
[NonSerialized]
|
|
42
|
+
private IMessageBusProvider _messageBusProvider;
|
|
43
|
+
|
|
31
44
|
internal readonly Dictionary<MonoBehaviour, MessageRegistrationToken> _registeredListeners =
|
|
32
45
|
new();
|
|
33
46
|
|
|
47
|
+
/// <summary>
|
|
48
|
+
/// Creates a <see cref="IMessageRegistrationBuilder"/> aligned with this component's configured bus or provider.
|
|
49
|
+
/// </summary>
|
|
50
|
+
public IMessageRegistrationBuilder CreateRegistrationBuilder()
|
|
51
|
+
{
|
|
52
|
+
IMessageBusProvider provider = ResolveRegistrationProvider();
|
|
53
|
+
if (provider != null)
|
|
54
|
+
{
|
|
55
|
+
return new MessageRegistrationBuilder(provider);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return new MessageRegistrationBuilder();
|
|
59
|
+
}
|
|
60
|
+
|
|
34
61
|
/// <summary>
|
|
35
62
|
/// Creates (or returns existing) registration token for the given component on this GameObject.
|
|
36
63
|
/// </summary>
|
|
@@ -73,6 +100,66 @@ namespace DxMessaging.Unity
|
|
|
73
100
|
return createdToken;
|
|
74
101
|
}
|
|
75
102
|
|
|
103
|
+
/// <summary>
|
|
104
|
+
/// Overrides the default message bus used when new handlers are created.
|
|
105
|
+
/// </summary>
|
|
106
|
+
/// <param name="messageBus">Message bus to prefer. Pass <c>null</c> to fall back to the global bus.</param>
|
|
107
|
+
/// <param name="rebindMode">Controls whether existing registrations move to the new bus immediately.</param>
|
|
108
|
+
public void Configure(IMessageBus messageBus, MessageBusRebindMode rebindMode)
|
|
109
|
+
{
|
|
110
|
+
_messageBusOverride = messageBus;
|
|
111
|
+
_messageBusProvider = null;
|
|
112
|
+
_serializedProviderHandle = MessageBusProviderHandle.Empty;
|
|
113
|
+
ApplyMessageBusConfiguration(rebindMode);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/// <summary>
|
|
117
|
+
/// Configures the component to resolve message buses via the supplied provider.
|
|
118
|
+
/// </summary>
|
|
119
|
+
/// <param name="messageBusProvider">Provider to use for subsequent handler/token resolution.</param>
|
|
120
|
+
/// <param name="rebindMode">Controls whether existing listeners should migrate immediately.</param>
|
|
121
|
+
public void Configure(
|
|
122
|
+
IMessageBusProvider messageBusProvider,
|
|
123
|
+
MessageBusRebindMode rebindMode
|
|
124
|
+
)
|
|
125
|
+
{
|
|
126
|
+
_messageBusProvider = messageBusProvider;
|
|
127
|
+
if (messageBusProvider != null)
|
|
128
|
+
{
|
|
129
|
+
_messageBusOverride = null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
_serializedProviderHandle =
|
|
133
|
+
messageBusProvider != null
|
|
134
|
+
? MessageBusProviderHandle.FromProvider(messageBusProvider)
|
|
135
|
+
: MessageBusProviderHandle.Empty;
|
|
136
|
+
ApplyMessageBusConfiguration(rebindMode);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// <summary>
|
|
140
|
+
/// Configures the component using a serialized provider handle.
|
|
141
|
+
/// </summary>
|
|
142
|
+
/// <param name="providerHandle">Handle that resolves the preferred provider.</param>
|
|
143
|
+
/// <param name="rebindMode">Controls whether existing listeners should migrate immediately.</param>
|
|
144
|
+
public void Configure(
|
|
145
|
+
MessageBusProviderHandle providerHandle,
|
|
146
|
+
MessageBusRebindMode rebindMode
|
|
147
|
+
)
|
|
148
|
+
{
|
|
149
|
+
_serializedProviderHandle = providerHandle;
|
|
150
|
+
if (providerHandle.TryGetProvider(out IMessageBusProvider provider))
|
|
151
|
+
{
|
|
152
|
+
_messageBusProvider = provider;
|
|
153
|
+
_messageBusOverride = null;
|
|
154
|
+
}
|
|
155
|
+
else
|
|
156
|
+
{
|
|
157
|
+
_messageBusProvider = null;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
ApplyMessageBusConfiguration(rebindMode);
|
|
161
|
+
}
|
|
162
|
+
|
|
76
163
|
/// <summary>
|
|
77
164
|
/// Releases the registration token previously created for <paramref name="listener"/>.
|
|
78
165
|
/// </summary>
|
|
@@ -83,7 +170,7 @@ namespace DxMessaging.Unity
|
|
|
83
170
|
/// </remarks>
|
|
84
171
|
public bool Release(MonoBehaviour listener)
|
|
85
172
|
{
|
|
86
|
-
if (listener
|
|
173
|
+
if (listener == null)
|
|
87
174
|
{
|
|
88
175
|
return false;
|
|
89
176
|
}
|
|
@@ -102,6 +189,16 @@ namespace DxMessaging.Unity
|
|
|
102
189
|
/// </summary>
|
|
103
190
|
private void Awake()
|
|
104
191
|
{
|
|
192
|
+
if (
|
|
193
|
+
autoConfigureSerializedProviderOnAwake
|
|
194
|
+
&& _messageBusOverride == null
|
|
195
|
+
&& _messageBusProvider == null
|
|
196
|
+
&& _serializedProviderHandle.TryGetProvider(out IMessageBusProvider provider)
|
|
197
|
+
)
|
|
198
|
+
{
|
|
199
|
+
_messageBusProvider = provider;
|
|
200
|
+
}
|
|
201
|
+
|
|
105
202
|
_messageHandler ??= CreateMessageHandler();
|
|
106
203
|
}
|
|
107
204
|
|
|
@@ -143,7 +240,72 @@ namespace DxMessaging.Unity
|
|
|
143
240
|
/// </summary>
|
|
144
241
|
private MessageHandler CreateMessageHandler()
|
|
145
242
|
{
|
|
146
|
-
|
|
243
|
+
IMessageBus resolvedBus = ResolveConfiguredBus();
|
|
244
|
+
MessageHandler handler = new(gameObject, resolvedBus) { active = true };
|
|
245
|
+
return handler;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
private void ApplyMessageBusConfiguration(MessageBusRebindMode rebindMode)
|
|
249
|
+
{
|
|
250
|
+
IMessageBus resolvedBus = ResolveConfiguredBus();
|
|
251
|
+
_messageHandler?.SetDefaultMessageBus(resolvedBus);
|
|
252
|
+
if (_registeredListeners.Count == 0)
|
|
253
|
+
{
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
MessageBusRebindMode effectiveMode =
|
|
258
|
+
#pragma warning disable CS0618 // Type or member is obsolete
|
|
259
|
+
rebindMode == MessageBusRebindMode.Unknown
|
|
260
|
+
#pragma warning restore CS0618 // Type or member is obsolete
|
|
261
|
+
? MessageBusRebindMode.RebindActive
|
|
262
|
+
: rebindMode;
|
|
263
|
+
|
|
264
|
+
foreach (MessageRegistrationToken token in _registeredListeners.Values)
|
|
265
|
+
{
|
|
266
|
+
token.RetargetMessageBus(resolvedBus, effectiveMode);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
private IMessageBus ResolveConfiguredBus()
|
|
271
|
+
{
|
|
272
|
+
if (_messageBusOverride != null)
|
|
273
|
+
{
|
|
274
|
+
return _messageBusOverride;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
if (_messageBusProvider != null)
|
|
278
|
+
{
|
|
279
|
+
IMessageBus providedBus = _messageBusProvider.Resolve();
|
|
280
|
+
if (providedBus != null)
|
|
281
|
+
{
|
|
282
|
+
return providedBus;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
private IMessageBusProvider ResolveRegistrationProvider()
|
|
290
|
+
{
|
|
291
|
+
if (_messageBusProvider != null)
|
|
292
|
+
{
|
|
293
|
+
return _messageBusProvider;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (
|
|
297
|
+
_serializedProviderHandle.TryGetProvider(out IMessageBusProvider providerFromHandle)
|
|
298
|
+
)
|
|
299
|
+
{
|
|
300
|
+
return providerFromHandle;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (_messageBusOverride != null)
|
|
304
|
+
{
|
|
305
|
+
return new FixedMessageBusProvider(_messageBusOverride);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
return null;
|
|
147
309
|
}
|
|
148
310
|
}
|
|
149
311
|
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
namespace DxMessaging.Unity
|
|
2
|
+
{
|
|
3
|
+
using System.Collections.Generic;
|
|
4
|
+
using Core.MessageBus;
|
|
5
|
+
using UnityEngine;
|
|
6
|
+
|
|
7
|
+
/// <summary>
|
|
8
|
+
/// Applies a shared message bus or provider to <see cref="MessagingComponent"/> instances in the hierarchy.
|
|
9
|
+
/// </summary>
|
|
10
|
+
[DisallowMultipleComponent]
|
|
11
|
+
public sealed class MessagingComponentInstaller : MonoBehaviour
|
|
12
|
+
{
|
|
13
|
+
[SerializeField]
|
|
14
|
+
private bool applyOnAwake = true;
|
|
15
|
+
|
|
16
|
+
[SerializeField]
|
|
17
|
+
private bool includeInactive = true;
|
|
18
|
+
|
|
19
|
+
[SerializeField]
|
|
20
|
+
private MessageBusProviderHandle providerHandle;
|
|
21
|
+
|
|
22
|
+
[SerializeReference]
|
|
23
|
+
private IMessageBus explicitMessageBus;
|
|
24
|
+
|
|
25
|
+
private readonly List<MessagingComponent> _messagingComponents = new();
|
|
26
|
+
|
|
27
|
+
private void Awake()
|
|
28
|
+
{
|
|
29
|
+
if (applyOnAwake)
|
|
30
|
+
{
|
|
31
|
+
ApplyConfiguration();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/// <summary>
|
|
36
|
+
/// Applies the configured bus or provider to all <see cref="MessagingComponent"/> descendants.
|
|
37
|
+
/// </summary>
|
|
38
|
+
public void ApplyConfiguration()
|
|
39
|
+
{
|
|
40
|
+
GetComponentsInChildren<MessagingComponent>(includeInactive, _messagingComponents);
|
|
41
|
+
|
|
42
|
+
if (_messagingComponents.Count == 0)
|
|
43
|
+
{
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (providerHandle.TryGetProvider(out IMessageBusProvider provider))
|
|
48
|
+
{
|
|
49
|
+
foreach (MessagingComponent component in _messagingComponents)
|
|
50
|
+
{
|
|
51
|
+
component.Configure(providerHandle, MessageBusRebindMode.RebindActive);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (explicitMessageBus != null)
|
|
58
|
+
{
|
|
59
|
+
foreach (MessagingComponent component in _messagingComponents)
|
|
60
|
+
{
|
|
61
|
+
component.Configure(explicitMessageBus, MessageBusRebindMode.RebindActive);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
Debug.LogWarning(
|
|
68
|
+
$"{nameof(MessagingComponentInstaller)} on {name} has no provider or explicit message bus configured.",
|
|
69
|
+
this
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// <summary>
|
|
74
|
+
/// Creates a registration builder that mirrors the installer configuration.
|
|
75
|
+
/// </summary>
|
|
76
|
+
public IMessageRegistrationBuilder CreateRegistrationBuilder()
|
|
77
|
+
{
|
|
78
|
+
IMessageBusProvider provider = ResolveEffectiveProvider();
|
|
79
|
+
if (provider != null)
|
|
80
|
+
{
|
|
81
|
+
return new MessageRegistrationBuilder(provider);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (explicitMessageBus != null)
|
|
85
|
+
{
|
|
86
|
+
return new MessageRegistrationBuilder(
|
|
87
|
+
new FixedMessageBusProvider(explicitMessageBus)
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return new MessageRegistrationBuilder();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/// <summary>
|
|
95
|
+
/// Assigns the provider handle that will be used for subsequent applications.
|
|
96
|
+
/// </summary>
|
|
97
|
+
public void SetProvider(MessageBusProviderHandle handle)
|
|
98
|
+
{
|
|
99
|
+
providerHandle = handle;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/// <summary>
|
|
103
|
+
/// Assigns an explicit message bus that overrides the provider handle when present.
|
|
104
|
+
/// </summary>
|
|
105
|
+
public void SetExplicitMessageBus(IMessageBus messageBus)
|
|
106
|
+
{
|
|
107
|
+
explicitMessageBus = messageBus;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
private IMessageBusProvider ResolveEffectiveProvider()
|
|
111
|
+
{
|
|
112
|
+
if (providerHandle.TryGetProvider(out IMessageBusProvider provider))
|
|
113
|
+
{
|
|
114
|
+
return provider;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
namespace DxMessaging.Unity
|
|
2
|
+
{
|
|
3
|
+
using DxMessaging.Core.MessageBus;
|
|
4
|
+
using UnityEngine;
|
|
5
|
+
|
|
6
|
+
/// <summary>
|
|
7
|
+
/// Base <see cref="ScriptableObject"/> that resolves an <see cref="IMessageBus"/> instance.
|
|
8
|
+
/// </summary>
|
|
9
|
+
public abstract class ScriptableMessageBusProvider : ScriptableObject, IMessageBusProvider
|
|
10
|
+
{
|
|
11
|
+
/// <inheritdoc />
|
|
12
|
+
public abstract IMessageBus Resolve();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
%YAML 1.1
|
|
2
|
+
%TAG !u! tag:unity3d.com,2011:
|
|
3
|
+
--- !u!1 &100000
|
|
4
|
+
GameObject:
|
|
5
|
+
m_ObjectHideFlags: 0
|
|
6
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
7
|
+
m_PrefabInstance: {fileID: 0}
|
|
8
|
+
m_PrefabAsset: {fileID: 0}
|
|
9
|
+
serializedVersion: 6
|
|
10
|
+
m_Component:
|
|
11
|
+
- component: {fileID: 400000}
|
|
12
|
+
- component: {fileID: 11400000}
|
|
13
|
+
m_Layer: 0
|
|
14
|
+
m_Name: MessagingInstallerSample
|
|
15
|
+
m_TagString: Untagged
|
|
16
|
+
m_Icon: {fileID: 0}
|
|
17
|
+
m_NavMeshLayer: 0
|
|
18
|
+
m_StaticEditorFlags: 0
|
|
19
|
+
m_IsActive: 1
|
|
20
|
+
--- !u!4 &400000
|
|
21
|
+
Transform:
|
|
22
|
+
m_ObjectHideFlags: 0
|
|
23
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
24
|
+
m_PrefabInstance: {fileID: 0}
|
|
25
|
+
m_PrefabAsset: {fileID: 0}
|
|
26
|
+
m_GameObject: {fileID: 100000}
|
|
27
|
+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
28
|
+
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
29
|
+
m_LocalScale: {x: 1, y: 1, z: 1}
|
|
30
|
+
m_ConstrainProportionsScale: 0
|
|
31
|
+
m_Children:
|
|
32
|
+
- {fileID: 400001}
|
|
33
|
+
m_Father: {fileID: 0}
|
|
34
|
+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
35
|
+
--- !u!114 &11400000
|
|
36
|
+
MonoBehaviour:
|
|
37
|
+
m_ObjectHideFlags: 0
|
|
38
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
39
|
+
m_PrefabInstance: {fileID: 0}
|
|
40
|
+
m_PrefabAsset: {fileID: 0}
|
|
41
|
+
m_GameObject: {fileID: 100000}
|
|
42
|
+
m_Enabled: 1
|
|
43
|
+
m_EditorHideFlags: 0
|
|
44
|
+
m_Script: {fileID: 11500000, guid: 3a28d2b5a3c74e44b922cb972782f7d1, type: 3}
|
|
45
|
+
m_Name:
|
|
46
|
+
m_EditorClassIdentifier:
|
|
47
|
+
applyOnAwake: 1
|
|
48
|
+
includeInactive: 1
|
|
49
|
+
providerHandle:
|
|
50
|
+
providerAsset: {fileID: 11400000, guid: a4f3a0b76ff44160a7453a58aa654a3a, type: 2}
|
|
51
|
+
explicitMessageBus: {}
|
|
52
|
+
--- !u!1 &100001
|
|
53
|
+
GameObject:
|
|
54
|
+
m_ObjectHideFlags: 0
|
|
55
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
56
|
+
m_PrefabInstance: {fileID: 0}
|
|
57
|
+
m_PrefabAsset: {fileID: 0}
|
|
58
|
+
serializedVersion: 6
|
|
59
|
+
m_Component:
|
|
60
|
+
- component: {fileID: 400001}
|
|
61
|
+
- component: {fileID: 11400001}
|
|
62
|
+
m_Layer: 0
|
|
63
|
+
m_Name: MessagingListener
|
|
64
|
+
m_TagString: Untagged
|
|
65
|
+
m_Icon: {fileID: 0}
|
|
66
|
+
m_NavMeshLayer: 0
|
|
67
|
+
m_StaticEditorFlags: 0
|
|
68
|
+
m_IsActive: 1
|
|
69
|
+
--- !u!4 &400001
|
|
70
|
+
Transform:
|
|
71
|
+
m_ObjectHideFlags: 0
|
|
72
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
73
|
+
m_PrefabInstance: {fileID: 0}
|
|
74
|
+
m_PrefabAsset: {fileID: 0}
|
|
75
|
+
m_GameObject: {fileID: 100001}
|
|
76
|
+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
|
77
|
+
m_LocalPosition: {x: 0, y: 0, z: 0}
|
|
78
|
+
m_LocalScale: {x: 1, y: 1, z: 1}
|
|
79
|
+
m_ConstrainProportionsScale: 0
|
|
80
|
+
m_Children: []
|
|
81
|
+
m_Father: {fileID: 400000}
|
|
82
|
+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
|
83
|
+
--- !u!114 &11400001
|
|
84
|
+
MonoBehaviour:
|
|
85
|
+
m_ObjectHideFlags: 0
|
|
86
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
87
|
+
m_PrefabInstance: {fileID: 0}
|
|
88
|
+
m_PrefabAsset: {fileID: 0}
|
|
89
|
+
m_GameObject: {fileID: 100001}
|
|
90
|
+
m_Enabled: 1
|
|
91
|
+
m_EditorHideFlags: 0
|
|
92
|
+
m_Script: {fileID: 11500000, guid: 98ea04ea326660845ba49942dacbf907, type: 3}
|
|
93
|
+
m_Name:
|
|
94
|
+
m_EditorClassIdentifier:
|
|
95
|
+
emitMessagesWhenDisabled: 0
|
|
96
|
+
autoConfigureSerializedProviderOnAwake: 0
|
|
97
|
+
_serializedProviderHandle:
|
|
98
|
+
providerAsset: {fileID: 0}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
%YAML 1.1
|
|
2
|
+
%TAG !u! tag:unity3d.com,2011:
|
|
3
|
+
--- !u!114 &11400000
|
|
4
|
+
MonoBehaviour:
|
|
5
|
+
m_ObjectHideFlags: 0
|
|
6
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
7
|
+
m_PrefabInstance: {fileID: 0}
|
|
8
|
+
m_PrefabAsset: {fileID: 0}
|
|
9
|
+
m_GameObject: {fileID: 0}
|
|
10
|
+
m_Enabled: 1
|
|
11
|
+
m_EditorHideFlags: 0
|
|
12
|
+
m_Script: {fileID: 11500000, guid: 689f1e1a8d9f4c34f9e3ab4e3f94ec37, type: 3}
|
|
13
|
+
m_Name: GlobalMessageBusProvider
|
|
14
|
+
m_EditorClassIdentifier:
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
%YAML 1.1
|
|
2
|
+
%TAG !u! tag:unity3d.com,2011:
|
|
3
|
+
--- !u!114 &11400000
|
|
4
|
+
MonoBehaviour:
|
|
5
|
+
m_ObjectHideFlags: 0
|
|
6
|
+
m_CorrespondingSourceObject: {fileID: 0}
|
|
7
|
+
m_PrefabInstance: {fileID: 0}
|
|
8
|
+
m_PrefabAsset: {fileID: 0}
|
|
9
|
+
m_GameObject: {fileID: 0}
|
|
10
|
+
m_Enabled: 1
|
|
11
|
+
m_EditorHideFlags: 0
|
|
12
|
+
m_Script: {fileID: 11500000, guid: 1f3f2efbb7f4441ebde8b418d178885a, type: 3}
|
|
13
|
+
m_Name: InitialGlobalMessageBusProvider
|
|
14
|
+
m_EditorClassIdentifier:
|