유니티 2D 게임 제작 4단계
(SLIDE TO CIRCLE)
#맵 바꾸기
만약 맵이 하나라면 재미가 없을 것이다..!

여기 위의 7개의 맵을 만들었습니다.
빙글빙글 돌거나,
나타났다가 사라지거나,
차례차례 사라지거나,
위로 올라가서 방해하거나,
가만히 있거나 등의 서로 다른 움직임을 가지고 있습니다.

왼쪽 히어라이어키를 보면, Level들이 비활성화 되어있는데,
이제부터 비활성화 된것을 활성화 시키고, 각각에 맞는 움직임을 구현할 것입니다.
즉 맵을 바꾸는 것이죠..!
저는 게임 종료전까지 랜덤으로 맵이 막 바뀌었으면 좋겠다고 생각했습니다.

엄청 간단해 보이지만, 이 스크립트 작성이 제일 오래걸렸습니다.
7개의 맵의 움직임과 생성, 삭제를 한 스크립트에서 해결하고 싶어서,
그랬던 것 같습니다. 최대한 간결하게 설명하겠습니다.
지금 Start()함수, 씬이 시작될때 시작하는 처음 실행되는 함수부터
FixedUpdate함수까지 아래의 3단계를 반복합니다.
마지막 4단계는 1단계~3단계가 실행되고, 계속 실행됩니다.
1단계. Start_Level() : 1부터 7까지의 레벨(맵)을 랜덤으로 시작합니다.
2단계. Time_Level() : 시작한 레벨(맵)이 몇 초동안 실행되는지 확인합니다.
3단계. End_Level() : 레벨을 끝냅니다.
4단계. MoveMent_Level() : 레벨의 움직임을 작동시킵니다.
밑에 if문은 안드로이드 폰의 뒤로가기를 눌렀을 때 씬 전환을 시키는 코드들입니다.

1. 0부터 100사이의 랜덤한 실수 k를 생성합니다.
2. k가 if문 R_1보다 크면 else if문 R_2보다 크면 else if문 R_3보다 크면 ... 즉 랜덤한 k를 이용해 어떤 레벨(맵)을 시작할지 정하는 것입니다. R_1, R_2, R_3, R_4, R_5, R_6은 모두 함수를 호출할때 지정할 수 있는 수입니다. 인자라고 하죠.. 인자를 잘 조절하여, 공평하게 어떤 레벨(맵)을 시작할 수도 있고, 특정 레벨(맵)이 시작될 확률을 높일 수 있습니다. 예를 들면, 플레이어가 게임을 잘 버틴다, 막 20바퀴를 돌고 죽질 않는다, 그러면 어려운 Level_6과 Level_7의 확률을 증가시키고 나머지 쉬운 레벨이 등장할 확률을 줄일 수도 있습니다.
3. SetActive(true)를 통해 레벨을 활성화 시킵니다.
4. 활성화 시킨 그 레벨이 몇번째 레벨인지 저장하기 위해, Level_Chek에 수를 저장합니다.
간단하게 정리하자면, 랜덤으로 레벨(맵)을 시작하고, 그 레벨이 몇 번째인지 저장한다.
중간에 Level_1.GetComponent<Rigidbody2D>().isKinematic = true;
이것은 맵이 오브젝트와 충돌했을때 밀리지 않도록
운동학적으로 바꿔주는 것입니다.
사실 인스펙터에서 직접 다 바꿔줬는데, 저걸 지우지 않았네요,,
Level_4.transform.Find("Triangle").gameObject.SetActive(true);
Level_4.transform.Find("Triangle_Reverse").gameObject.SetActive(false);
이것은 Level_4는 두개의 자식을 갖고 있는데,
둘다 동시에 활성화가 아닌,
둘 중 하나만 활성화 시키고 나중에 다른 것을 활성화 시키려고 시작할때부터 조정한 것입니다.
이 맵에 특정한 움직임이라고 생각하면 됩니다.

Level_Check를 통해서 각각 얼마동안 움직임을 실행할지 결정합니다.
원래는 레벨(맵)마다 움직이는 시간을 다르게 하려고 했지만,
이상하지 않아서, 다 2초로 했습니다.

Level_Check를 통해서 현재 실행되고 있는 레벨(맵)을 비활성화 시킵니다.
중간에 포지션 이동시킨건 굳이 안해도 됐었는데, 굳이 해버린것이고,
Level_6의 4줄의 코드는 자식들을 다 활성화 시켜주고, 부모를 비활성화 시키는 것입니다.
왜냐면 자식을 다 비활성화 시키는 움직임을 하는 코드가 있기 때문입니다.

Level_Check를 통해서 현재 실행되고 있는 레벨(맵)의 움직임을 실행시킵니다.
사실이건 껍데기에 불과합니다. 함수에서 함수를 실행시키고 있는데,
각 레벨에 맞는 함수를 다 따로 만들었습니다.

레벨1은 아무런 움직임이 없습니다.
레벨2는 포지션벡 y값에 0.01f를 더해주는것입니다.
이렇게 되면 레벨2 오브젝트들은 위로 올라갑니다.
레벨3은 회전시키는 것입니다.
레벨4는 깜빡이처럼 1개 활성 1개 비활성을 반복해주는 것입니다.
레벨 5는 아무런 움직임이 없습니다.
레벨 6은 자식 오브젝트를 차례로 비활성화 시키는 것입니다.
레벨 7은 회전시키는 것입니다.
총 정리를 해보면,
1단계. Start_Level() : 1부터 7까지의 레벨(맵)을 랜덤으로 시작합니다.
2단계. Time_Level() : 시작한 레벨(맵)이 몇 초동안 실행되는지 확인합니다.
3단계. End_Level() : 레벨을 끝냅니다.
4단계. MoveMent_Level() : 레벨의 움직임을 작동시킵니다.
하하하,,힘들다,,

https://play.google.com/store/apps/details?id=com.PaLab.STC