見出し画像

RAYSER進捗(20231201)

VContainerとMessagePipeの修学をかねて、RAYSERのカスタマイズ画面に表示するアイテムのモーダル内に動的でアイテム購入ボタンを生成して、そのアイテム購入ボタン押下時に、Publishさせるというものを作る方法を昨日から色々調べていて、LifetimeScopeの方で動的生成とMessagePipeのDIをするように書き換えたらとりあえず適用はできたみたい。

まだ使いこなせていないけど、VContainerとMessagePipeは今回のショップ機能のようなものを実装するときに相性が良さそうな気がする。設計次第だけど各ショップの処理はあくまでアイテムの情報の受け渡しだけしていけばだいぶシンプルに作れると思うし、本当ありがたいツールです。

using _RAYSER.Scripts.UI.Modal;
using _RAYSER.Scripts.UI.Title;
using MessagePipe;
using UnityEngine;
using VContainer;
using VContainer.Unity;

namespace _RAYSER.Scripts.Item
{
    /// <summary>
    /// アイテムライフタイムスコープクラス
    /// </summary>

    public class ItemLifetimeScope : LifetimeScope
    {
        [SerializeField] private ItemList itemList;
        [SerializeField] private ItemBuyButton itemButtonPrefab;
        [SerializeField] private Transform itemModalContentTransform;
        protected override void Configure(IContainerBuilder builder)
        {
            var options = builder.RegisterMessagePipe();
            builder.RegisterMessageBroker<ItemData>(options);

            if (itemList != null)
            {
                builder.RegisterInstance(itemList);
            }
            builder.RegisterBuildCallback(container =>
            {
                foreach (var item in itemList.items)
                {
                    var instance = Instantiate(itemButtonPrefab, itemModalContentTransform);
                    var publisher = container.Resolve<IPublisher<ItemData>>();
                    instance.Setup(item, publisher);
                }
            });

            // Entry Point
            builder.RegisterEntryPoint<ItemPurchaseProcessing>();
        }
    }
}

アイテムボタンの処理はまだ諸々仮で、購入したアイテムの一覧をMessagePipeで受信したら、購入済みアイテムのボタンを無効にするなどの処理なども追加する予定です。

using System;
using MessagePipe;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
using VContainer;

namespace _RAYSER.Scripts.Item
{
    /// <summary>
    /// カスタマイズ画面アイテム購入ボタンUIクラス
    /// </summary>
    public class ItemBuyButton : MonoBehaviour
    {
        [Inject]
        private IPublisher<ItemData> onItemPurchasePublisher;

        [SerializeField] private TextMeshProUGUI itemNameText;
        [SerializeField] private Image thumbnailImage;
        [SerializeField] private Button button;

        private ItemData itemData;
        public int Id { get; set; }

        private IPublisher<ItemData> _itemPurchasePublisher;
        private IDisposable _disposable;

        public void Setup(IItem item, IPublisher<ItemData> itemPurchasePublisher)
        {
            _itemPurchasePublisher = itemPurchasePublisher;

            if (item is ItemData data) // セーフキャストを使用
            {
                itemData = data;
                // ここで UI のセットアップを行います
                itemNameText.text = itemData.name;
                thumbnailImage.sprite = itemData.iconImage;

                // 購入ボタン押下時処理
                button.onClick.AddListener(() => OnPurchase(itemData));
            }
            else
            {
                Debug.LogError("提供されたアイテムは ItemData 型ではありません。");
            }

        }

        // 購入ボタン押下時処理
        public void OnPurchase(ItemData itemData)
        {
            if (itemData != null)
            {
                Debug.Log(itemData.name);
                _itemPurchasePublisher.Publish(itemData);

                // TODO ダイアログ発信のシグナルを送る、シグナルにitemDataを乗せる

                // onItemPurchasePublisher.Publish(itemData);
                // 購入処理をここに書く

                // dialog表示

            }
            else
            {
                Debug.LogError("アイテムデータが設定されていません。");
            }
        }
    }
}

この記事が気に入ったらサポートをしてみませんか?