안 쓰던 블로그
유니티 C# 코드 정리하기-GetComponentsInChildren 사용 본문
이미지 박스 6개에다가 랜덤으로 이미지를 붙이는 동작을 하는 스크립트
객체가 6개에 이름이 box1Image, box2Image..니까 유니티 뉴비가 딱 보고 짰던 코드
public GameObject box1Image, box2Image, box3Image, box4Image, box5Image, box6Image;
box1Image.GetComponent<BoxManager>().me = 1;
box2Image.GetComponent<BoxManager>().me = 2;
box3Image.GetComponent<BoxManager>().me = 3;
box4Image.GetComponent<BoxManager>().me = 4;
box5Image.GetComponent<BoxManager>().me = 5;
box6Image.GetComponent<BoxManager>().me = 6;
bm = new List<BoxManager>();
bm.Add(box1Image.GetComponent<BoxManager>());
bm.Add(box2Image.GetComponent<BoxManager>());
bm.Add(box3Image.GetComponent<BoxManager>());
bm.Add(box4Image.GetComponent<BoxManager>());
bm.Add(box5Image.GetComponent<BoxManager>());
bm.Add(box6Image.GetComponent<BoxManager>());
GameObject boxImage[]로 묶고 싶지만 각 객체가 이름이 달라서 안 되겠다
그러면 노가다 해야 겠네..
매번 할 순 없으니 리스트를 만들긴 해야 겠네..
근데 리스트에 추가하는 과정도 노가다네..
이런 의식의 흐름으로 했던 것 같음
실제로 이렇게 2.0까지 출시함
근데 문제는 레벨을 나누려고 했을 때부터 생김
쉬운 레벨은 이미지 3개, 지금 있는 6개는 중간 레벨로 넣고 싶어졌는데
똑같은 기능에 이미지 개수만 바뀌는데 저 노가다 때마다
if(nowStage==1) 노가다 3번
else if(nowStage==2) 노가다 6번
이럴 순 없었다
그러면 스크립트도 나누면 되지ㅋㅋ 해서 나온 결과물
특) 더럽다
그리고 씬이 많아져서 머리 아팠다 이걸 누르면 일로 가고 절로 가고
무엇보다 스테이지가 3개였으니까 이짓을 2번 더 해야 되는데 귀찮았고
이후 레벨 하나 더 추가했다간 스크립트 지옥에 빠져서 길을 잃을 게 뻔함
그러던 와중 GetComponentsInChildren가 딱 생각이 나버린 거야
예전에 슈팅 게임 5발 한 번에 쏘는 글을 썼는데 거기서 썼던 방법으로 코드 간소화를 할 수 있을 것 같았다
(참고: https://foxtrotin.tistory.com/120)
1. 나눠져있던 객체를 묶는다
2. 묶은 객체 자체를 가져온다
public GameObject boximage, boxback;
Image[] boxBack, boxImage; //이모티콘이 표시될 오브젝트
boxImage = boximage.GetComponentsInChildren<Image>(); //박스 이미지들
boxBack = boxback.GetComponentsInChildren<Image>(); //박스 뒷배경 이미지들
3. 뜯어서 하나씩 할 걸 한다
for (int i = 0; i < boxImage.Length; i++) //일단 다 끈다
{
boxImage[i].gameObject.SetActive(false);
boxBack[i].gameObject.SetActive(false);
}
for (int i = 0; i < difficulty; i++) //난이도 별로 박스 활성화, 정답 넣기
{
boxBack[i].gameObject.SetActive(true);
boxImage[i].gameObject.SetActive(true);
boxBack[i].transform.localPosition = new Vector3(mixposition[i, 0], mixposition[i, 1], mixposition[i, 2]);
boxImage[i].transform.localPosition = new Vector3(mixposition[i, 0], mixposition[i, 1], mixposition[i, 2]);
boxImage[i].gameObject.GetComponent<BoxManager>().me = difficulty + 1;
bm.Add(boxImage[i].gameObject.GetComponent<BoxManager>());
}
다 껐던 이유는 다 꺼놓고 키기만 하고 싶었는데 꺼져있으면 안 불러와졌음
(참고: https://foxtrotin.tistory.com/145)
아무튼 필요한 부분만 키고, 이동시키는 식으로
아까 그 더러운 노가다를 나름 이쁘게 바꿔봄
물론 현재 레벨 따라 바뀌어야 되는 값들은 아래처럼 되어있긴 하지만
나중에 레벨을 더 추가할 일이 생긴다면 함수를 만들던가 해서 다 묶어버릴 수 있을 것 같음
지금은 2개밖에 없으니까 이게 더 짧을 듯
if (nowLevel == 1)
{
difficulty = 3;
stageLock = "stage2level1Reached";
mixposition = mixposition_1;
}
else if (nowLevel == 2)
{
difficulty = 6;
stageLock = "stage2level1Reached";
mixposition = mixposition_2;
}
버전 업데이트까지 해본 게임은 처음이라서 미래를 생각하지 않고 일단 짜고 맨날 뜯어 고치고 있는데
나중에 딴 겜 만들게 된다면 이후 기능 업데이트에 용이하게 처음부터 구조를 이쁘게 짜야겠음;;
'유니티 > 개발' 카테고리의 다른 글
유니티 SetActive(false) 되어있는 오브젝트 찾기 (0) | 2020.10.04 |
---|---|
유니티 UI 클릭할 때 사이즈 확대, 축소, 중앙 이동(UI 오브젝트의 크기 변경, RectTransform) (0) | 2020.09.20 |
유니티 GetComponentsInChildren이 안 될 때 해결 방법(길이가 0이라고 뜰 때) (4) | 2020.04.13 |
c# 배열 여러 개를 하나로 합치는 아름다운 방법(c# combine multiple arrays to one) (1) | 2020.03.27 |
유니티에서 logcat 로그 보기(유니티에서 디버깅하기) (0) | 2020.03.25 |