Event-based communication with UniDi integration.
Signal-Bus is an event-based communication system. It allows communication between components in a loosely coupled manner, where each component never needs to know or hold explicitly each other.
TODO --> WIP <--
Download and extract a release to your machine. Press 'Add package from disk' in the Unity Package Manager and select the package.json
file in the extracted folder.
TODO: --> WIP <--
public class UserJoinedSignal
{
public string Username;
}
public class GameInitializer : IInitializable
{
readonly SignalBus _signalBus;
public GameInitializer(SignalBus signalBus)
{
_signalBus = signalBus;
}
public void Initialize()
{
_signalBus.Fire(new UserJoinedSignal() { Username = "Bob" });
}
}
public class Greeter
{
public void SayHello(UserJoinedSignal userJoinedInfo)
{
Debug.Log("Hello " + userJoinedInfo.Username + "!");
}
}
public class GameInstaller : MonoInstaller<GameInstaller>
{
public override void InstallBindings()
{
SignalBusInstaller.Install(Container);
Container.DeclareSignal<UserJoinedSignal>();
Container.Bind<Greeter>().AsSingle();
Container.BindSignal<UserJoinedSignal>()
.ToMethod<Greeter>(x => x.SayHello).FromResolve();
Container.BindInterfacesTo<GameInitializer>().AsSingle();
}
}
To run, just copy and paste the code above into a new file named GameInstaller then create an empty scene with a new scene context and attach the new installer.
There are several ways of creating signal handlers. Another common approach is by subscribing and unsubscribing.
public class Greeter : IInitializable, IDisposable
{
readonly SignalBus _signalBus;
public Greeter(SignalBus signalBus)
{
_signalBus = signalBus;
}
public void Initialize()
{
_signalBus.Subscribe<UserJoinedSignal>(OnUserJoined);
}
public void Dispose()
{
_signalBus.Unsubscribe<UserJoinedSignal>(OnUserJoined);
}
void OnUserJoined(UserJoinedSignal args)
{
SayHello(args.Username);
}
public void SayHello(string userName)
{
Debug.Log("Hello " + userName + "!");
}
}
public class GameInstaller : MonoInstaller<GameInstaller>
{
public override void InstallBindings()
{
SignalBusInstaller.Install(Container);
Container.DeclareSignal<UserJoinedSignal>();
Container.BindInterfacesTo<Greeter>().AsSingle();
Container.BindInterfacesTo<GameInitializer>().AsSingle();
}
}
As you can see in the the above examples, you can either directly bind a handler method to a signal in an installer using BindSignal (first example) or you can have your signal handler attach and detach itself to the signal.
TODO
TODO
UniDi contributions are licensed under the Apache 2.0 license, except for contributions copied from Extenject. See LICENSE for details.