룰렛 MVP 패턴으로 수정
This commit is contained in:
@@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user