본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티 구현 정리_Implement Summary

유니티 각개격파_020_SetActive와 Destroy 메서드

GameObject(게임오브젝트)

 

유니티에서 게임오브젝트는 Scene(씬) 화면에 만들 수 있는 가장 기본이 되고, 바탕이 되는 Object(객체, 개체)이며 독립체이다.

 

Hierarchy(하이어라키; 계층구조)창에서 +버튼을 클릭하면 게임오브젝트를 만들 수 있다.

또는 빈 곳에서 마우스 오른쪽 버튼을 클릭해도 된다.

GameObject라는 기본(Default , 디폴트) 이름을 가진다.

마우스로 한번 클릭해서 이름을 바꿀 수 있다.

 

Inspector(인스펙터, 조사관, 검사관) 창에는 디폴트로 Transform 이라는 Component(컴퍼넌트, 구성요소, 부품) 하나만 가지고 있다.

Position(위치)의 각 축 값은 임의로 정해진다.

 

오른쪽 삼점 아이콘을 클릭한 후 Reset(리셋) 하면 위치를 (0, 0, 0)으로 세팅할 수 있다.

Rotation(회전), Scale(크기)도 함께 처음 설정된 값으로 초기화된다. 

 

 

게임오브젝트를 만들어도 Scene창과 Game창에는 아무것도 보이지 않는다.

게임오브젝트에 위치, 회전, 크기만 담당하는 Transform 컴퍼넌트만 장착하고 있기 때문이다.

 

화면에 보이게 하려면 보여주는 기능을 하는 Sprite Renderer라는 컴퍼넌트를 붙여야 한다.

 

게임오브젝트에 컴퍼넌트(부품)를 붙이려면 Inspector창 아래 Add Component 버튼을 클릭한 후 검색창에 spr만 입력하면 관련 컴퍼넌트 목록이 나타난다. 

 

Sprite Renderer 컴퍼넌트가 게임오브젝트에 장착되었다.

Sprite(스프라이트)는 간단하게 말하면 2D 에서 사용하는 이미지를 나타낸다.

현재 None(없음)이므로 아직 아무것도 보이지 않는 상태다.

기본으로 준비되어 있는 이미지를 넣어보자.

 

 

오른쪽 끝에 동그라미 아이콘을 클릭한 후 Knob(손잡이, 옹이)를 클릭하면 이제 화면에서 볼 수 있다.

만약 넣고 싶은 이미지가 있다면 Project창의 Assets폴더에 이미지를 Import(불러오기)로 등록하면 선택할 수 있다.

현재 Scene창에서는 카메라 아이콘에 의해 가려서 보이지 않는다.

 

Main Camera(메인카메라)를 선택한 후 Inspector창에서 체크 해제하면 Scene창에서 동그라미를 볼 수 있다.

이 경우에는 카메라가 꺼져있기 때문에 Game창에서는 동그라미가 나타나지 않을 것이다.

 

 

스크립트 만들기

GameObject(게임오브젝트)에 연결할 스크립트 파일을 만들자.

 

1. GameObject를 선택한 후 Inspector탭 아래 Add Component 버튼 클릭

2. 제일 아래 New script(새 스크립트) 클릭

3. 이름은 Knob

 

스크립트 파일이 Assets폴더에 만들어진다.

스크립트 파일을 모아놓을 Scripts 폴더를 만들어서 이동시킨다.

 

게임오브젝트의 Inspector탭에는 위와 같이 되어 있을 것이다.

 

Knob 스크립트 파일을 편집하기 위해 오른쪽 세점 옵션 아이콘 클릭 후 Edit Script를 선택한다.

또 다른 방법은 Scripts폴더에 있는 Knob파일을 더블클릭해도 된다.

 

SetActive( ) 메서드

 

Start 메서드 안에 9번줄을 입력한다.

gameObject는 Knob.cs 스크립트가 연결되어 있는 게임오브젝트를 가리킨다.

SetActive 메서드는 매개변수로 bool 타입의 값을 사용한다.

그러므로 true(참) 또는 false(거짓) 를 사용할 수 있다.

 

위 코드는 게임오브젝트의 SetActive 메서드에 fasle값을 전달하라는 코드이다.

스크립트가 실행하면 Update메서드가 실행되기 전에 먼저 실행되는 Start메서드에서 9번줄 코드를 실행할 것이다.

Ctrl+S 를 눌러서 스크립트를 저장하고 유니티로 돌아가서 실행해보자.

 

Destroy( ) 메서드

 

코드로 돌아와서 위와 같이 코드를 바꿔본다.

Destroy(파괴하다)메서드는 개체를 파괴할 때 사용할 수 있다.

이 메서드는 매개변수를 2개 전달할 수 있다. 

첫번째는 게임오브젝트 또는 컴퍼넌트, 두번째는 파괴하기 전에 기다리는 시간을 float값으로 정할 수 있다.

 

위 코드는 이 스크립트와 연결된 게임오브젝트를 3초 기다린 후 파괴한다.

만약 Destroy(gameObject); 처럼 지연 시간을 넣지 않으면 즉시 파괴된다.

Ctrl+S 를 눌러서 스크립트를 저장하고 유니티로 돌아가서 실행해보자.

 

위와 같이 SetActive() 메서드는 어떤 개체를 활성 또는 비활성 상태로 만들 때 사용하고,

Destroy()메서드는 어떤 개체를 파괴(삭제)할 때 사용한다.

 

게임을 만들 때는 메서드 사용법 그대로 쉽게 사용하기 어려운 경우가 있다.

 

예를 들면 어떤 게임오브젝트에 컴퍼넌트가 연결되어 있을 때 Destroy메서드로 게임오브젝트를 파괴하면 MissingReferenceException(참조 사라짐 예외) 같은 에러를 만날 수 있다.

즉, 게임오브젝트를 삭제해서 그 안에 연결되어 있던 컴퍼넌트를 더 이상 참조할 수 없게 되었다는 에러 메시지다.

이런 경우에는 Destroy() 대신 SetActive(false)를 사용해서 비활성 상태로 만들면 된다.

 

결국 개체를 재활용하는 경우에는 SetActive() , 완전히 파괴할 경우에는 Destroy()를 사용하면 된다.

 

끝.

Wraven...