본문 바로가기

유니티 ML Agents/유니티 기초

6. 유니티 객체 회전 및 프리펩 사용

벽과 타겟 객체 만들기


(Cube) 객체 만들기


가장 자리에 공이 빠져 나가지 못하도록 벽을 세워 보자. 벽은 직사각형 객체 4개로 이루어 진다. 벽을 이루는 직사각형 객체는 모두 비슷한 특성을 가지고 있기 때문에 빈 객체(Empty Object)를 생성해서 하나로 묶어주는 것이 관리하기 편리하다. 빈 객체는 transform 컴포넌트로만 이루어진 객체인데 독립적으로 씬에 존재할 수 없는 스크립트나 객체를 모아 놓거나 동일 객체를 하나로 묶어 놓는 부로 객체로 주로 사용된다. Create Object > Create Empty 메뉴를 사용해서 빈 객체를 만들 후 이름을 Wall로 변경하자.


4개 만들기


앞에서 만든 큐브 객체 이름을 East Wall로 변경하고 Transform 컴포넌트의 속성을 화면과 같이 변경하자. 나머지 3개의 벽은 East Wall을 복사해서 만들고 Transform 컴포넌트의 속성을 그림과 같이 각각 변경해 주면 된다. 이때 복사할 때는 duplicate 기능을 사용하는 것이 좋다. 4개의 벽을 모두 만들었을 때 네모 반듯한 벽이 나오지 않으면 Ground 객체의 크기가 2X1X2인지 확인하고 Wall 객체의 속성을 다시 한번 Reset해 보자. 이제 벽이 모두 만들어 졌으면 Play 버튼을 클릭해서 공을 움직였을 때 벽이 공이 바닥에서 떨어지지 않도록 벽이 잘 막고 있는지 확인해보자.


타겟 객체 만들기


게임의 목적인 공을 움직여서 타겟을 수집하는 것이기 때문에 여러 개의 타겟을 만들어야 한다. 타겟의 속성은 모두 비슷하기 때문에 벽을 만들 때와 동일하게 빈 객체를 만들어서 타겟을 자식 객체로 생성한다. 빈 객체를 만들 다음에 인스펙터 뷰에서 반드시 transform 컴포넌트를 초기화해 줘야 한다는 것을 명심하기 바란다.

 

 객체 회전 시키기


객체 꾸미기


먼저 타겟의 크기(Scale) (0.5, 0.5, 0.5)로 변경한 다음 높이(Position Y) 1로 변경한다. 그럼 생성된 큐브의 크기가 줄어들고 바닥에 위로 뜨게 된다. 좀 더 게임에 가까운 모습으로 변경하기 위해 타겟을 회전해 보자. Rotation 값에 (45, 45, 45)를 입력하면 큐브는 45도 정도 기울어진 모습으로 변하게 된다. 그리고 객체의 이름을 Target 으로 변경한다.


객체 회전시키기


타겟을 회전시키기 위해서는 객체의 동작을 제어하는 스크립트를 만들어야 한다. 스크립트 생성은 앞에서 했던 것과 동일하게 하고 이름은 Rotator라고 변경한다. transform 컴포넌트는 객체를 회전시킬 수 있는 Rotate함수를 지원한다. Rotate함수는 1개 또는 2개 인자를 받을 수 있는데 여기에서는 축별 회전율을 나타내는 벡터 1개를 인자로 입력해보자. 일정 속도를 유지하기 위해 축별 회전율 뒤에 Time.deltaTime을 곱한다. Time.deltaTime은 유니티에서 하나의 프레임이 실행되는데 걸리는 시간을 의미한다. 즉 프레임이 빨리 실행되면 값이 작아지고 프레임이 느리게 실행되면 값이 커진다. PC의 성능과 상태에 따라 1초에 실행할 수 있는 프레임의 개수가 달라지고 프레임이 실행될 때마다 불려지는 Update함수의 실행 주기도 불규칙하다. 따라서 주기적으로 실행하는 함수의 경우 Time.deltaTime 값으로 보정해주는 것이 좋다. 이제 Play 버튼을 눌러 Target이 잘 회전하고 있는지 확인해 보자.

 

○ 유니티 프리펩(Prefab)


프리팹 만들기


프리팹(Prefab)은 씬에서 객체를 생성하는 템플릿으로 사용할 수 있는 에셋 타입이다. 동일한 프리팹으로 생성된 객체는 한꺼번에 속성을 변경할 수 있다. 프리팹을 생성하기 위해서는 먼저 프로젝트 뷰에서 폴더를 생성하고 이름을 Prefabs로 변경한 후에 계층 뷰에 있는 객체를 Prefabs 폴더로 드래그 앤 드랍으로 가져오면 된다. 이제 프로젝트 뷰에서 객체를 복사(Duplicate)하면 하나의 프리팹을 사용하여 객체가 생성되기 때문에 나중에 속성을 쉽게 변경할 수 있다. Target 객체의 인스펙터 뷰를 보면 객체 이름 하단에 Prefeb이 생성된 것을 볼 수 있다.


화면 다르게 보기


씬 뷰 우측 상단에 축을 표시하는 아이콘이 있는데 아이콘을 누를 때 마다 화면에 표시되는 축의 방향이 바뀌게 된다. Z 축을 맨 위로 향하게 하면 위에서 화면을 바라보듯이 표현되므로 쉽게 타겟을 복사(Duplicate)해서 배치할 수 있다. 타겟을 선택해서 7개 정도 복사(Duplicate)한 후에 Player를 중심으로 원형으로 배치해 보자.


타겟 여러 개 만들기


씬 뷰 우측 상단에 축을 표시하는 아이콘이 있는데 아이콘을 누를 때 마다 화면에 표시되는 축의 방향이 바뀌게 된다. Z 축을 맨 위로 향하게 하면 위에서 화면을 바라보듯이 표현되므로 쉽게 타겟을 복사(Duplicate)해서 배치할 수 있다. 타겟을 선택해서 10개 정도 복사(Duplicate)한 후에 Player를 중심으로 원형으로 배치해 보자. 계층 뷰, 씬 뷰, 인스펙터 뷰에서 모두 위 그림과 같이 객체가 생성됐는지 확인하고 Play 버튼을 눌러 정상적으로 동작하는지 확인해보자.


타겟 색 바꾸기


타겟을 색깔을 한번에 바꾸기 위에 앞에서 만든 머티리얼을 적용해 보자. 프로젝트 뷰에서 머티리얼 폴더를 선택한 다음 M_target 머티리얼을 선택하고 계층 뷰에 있는 Target에 드래그 앤 드랍으로 올려 놓으면 Target객체의 색깔이 바뀐다. Target 객체의 인스펙터 뷰에 있는 Apply 버튼을 누르면 같은 프리팹이 적용된 다른 모든 Target에도 동일한 색깔이 적용된다. Play 버튼을 눌러 색깔이 잘 변경됐는지 확인해 보자.

반응형