1. 게임에서 자주 사용하는 돌림판 기획 및 개발까지 진행해보자.
초안
- 기획자는 돌림판에 최소 4개부터 최대 8가지의 메뉴를 선택할 수 있다.
- 시작 버튼을 클릭하면 중앙에 존재하는 바늘이 회전한다.
- 바늘 애니메이션은 빠르게 돌다가 천천히 멈춘다. (1.5초 이내)
> 멈추는 지점은 각 애니메이션으로 제작 (총 12개)
- 바늘이 위치한 곳에 있는 메뉴가 당첨된다.
- 기획자가 모든 메뉴에 대해서 확률을 선택할 수 있어야 한다.
- 메뉴가 당첨된 후 룰렛은 리셋되어 바늘은 최초 상태로 변경된다.
고려사항
- 시작 버튼 클릭 시, 무조건 메뉴 하나는 확정되어야 한다.
- 시작 버튼 클릭 후 룰렛 애니메이션이 실행되는 동안 시작 버튼은 눌리지 않는다.
- 바늘은 경계선에 걸치지 않는다.
1.1 제어 확률 변수 세팅
메뉴 개수 입력 : x = 4,5,6,7,8
메뉴 텍스트 입력 : RouletteMenu[x] = {a,b,c,d..}
기대값 입력 (백분율) : ExpectedValue[y] = {0,1...}
- 기대값의 인덱스는 메뉴 개수와 동일하다.
- 기대값은 0부터 100까지 입력한다.
- 기대값의 합은 100이다.
- 기대값 인덱스에 들어간 값은 순차적으로 메뉴
예)
메뉴 개수가 4일 경우 : {5, 20, 30,45}
메뉴 개수가 8일 경우 : {1,1,1,1,1,1,1,93}
public class GameManager : MonoBehaviour
{
public SpriteRenderer niddle; // 돌림판 침
public Animator animator; // 돌림판 룰렛에 붙어있는 애니메이션
public GameObject startBtn; // 시작 버튼
public TextMeshProUGUI[] RouletteMenu; //룰렛 메뉴
public float[] ExpectedValues;
void Start()
{
Button startButton = startBtn.GetComponent<Button>();
startButton.onClick.AddListener(RouletteStartClick);
DisplayMenu();
if(animator == null){
Debug.LogError("Animator component not connected");
}
}
void RouletteStartClick()
{
int selectedIndex = PickRandomIndex();
PlayRandomAnimation(selectedIndex);
Debug.Log("뽑힌 숫자 : "+selectedIndex);
}
int PickRandomIndex()
{
float totalProbability = 0f;
//전체 확률 계산
foreach (float probability in ExpectedValues)
{
totalProbability += probability;
}
//0부터 100 사이의 난수 생성
float randomValue = Random.Range(0f, totalProbability);
Debug.Log("뽑힌 randomValue : "+randomValue);
float cumulativeProbability = 0f;
//확률에 따라 선택된 인덱스 결정
for(int i = 0; i < ExpectedValues.Length; i++){
cumulativeProbability += ExpectedValues[i];
if(randomValue <= cumulativeProbability){
return i; //선택된 인덱스 반환
}
}
return 0; //예외적인 경우, 첫 번째 인덱스 반환
}
public void PlayRandomAnimation(int index)
{
if(animator != null){
switch(index){
case 0 : animator.SetTrigger("menu_1st"); break;
case 1 : animator.SetTrigger("menu_2nd"); break;
case 2 : animator.SetTrigger("menu_3rd"); break;
case 3 : animator.SetTrigger("menu_4th"); break;
case 4 : animator.SetTrigger("menu_5th"); break;
case 5 : animator.SetTrigger("menu_6th"); break;
case 6 : animator.SetTrigger("menu_7th"); break;
case 7 : animator.SetTrigger("menu_8th"); break;
}
}
}
void DisplayMenu()
{
for(int i = 0; i < RouletteMenu.Length; i++){
SetText(i, ExpectedValues[i] + "%");
}
}
void SetText(int index, string message)
{
if (index >= 0 && index < RouletteMenu.Length){
RouletteMenu[index].text = message;
}
else{
Debug.Log("SetText Error");
}
}
}
- 일단 8개의 메뉴로 구성된 룰렛판을 만들어 보았다.
- 바늘이 도는 형태를 애니메이션으로 구성해봤는데, 구색만 맞추어 제작하다보니 약간 허접해보인다.
- gameManager에서 확률 값을 입력할 수 있도록 만들고, 해당 확률이 메뉴로 보여지게끔 구성했다.
'프로그래밍 > Unity3D' 카테고리의 다른 글
Unity3D::마우스 위치따라서 스프라이트 이동하기 (1) | 2024.01.08 |
---|---|
GameObject 이동 및 회전 (0) | 2023.12.24 |