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");
              }
       }
}

 

사용한 샘플씬 구조 및 GameManager Inspector
포토샵으로 급조해 만든 룰렛 판

 

 

  • 일단 8개의 메뉴로 구성된 룰렛판을 만들어 보았다.
  • 바늘이 도는 형태를 애니메이션으로 구성해봤는데, 구색만 맞추어 제작하다보니 약간 허접해보인다.
  • gameManager에서 확률 값을 입력할 수 있도록 만들고, 해당 확률이 메뉴로 보여지게끔 구성했다.

+ Recent posts