룰렛 MVP 패턴으로 수정
This commit is contained in:
@@ -2,7 +2,7 @@ using UnityEngine;
|
||||
using UnityEngine.Events;
|
||||
using System.Collections;
|
||||
using UniRx;
|
||||
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace TON
|
||||
{
|
||||
@@ -27,6 +27,9 @@ namespace TON
|
||||
private bool isSpinning = false; // 현재 회전중인지
|
||||
private int selectedIndex = 0; // 룰렛에서 선택된 아이템
|
||||
|
||||
private RoulettePresenter presenter;
|
||||
private List<RoulettePiece> pieceUIs = new();
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
pieceAngle = 360 / roulettePieceData.Length;
|
||||
@@ -39,16 +42,15 @@ namespace TON
|
||||
|
||||
private void SpawnPiecesAndLines()
|
||||
{
|
||||
for (int i = 0; i < roulettePieceData.Length; ++i)
|
||||
for (int i = 0; i < presenter.RoulettePieces.Count; ++i)
|
||||
{
|
||||
Transform piece = Instantiate(piecePrefab, pieceParent.position, Quaternion.identity, pieceParent);
|
||||
// 생성한 룰렛 조각의 정보 설정(아이콘, 설명)
|
||||
piece.GetComponent<RoulettePiece>().Setup(roulettePieceData[i]);
|
||||
// 생성한 룰렛 조각 회전
|
||||
var pieceUI = piece.GetComponent<RoulettePiece>();
|
||||
pieceUI.Setup(presenter.RoulettePieces[i].Model);
|
||||
piece.RotateAround(pieceParent.position, Vector3.back, (pieceAngle * i));
|
||||
|
||||
pieceUIs.Add(pieceUI);
|
||||
|
||||
Transform line = Instantiate(linePrefab, lineParent.position, Quaternion.identity, lineParent);
|
||||
// 생성한 선 회전 (룰렛 조각 사이를 구분하는 용도
|
||||
line.RotateAround(lineParent.position, Vector3.back, (pieceAngle * i) + halfPieceAngle);
|
||||
}
|
||||
}
|
||||
@@ -87,50 +89,48 @@ namespace TON
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void Spin(UnityAction<RoulettePieceData> action = null)
|
||||
public void Bind(RoulettePresenter presenter)
|
||||
{
|
||||
if(isSpinning == true) return;
|
||||
|
||||
// 룰렛의 결과 값 선택
|
||||
selectedIndex = GetRandomIndex();
|
||||
// 선택된 결과의 중심 각도
|
||||
float angle = pieceAngle * selectedIndex;
|
||||
// 정확히 중심이 아닌 결과 값 범위 안의 임의의 각도 선택
|
||||
float leftOffset = (angle - halfPieceAngleWithPaddings) % 360;
|
||||
float rightOffset = (angle + halfPieceAngleWithPaddings) % 360;
|
||||
float randomAngle = Random.Range(leftOffset, rightOffset);
|
||||
|
||||
// 목표 각도(targetAngle) = 결과 각도 + 360 * 회전 시간 * 회전 속도
|
||||
int rotateSpeed = 2;
|
||||
float targetangle = (randomAngle + 360 * spinDuration * rotateSpeed);
|
||||
|
||||
Debug.Log($"SelectedIndex:{selectedIndex}, angle:{angle}");
|
||||
Debug.Log($"left/right/random:{leftOffset}/{rightOffset}/{randomAngle}");
|
||||
Debug.Log($"targetAngle:{targetangle}");
|
||||
|
||||
isSpinning = true;
|
||||
StartCoroutine(OnSpin(targetangle, action));
|
||||
this.presenter = presenter;
|
||||
pieceAngle = 360f / roulettePieceData.Length;
|
||||
halfPieceAngle = pieceAngle * 0.5f;
|
||||
halfPieceAngleWithPaddings = halfPieceAngle - (halfPieceAngle * 0.25f);
|
||||
SpawnPiecesAndLines();
|
||||
}
|
||||
|
||||
private IEnumerator OnSpin(float end, UnityAction<RoulettePieceData> action)
|
||||
public void Spin(System.Action<RoulettePiecePresenter> onEnd)
|
||||
{
|
||||
if (presenter.IsSpinning.Value) return;
|
||||
presenter.Spin(selectedPresenter =>
|
||||
{
|
||||
int selectedIndex = selectedPresenter.Index.Value;
|
||||
float angle = pieceAngle * selectedIndex;
|
||||
float leftOffset = (angle - halfPieceAngleWithPaddings) % 360;
|
||||
float rightOffset = (angle + halfPieceAngleWithPaddings) % 360;
|
||||
float randomAngle = Random.Range(leftOffset, rightOffset);
|
||||
int rotateSpeed = 2;
|
||||
float targetangle = (randomAngle + 360 * spinDuration * rotateSpeed);
|
||||
StartCoroutine(OnSpin(targetangle, () =>
|
||||
{
|
||||
presenter.IsSpinning.Value = false;
|
||||
onEnd?.Invoke(selectedPresenter);
|
||||
}));
|
||||
});
|
||||
}
|
||||
|
||||
private System.Collections.IEnumerator OnSpin(float end, System.Action onEnd)
|
||||
{
|
||||
float current = 0;
|
||||
float percent = 0;
|
||||
|
||||
while (percent < 1)
|
||||
{
|
||||
current = Time.deltaTime;
|
||||
percent += current / spinDuration;
|
||||
|
||||
float z = Mathf.Lerp(0, end, spinningCurve.Evaluate(percent));
|
||||
spinningRoulette.rotation = Quaternion.Euler(0, 0, z);
|
||||
|
||||
yield return null;
|
||||
}
|
||||
|
||||
isSpinning = false;
|
||||
|
||||
if(action != null) action.Invoke(roulettePieceData[selectedIndex]);
|
||||
onEnd?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user