MessagePipe + VContainer で Hierarchy 内の GameObject にSubScriber を Injectする方法


結論

公式ドキュメント

発端

EnemyクラスにてSubscirberをInjectしたがPublish側はPublishできたのにEnemyが受け取れないぞ?
しっかり処理も書いてるのにどういうことかな と詰まりました(ありがち)

以下参考


public class GameLifetimeScope : LifetimeScope {
    protected override void Configure (IContainerBuilder builder) {
        // 抜粋
        var options = builder.RegisterMessagePipe ();
        builder.RegisterMessageBroker<DamageData> (options);
    }
}
// DamageData を購読して 体力が減ったら自らを消す Enemyクラス
public class Enemy : MonoBehaviour {

    private int _HitPoint = 3;
    [Inject] private ISubscriber<DamageData> _damageData { get; set; }
    private IDisposable disposable;

    void Update () {
        if (_HitPoint <= 0) {
            Destroy (this.gameObject);
        }
    }

    private void Start () {

        var bag = DisposableBag.CreateBuilder ();

        _damageData.Subscribe (damageData => {
            this.supplyDamage (damageData);
        }).AddTo (bag);

        disposable = bag.Build ();
    }

    private void supplyDamage (DamageData d) {
        _HitPoint -= d.damage;
    }

    private void OnDestroy () {
        disposable?.Dispose ();
    }

}
public class DamageData {
    public int damage = 0;
}