見出し画像

RAYSER進捗(20230930)

シーンを跨いでもスコアを維持するようにしたので、今度はそれをゲームシーンでも保持できるようにしてみました。

前回のままだとシーンが切り替わった際にViewに該当する部分の更新処理が発生しないので、ScoreDataPresenterのIStartable.Startを実行した際に、UIをリフレッシュするための処理を追加してみました。

using System;
using Event.Signal;
using UniRx;
using VContainer.Unity;

namespace Score
{
    public class ScoreDataPresenter : IStartable, IDisposable
    {
        readonly ScoreService scoreService;
        readonly CompositeDisposable disposable = new CompositeDisposable();

        public ScoreDataPresenter(ScoreService scoreService)
        {
            this.scoreService = scoreService;
        }

        void IStartable.Start()
        {
            scoreService.ShowScore();

            MessageBroker.Default.Receive<ScoreAccumulation>()
                .Subscribe(x => this.RefreshUI(x.Score))
                .AddTo(disposable);
        }

        private void RefreshUI(int score)
        {
            scoreService.AddScore(score);
            scoreService.ShowScore();
        }

        public void Dispose()
        {
            disposable.Dispose();
        }
    }
}

ゲームシーンのスコアのライフタイムスコープはタイトルで使用しているものとクラス名以外は同じですが今後処理が変わる可能性もあるので、一応分けて作りました。

using UnityEngine;
using VContainer;
using VContainer.Unity;

namespace Score
{
    /// <summary>
    /// ゲームシーンのスコアのライフタイムスコープ
    /// ゲームシーンのGameObjectにアタッチして使用する
    /// </summary>
    public class ScoreSceneGameLifetimeScope : LifetimeScope
    {
        [SerializeField] private ScoreScreen _scoreScreen;

        protected override void Configure(IContainerBuilder builder)
        {
            base.Configure(builder);

            builder.Register<ScoreService>(Lifetime.Singleton);
            builder.Register<ScoreDataPresenter>(Lifetime.Singleton);
            builder.RegisterEntryPoint<ScoreDataPresenter>();
            builder.RegisterComponent(_scoreScreen);
        }
    }
}


ScoreSceneGameLifetimeScopeにScoerScreenをアタッチ


ViewにScoreScreenをアタッチ

いいなと思ったら応援しよう!