룰렛 MVP 패턴으로 수정

This commit is contained in:
Mingu Kim
2025-07-03 18:54:16 +09:00
parent 750f4173c0
commit 79f87bc110
5 changed files with 136 additions and 109 deletions

View File

@@ -1,4 +1,4 @@
using System.Collections;
using System;
using System.Collections.Generic;
using UniRx;
using UnityEngine;
@@ -9,42 +9,64 @@ namespace TON
{
private PlayerDataManager playerDataManager;
private List<RoulettePieceData> roulettePieceModels = new();
public ReactiveCollection<RoulettePresenter> RoulettePieces { get; } = new();
public RoulettePresenter()
{
// 싱글톤으로 PlayerDataManager 접근
playerDataManager = PlayerDataManager.Singleton;
public ReactiveCollection<RoulettePiecePresenter> RoulettePieces { get; } = new();
public ReactiveProperty<bool> IsSpinning { get; } = new(false);
public ReactiveProperty<RoulettePiecePresenter> SelectedPiece { get; } = new();
private int accumulatedWeight;
public RoulettePresenter(RoulettePieceData[] pieceDataArray)
{
playerDataManager = PlayerDataManager.Singleton;
if (playerDataManager == null)
{
Debug.LogError("PlayerDataManager가 초기화되지 않았습니다.");
}
// Todo : UI 바인딩
roulettePieceModels.Add(new RoulettePieceData("10", 1));
roulettePieceModels.Add(new RoulettePieceData("2", 14));
roulettePieceModels.Add(new RoulettePieceData("25", 1));
roulettePieceModels.Add(new RoulettePieceData("400", 72));
roulettePieceModels.Add(new RoulettePieceData("50", 1));
roulettePieceModels.Add(new RoulettePieceData("1000", 11));
foreach (var item in roulettePieceModels)
accumulatedWeight = 0;
for (int i = 0; i < pieceDataArray.Length; ++i)
{
RoulettePieces.Add(new RoulettePresenter(this, item));
var data = pieceDataArray[i];
data.index = i;
if (data.chance <= 0) data.chance = 1;
accumulatedWeight += data.chance;
data.weight = accumulatedWeight;
roulettePieceModels.Add(data);
RoulettePieces.Add(new RoulettePiecePresenter(data));
}
}
// 재화 획득 메서드
public void InsertRouletteResult(RoulettePieceData selectedData)
public int GetRandomIndex()
{
// 재화 획득 코드 추가
playerDataManager.AddGold(int.Parse(selectedData.description));
// UI 갱신 코드 추가
UIManager.Singleton.UpdateCashData();
Debug.Log($"{selectedData.index}:{selectedData.description}");
int weight = UnityEngine.Random.Range(0, accumulatedWeight);
for (int i = 0; i < roulettePieceModels.Count; ++i)
{
if (roulettePieceModels[i].weight > weight)
{
return i;
}
}
return 0;
}
public void Spin(Action<RoulettePiecePresenter> onResult = null)
{
if (IsSpinning.Value) return;
IsSpinning.Value = true;
int selectedIndex = GetRandomIndex();
var selected = RoulettePieces[selectedIndex];
SelectedPiece.Value = selected;
onResult?.Invoke(selected);
}
// 결과 처리(예: 골드 지급 등)
public void InsertRouletteResult(RoulettePiecePresenter selectedPresenter)
{
if (playerDataManager != null && int.TryParse(selectedPresenter.Description.Value, out int gold))
{
playerDataManager.AddGold(gold);
UIManager.Singleton.UpdateCashData();
Debug.Log($"{selectedPresenter.Index.Value}:{selectedPresenter.Description.Value}");
}
}
}
}