2015년 4월 26일 일요일

유니티 모델 교체(Unity Model Change)

미사일을 예로들면 일단 missile프리팹 오브젝트에 모델이 여러개 들어있다면

int missileMaxLevel = 7;
int mLevel = 2;
미사일 레벨은 2이고 최대 레벨값이 7이라고 가정하자.
그럼 모델도 7개가 있을것이다. 그럼 아래 함수처럼 쓰면된다.

//미사일 레벨별 디자인 변경
    void ChangeAvatar()
    {
        //미사일 최대 레벨값 만큼 반복체크
        for (int i = 0; i < missileMaxLevel; i++)
        {
            //모든 모델 상태를 꺼둔다.
    this.transform.GetChild(i).gameObject.SetActive(false);
        }
           //그리고 레벨에 맞는 모델만 키고 실행. -1 시키는 이유는 배열값은 0부터 시작임.
   this.transform.GetChild(mLevel - 1).gameObject.SetActive(true);
    }

함수 내부 반복문을 보면
this.transform.GetChild(i).gameObject.SetActive(false);
가 있다. 이것은 자기 자신의 하위에 등록된 자식 모델값을 가져와서
Active 상태를 끄겠다는것이다.
이걸 해주지 않으면 모든 미사일 이미지가 중첩되서 다 나온다.
그러니 우선적으로 모든 모델들 상태를 화면에 나타나지 않게 꺼주는 작업이 필요하다.

반복문이 끝나면
this.transform.GetChild(mLevel - 1).gameObject.SetActive(true);
위와 같이 레벨값을 GetChild에 넣어주고 Active 값을 true로 바꿔주면
원하는 모델만 켜진다.

(본인레벨보다 -1 낮게 주는 이유는 배열이 0부터 시작이다. 레벨이 0부터 시작하는 게임이거나 혹은 빈 모델을 넣고 사용하지 않는 경우에는 -1 할 필요는 없다. 다만 그렇게하면 반복문 조건도 수정해야한다.)

참고로 이렇게 말고 태그값이나 모델이름 가져와서 바꾸는 방법도 있는데...
추천하고싶지 않다. 오브젝트 많으면 텍스트이름을 가져와서 바꾸는데 매우 과부하걸린다.

댓글 없음:

댓글 쓰기