ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [유니티] 플레이_조건 맞는 행성 만들기
    게임 개발 2020. 1. 15. 23:47

    한 삼일 내내 골머리를 아프게 한 작업이었다.

    상점 만들기와는 다르게 여러가지 스크립트로 작업을 해서 복잡도가 높았던 것 같다.

     

    우선, 행성을 만들기 위한 더 자세한 설명이다.

     

    1. 게임 화면에 보이는 스팟은 항상 5개

    2. 5개의 스팟 중 행성은 2~5개가 생성되어야 한다.

    2-1. 메인 스팟에서는 항상 행성이 생성되어야 한다.

    3. 현재 Player가 지나온 행성 score에 따라 행성의 gravityLevel이 결정된다.

    4. 행성 이미지는 5개 중 랜덤으로 결정된다.

    5. 코인의 생성 확률은 60프로

    6. 운석은 코인이 생성되지 않았을 때, 30프로 확률로 발생한다.

     

     

    1. 게임 화면에 보이는 스팟은 항상 5개

     

    Play Scene에서 Canvas를 만들어 아래에 Spot 게임 오브젝트를 5개 넣어주었다. 

    스팟들의 위치는 유니티 씬 내에서 설정해 주었다.

     

     

    2.  5개의 스팟 중 행성은 2~5개가 생성되어야 한다.

     

    행성 위치(스팟 선택), gravityLevel, planetImage, coin/meteor 여부를 관리하는 Planet_manager 스크립트를 만들었다.

     

    // 중복 없는 난수 배열 생성

     int [] random_place() {
            // 메인 스팟 포함한 5개 영역에서 최소 2~5개 생성
            int rand = Random.Range(2, spotSize+1);

            // 중복 없이 planetNum만큼의 스팟배열 생성
            int [] spotArray = new int [rand];
            bool isSame;

     

    2-1. 메인 스팟에서는 항상 행성이 생성되어야 한다.
            spotArray[0] = 2;   // 항상 메인 스팟 생성 / 메인 스팟 인덱스 = 2
            for (int i = 1; i < spotArray.Length; i++)
            {
                while (true)
                {
                    spotArray[i] = Random.Range(0, spotSize); 
                    isSame = false;
                    for (int j = 0; j < i; j++)
                    {
                        if (spotArray[j] == spotArray[i])
                        {
                            isSame = true;
                            break;
                        }
                    }
                    if (!isSame) break;
                }
            }
            return spotArray;
        }

     

     

    3. 현재 Player가 지나온 행성 score에 따라 행성의 gravityLevel이 결정된다.

     

    이 부분의 코드는 진짜 막 썼다. 매우 비효율적이다.

    만약 더 복잡한 상황이었다면, 이 방법은 바로 쓰레기통으로 버렸을 것이다.

     

    // planetNum에 따른 생성 확률에 의해 중력 레벨 선택
        int Select_gravityLevel() {
            int random = Random.Range(1, 11);
            if (planetNum >= 0 && planetNum < 15)
            {
                if (random <= 7)
                {
                    gravityLevel = 1;
                }
                else gravityLevel = 2;
            }
            else if (planetNum < 30)
            {
                if (random <= 5)
                    gravityLevel = 1;
                else if (random <= 8)
                    gravityLevel = 2;
                else
                    gravityLevel = 3;
            } .....

     

    위에 보이는 것처럼 확률이 10의 단위이고, 경우가 적기 때문에 다 나열해서 적었다.

    1~10까지의 랜덤 숫자를 뽑고 그 숫자가 7 이하이면 조건문을 실행 -> 70% 확률..

    이런 식의 논리로 접근하였다.

     

     

    4. 행성 이미지는 5개 중 랜덤으로 결정된다.

     

     imageNum = Random.Range(0, 5);

     

    0~4까지의 숫자를 랜덤 추출하여 이미지 배열의 인덱스로 사용하였다.

     

     

    5. 코인의 생성 확률은 60프로

    6. 운석은 코인이 생성되지 않았을 때, 30프로 확률로 발생한다.

     

                // 코인 여부
                int rand = Random.Range(1, 11);
                if (rand <= 6)
                    coin = true;
                else
                    coin = false;
                //운석 여부
                rand= Random.Range(1, 11);
                if ((coin == false) && rand <= 3)
                    meteor = true;
                else
                    meteor = false;

     

    위의 확률 논리와 같은 논리로 작성하였다.

     

     

    이렇게 행성에 필요한 요소(gravityLevel, planetImage, coin/meteor여부)들을 모두 설정한 후

    게임 오브젝트를 찾아놓은 spot위치에 클론을 만들어 놓음으로 행성을 만들었다.

     

                Instantiate(gravityArea[gravityLevel-1].gameObject, spotPos, Quaternion.identity);
                Instantiate(planetImages[imageNum].gameObject, spotPos, Quaternion.identity);
                if(coin)
                    Instantiate(coinImage.gameObject, spotPos, Quaternion.identity);
                if(meteor)
                    Instantiate(meteorImage.gameObject, spotPos, Quaternion.identity);

     

    이때 사용한 것이 Instantiate() 함수이다.

    인수로는 게임 오브젝트, 위치 (Vector3), rotation여부가 순서대로 들어간다.

     

    이렇게 무작위로 위치에 행성을 만드는 코드를 짜 보았다.

    게임 화면 (배경 없음)

    사실 아직 완성되진 않았다.

     

    문제가 발생하였는데,

    바로 행성의 레이어가 gravityArea 레이어 밑에 깔리는 경우가 발생하였다.

    이를 해결해야 하고, gravityLevel에 따라 coin/meteor 생성 위치를 달리하는 코드도 작성해야 한다.

     

    댓글

Designed by Tistory.