Files
M-Gameton-06/Gameton-06/Assets/Gameton/Scripts/UI/RouletteSpin/RoulettePresenter.cs
2025-07-03 18:54:16 +09:00

73 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using UniRx;
using UnityEngine;
namespace TON
{
public class RoulettePresenter
{
private PlayerDataManager playerDataManager;
private List<RoulettePieceData> roulettePieceModels = new();
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가 초기화되지 않았습니다.");
}
accumulatedWeight = 0;
for (int i = 0; i < pieceDataArray.Length; ++i)
{
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 int GetRandomIndex()
{
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}");
}
}
}
}