안 쓰던 블로그

유니티 C# 코드 정리하기-GetComponentsInChildren 사용 본문

유니티/개발

유니티 C# 코드 정리하기-GetComponentsInChildren 사용

proqk 2020. 4. 14. 00:11
반응형

 

 

이미지 박스 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)

 

unity 슈팅게임 총알 5개 한 번에 쏘는 방법(GetComponentsInChildren)

슈팅 게임에서 총을 한 번에 하나만 쏘진 않음 다른 방향으로 한 번에 다섯개를 쏘게 하고 싶을 땐 어떻게 해야 할까? 이런 모습으로 총알이 나갔으면 좋겠다 1. 총알 준비 파란 캡슐 모양 총알을 준비했다 usin..

foxtrotin.tistory.com

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)

 

유니티 GetComponentsInChildren이 안 될 때 해결 방법(길이가 0이라고 뜰 때)

Text[] boxText = boxtext.GetComponentsInChildren(); print(boxText.Length); Length가 0으로 나와서 빈 배열을 참고했다는 에러가 나올 때 해결 방법 일단 부모-자식 관계가 제대로 되어 있는지부터 확인..

foxtrotin.tistory.com

 

아무튼 필요한 부분만 키고, 이동시키는 식으로

아까 그 더러운 노가다를 나름 이쁘게 바꿔봄

 

 

물론 현재 레벨 따라 바뀌어야 되는 값들은 아래처럼 되어있긴 하지만

나중에 레벨을 더 추가할 일이 생긴다면 함수를 만들던가 해서 다 묶어버릴 수 있을 것 같음

지금은 2개밖에 없으니까 이게 더 짧을 듯

if (nowLevel == 1)
{
	difficulty = 3;
	stageLock = "stage2level1Reached";
	mixposition = mixposition_1;
}
else if (nowLevel == 2)
{
	difficulty = 6;
	stageLock = "stage2level1Reached";
	mixposition = mixposition_2;
}

 

버전 업데이트까지 해본 게임은 처음이라서 미래를 생각하지 않고 일단 짜고 맨날 뜯어 고치고 있는데

나중에 딴 겜 만들게 된다면 이후 기능 업데이트에 용이하게 처음부터 구조를 이쁘게 짜야겠음;;

 

반응형
Comments