🎮 Unity

[UNITY] 아이템 랜덤 출력 (배열)

dlalwl_jpg 2023. 3. 19. 14:49

당근을 배치하고 이제 당근을 랜덤으로 출력하도록 코드를 짤 것이다. 

* 이전 작성 글에서 랜덤 숫자를 출력하는 부분 등 코드가 전반적으로 수정되었다.

(이전 작성 글)

https://studybook.tistory.com/66

 

[UNITY] 프리팹(Prefab) 생성

이제 당근을 배치해보자. 위 사진처럼 토끼 뒤에 당근 12개를 랜덤으로 출현시켜야 한다. 랜덤 출현을 적용하기 전에 먼저 당근 12개를 프리팹을 이용하여 배치할 것이다. 똑같은 오브젝트를 여

studybook.tistory.com


 

EventManager 스크립트를 전반적으로 수정해주었다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EventManager : MonoBehaviour
{
    public GameObject Success; //성공 이미지
    public GameObject Failure; //실패 이미지
    public GameObject Rabbit; //토끼 이미지
    private bool success_state; //성공이미지 활성화.비활성화 설정
    private bool failure_state; //실패이미지 활성화.비활성화 설정
    private bool rabbit_state; //토끼이미지 활성화.비활성화 설정
    public GameObject[] Carrot = new GameObject[12]; //당근이미지
    private bool carrot_state; //토끼이미지 활성화.비활성화 
    private int sum = 0; //당근 개수 합계

    void Start()
    {
        CarrotView();

        //성공.실패 이미지 비활성화
        success_state = false;
        failure_state = false;
        //토끼 이미지 활성화
        rabbit_state = true;
        Success.SetActive(success_state);
        Failure.SetActive(failure_state);
        Rabbit.SetActive(rabbit_state);
    }

    //당근 랜덤 출현
    void CarrotView()
    {
        int i = 0;
        int carrotStateNum; //당근 활성.비활성화 랜덤 결정 정수
        carrot_state = false;

        //당근 초기화(비활성화)
        for (i = 0; i < 12; i++)
            Carrot[i].SetActive(carrot_state);

        //합계 초기화
        sum = 0;

        for (i = 0; i < 12; i++)
        {
            //당근 랜덤으로 활성.비활성화 결정
            carrotStateNum = Random.Range(0, 2);

            //carrotStateNum이 1이면 활성화
            if (carrotStateNum == 1)
                carrot_state = true;

            //0이면 비활성화
            else
                carrot_state = false;

            //당근 활성.비활성화
            Carrot[i].SetActive(carrot_state);
            //활성화된 당근 개수
            sum += carrotStateNum;
        }

        //콘솔 결과 확인
        Debug.Log("sum: " +  sum);
    }


    //짝수 버튼 클릭 시
    public void EvenButtonClick()
    {
        //당근 개수가 짝수라면
        if (sum % 2 == 0)
        {
            success_state = true;
            failure_state = false;
        }

        //당근 개수가 홀수라면
        else
        {
            success_state = false;
            failure_state = true;
        }

        //성공.실패 이미지 출력
        rabbit_state = false;
        Rabbit.SetActive(rabbit_state);
        Success.SetActive(success_state);
        Failure.SetActive(failure_state);
        //콘솔 결과 확인
        Debug.Log("success_state: " + success_state + " / failure_state: " + failure_state);
        //랜덤 숫자 재생성 및 토끼 이미지 출력
        Invoke("Start", 3);
    }

    //홀수 버튼 클릭 시
    public void OddButtonClick()
    {
        //당근 개수가 홀수라면
        if (sum % 2 != 0)
        {
            success_state = true;
            failure_state = false;
        }

        //당근 개수가 짝수라면
        else
        {
            success_state = false;
            failure_state = true;
        }

        //성공.실패 이미지 출력
        rabbit_state = false;
        Rabbit.SetActive(rabbit_state);
        Success.SetActive(success_state);
        Failure.SetActive(failure_state);
        //콘솔 결과 확인
        Debug.Log("success_state: " + success_state + " / failure_state: " + failure_state);
        //랜덤 숫자 재생성 및 토끼 이미지 출력
        Invoke("Start", 3);
    }


}

[코드 설명]

기존에는 코드는 랜덤 숫자를 먼저 출력하고 랜덤으로 출력된 숫자에 맞게 당근을 출력하려고 했다. 그랬더니 당근이 랜덤 숫자에 맞게 출력이 될 때까지 반복해야해서 코드가 너무 비효율적으로 되었다. 그래서 당근이 총 12개이므로 이 당근들을 12번 반복하여 0부터 11당근들을 활성화 비활성화 할지 랜덤으로 결정한다. 그리고 이 당근들의 개수를 다 합해서 합계가 짝수인지 홀수인지 판단하여 누른 버튼에 따라 성공과 실패 이미지를 띄우는 걸로 코드를 수정하였다.


위처럼 코드를 짜고 EventSystem의 인스펙터를 확인해보면 Carrot 배열 크기만큼 element가 생긴 걸 볼 수 있다. 그곳에 해당하는 당근을 넣어준다. 


[주의할 점]

게임을 실행했을 때 아래 사진처럼 사진의 순서가 앞뒤로 바꾸고 싶을 때가 있다.

이러한 경우에는 아래 사진처럼 뒤에 배치하고 싶은 것을 위로 자리를 바꿔준다.

기존 순서
당근을 뒤로 배치한 순서


[결과 확인]

게임을 실행해 당근이 잘 나오는지 확인할 때는 토끼를 비활성화하여 당근이 sum개수와 똑같이 잘 나왔는지 확인한다.

당근이 sum개수만큼 랜덤으로 잘 출력되는 것을 알 수 있다.