Unity 내배캠 TIL

카드 뒤집기 게임 - 팀 프로젝트 협업하기(1주차 5일)

오늘도즐겨 2024. 9. 15. 06:29

조건이 충족되었을 때 애니메이션이 작동하고, 삭제되는 GamObject 만들기

 

카드를 맞췄을 때 +3초 하트가 위로 올라가는 애니메이션,

카드를 틀렸을 때는 -1초 (Level별 상이) 하트가 아래로 내려가는 애니메이션!

애니메이션을 녹화버튼을 통해 각 포지션값과 Image color값을 변경해 준다.

 

Add Event 버튼으로 가장 마지막에 추가해 준다.

 

마지막 부분에 넣어준 Event를 클릭하면 아래와 같이 Inspector창에  아래와 같이 Function이라는 부분이 보인다.

 

 

미리 만들어 놓은 AddTime Script의 TimeAdd함수를 넣어준다!

public class AddTime : MonoBehaviour
{   
    public void TimeAdd()
    {
        this.gameObject.SetActive(false);
    }    

}

 

애니메이션이 동작하고 동작이 끝나면 마지막으로 스크립트의 내용처럼 :)

자동으로 GameObject => False처리된다!

 

GameManager Script

마지막으로 GameObject 변수를 선언해 주고, Inspector창에서 각각의 Object를 삽입해 준다.

각각의 오브젝트의 True조건을 설정해 준다.

사실  Build Setting에서 1-3까지의 씬 순서를 반대로 넣어줬지만 그냥 해~ 우리만 알아보고 코드만 틀리지 않으면 돼!!!

이래서 ㅋㅋㅋㅋㅋ아래와 같은 순서로 구현이 되었다 :)

EasyMode = SceneIndex 3 , Normal Mode  = SceneIndex  2, Hard Mode  = SceneIndex  1

 public GameObject addTime;
 public GameObject mnTime1;
 public GameObject mnTime2;
 public GameObject mnTime3;
 
     public void Wrong_Card()
    {
        AudioManager.Instance.MissMatchSound();
        if (sceneIndex == 3)
        {
            time_Tmp -= 1f;
            mnTime1.SetActive(true);
        }
        else if (sceneIndex == 2)
        {
            time_Tmp -= 1.5f;
            mnTime2.SetActive(true);
        }
        else if (sceneIndex == 1)
        {
            time_Tmp -= 2f;
            mnTime3.SetActive(true);
        }
    }

    public void Correct_Card()
    {
        AudioManager.Instance.MatchedSound();
        addTime.SetActive(true);

        if (time_Tmp + 3f <= time)
        {
            time_Tmp += 3f;
        }
        else
        {
            time_Tmp = time;            
        }
    }

 

방해 요소 중복제어하기

    public void Obstacle()
    {
        GameManager.Instance.ObstacleSignOn(); //방해요소발동시 WarningSign켜는 함수실행    

        int ran_Obstacle;
        do
        {
            ran_Obstacle = Random.Range(0, 3);
        } while (obstacle_arr[ran_Obstacle] == 100);

        obstacle_arr[ran_Obstacle] = 100;

        if (ran_Obstacle == 0)
            BoardRotation();//카드 Y축 180도 회전 함수
        else if (ran_Obstacle == 1)
            Curtain_Time();//남은시간 가리는 함수
        else if (ran_Obstacle == 2)
            Crow(); //까마귀로 화면 가리는 함수
    }

우리팀이 만든 방해요소는 총 3가지이다.

 

위와 같이 do_while문을 통해 랜덤함수를 실행 하고, 조건을 확인 한다.

조건은 있을 수 없는 임의의 수를 넣어 do_While문을 빠져 나와

아래의 조건들을 수행한다.

이미 실행된 랜덤의 수는 조건의 수와 동일하게 변경하여 조건을 true로 만들고,

반복문을 다시 실행하게 한다.

그럼 이미 나온 랜덤의 수를 제외하고 남은 수 중 1개가 나올것이다.

 

do While문의 구조

do
{
	반복처리구문;
}
while (조건);

 

do_While문은 do 내부 코드를 실행하고 조건을 확인 한다.

조건이 true일 때에만, 다시 do 반복처리문을 실행해 준다.

 

 

 

예시_이미지 28개의 스페이스에 랜덤한 이미지 중복되지 않게 뽑기 방법

   public Sprite[] sprites; //166개의 이미지저장배열 
   public Image[] imgSpace; //28개 이미지저장소
   public int[] ranChamNum;
   
   void Start()
   {
      ranChamNum = new int[165];
   }
   
   public void randomNumber()
   {
       for (int i = 0; i < 165; i++)
       {
           ranChamNum[i] = i;
       }       
       for (int i = 0; i < imgSpace.Length; i++)
       {
           // 랜덤하게 i 번째 대입공간에 순서대로 랜덤이미지를 넣어줌          
           int randomNumber = 0; //지역변수
           do
           {
               randomNumber = Random.Range(0, 165); //랜덤뽑기(0~164까지)
           }
           while (ranChamNum[randomNumber] == 1000); //랜덤중복방지코드***

           //여기에 ranChamNum[randomNumber]을 매개변수로 받도록 이미지 출력하는 함수
           imgSpace[i].sprite = sprites[randomNumber];

           ranChamNum[randomNumber] = 1000;
        }
   }

 

for문은 총 Inspector에서 미리 추가해준 imgSpace의 길이 만큼 28번 돌아 갈 것이고,

randomNumber 라는 지역변수를 만들어서 0으로 초기화 해준다.

 

이후 do 내부에 반복으로 랜덤처리할 randomNumber = Random.Range(0, 165); 코드가 실행되고,

 

while (ranChamNum[randomNumber] == 1000);  조건을 확인 한다. 

 

조건에 ranChamNum[] =  0~165까지! 임의의 숫자 1000이 될 수 없음!

조건에 참이 될 수 없기에 빠져 나와

 

 i번째의 imgSpace에 randomNumber와 동일한 이미지를 삽입하여 준다.

이후 이미 do_While문에서 실행된 코드는 임의의 값인 ranChamNum[randomNumber] = 1000; 값을 넣어준다.

이미 실행된 ranChamNum[] =  0~165까지!  (0~165중 1개)는 1000이 되어버려 제외되고,

다시 For문으로 들어가서 반복 된다.