Game Engine/Unity

No.5 Unity 3D Platform Tutorial "Setting the Scenes"

VFX-KARA 2010. 8. 9. 18:45
 



씬 세팅하기

우리의 영웅이 움직일 수 있는 상태에서, 다음 우리가 해야 할 것은 그에게 할 일을 주는 것입니다...


첫 걸음


본 섹션에서 우리는 게임 안의 모든 행동이 일어나는 게임 세계 구축에 대해 알아볼 것입니다. 영화 용어로, 이는 '세트를 만든다'라고 하며 소품을 설치하고 스크립트를 작성하여 우리의 영웅이 이들과 상호작용을 할 수 있도록 함을 뜻합니다.

우리가 행해야 할 첫걸음은 씬을 준비하는 것입니다. 본 튜토리얼 파일은 이미 기본적인 레벨 메쉬가 설정되어 있으며 여러 개의 아이템이 존재하고 있습니다. 우리는 약간은 소품과 여러 요소들을 더 추가할 예정에 있지만, 이 모든 소품을 설치하는 것은 매우 길고 지루한 튜토리얼이 될 가능성이 다분하기 때문에 대부분은 이미 사용자를 위해 설치되어있음을 알려드립니다.

---------------------------

조명

본 튜토리얼의 레벨은 이미 은은한 조명과 수많은 포인트라이트들과 함께 제공되고 있습니다. 이들은 배경,플레이어, 적 그리고 제한적으로 아이템에 조명을 비춥니다.

본 프로젝트에서는, 조명들은 레벨을 모델링한 아티스트에 의해 설치되었습니다. 조명작업은 장소의 분위기와 느낌을 만들어내는데 있어서 매우 중요한 역할이기 때문에 이 부분은 레벨을 만든 모델러에게 맡기는 것이 좋습니다.


-------------------------------------------------

소품 배치

기본 세트는 몇 가지의 소품이 이미 배치된 상태에서 사용자에게 제공됩니다.

-------------------------------------------------

자신만의 레벨 만들기

본 튜토리얼의 레벨은 Maya에서의 배경 구성요소를 정렬한 후 유니티에 가져오는 작업을 통해
만들어졌습니다. 만약 실험하기 또는 추가 레벨을 만드는 것을 좋아한다면, Project Pane에서의
Build Your Own! 폴더에서 각각의 배경 요소들을 찾을 이용해 볼 수도 있습니다.

-------------------------------------------------

본 게임엔 수많은 연료통 소품이 있으며 이들을 다 배치하는 것은 튜토리얼을 매우 지루하게 할 수 있습니다. 만약 이전의 튜토리얼들을 읽어 보았다면, 이들을 배치하는 방법을 이미 알고 있을 것이기 때문에 소품중의 체력 아이템, 점프 패드, 그리고 리스폰 지점 등의 배치를 제한할 것입니다.

체력 아이템

먼저 우리는 간단한 일부터 시작할 것이며 이는 습득 가능한 체력 아이템을 추가하는 것입니다. 이 아이템들은 빛을 내는 동시에 회전하는 하트로서 플레이어의 체력을 보충해주는 역할을 합니다. 아이템들은 이미 Project Pane에서 Prefab으로서 정의되어 있으며 Props 폴더안에 HealthLife-PickUpPrefab 객체가 준비되어있습니다.


체력 아이템 배치하기

ㅁ 체력아이템 Prefab하나를 Scene View에 드래그하고 유니티의 위치 도구를 이용해 레벨어딘가에 위치시키도록 합니다.

ㅁ 맵 전반에 걸쳐 아이템이 6개가 배치될 때까지 이 과정을 반복합니다.

물론 아이템이 너무 쉽게 찾아지거나 얻을 수 있어선 안 되겠지만 이들이 어디에 배치되는지는 전적으로 사용자에게 달려있습니다. 플레이어가 레벨을 어떻게 플레이 할지 고려하고 아이템들을 놓을 최상의 자리를 결정하십시오. 아이템을 배치하는데 있어서 너무 자비롭게 하여 게임을 쉽게 만들지 않도록 합니다.

마지막으로 우리는 이 아이템들을 어떠한 형태의 폴더 안에 그룹지어 Hierarchy Pane을 어수선하게 하지 않도록 해야 합니다. 이는 GameObject->Create Empty 메뉴를 이용, 빈 게임 객체를 생성하여 해결할 수 있습니다. 이 빈 객체를 Health Pickups라 이름 짓고 아래에 보인 것처럼 체력 아이템을 그룹 짓는 데에 사용하십시오:


체력 아이템의 계층


포스 필드


포스 필드

현재 시점에서는 우리 영웅의 우주선을 가두고 있는 포스 필드가 작동하지 않으며 포스 필드는 그저 고정된 메시 텍스쳐일 뿐입니다. 그렇기 때문에, 결과물은 시각적으로 기대에 미치지 못합니다.

꽤 괜찮은 시각적 효과를 내는 여러 가지 방법이 있지만, 우리는 어떠한 방법을 채택해야 할까요? 종종 우리는 간단한 해법이 최고임을 알고 있습니다: 우리는 텍스쳐의 UV 좌표를 애니메이션화 하여 포스필드에 물결이 이는 효과를 줄 것입니다.

이 애니메이션은 Project Pane의 scripts->Misc 폴더에서 찾을 수 있는 짧은 스크립트를 이용하여 구현될 것입니다. 이 스크립트는 FenceTextureOffset이라 불리며 아래와 같은 내용을 포함하고 있습니다:

===================================================================================================================

var scrollSpeed = 0.25;

function FixedUpdate()
{
   var offset = Time.time * scrollSpeed;
   renderer.material.mainTextureOffset = Vector2 (offset,offset);
}

===================================================================================================================

코드의 첫 줄은 유니티 인터페이스에서 직접 수정할 수 있는 속성인 Scroll Speed를 보여주고 있습니다. FixedUpdate()함수는 유니티에 의해 초당 여러 번 호출됩니다. 우리는 짧은 공식을 사용하여 ScrollSpeed의 값을 현재 시간과 곱하여 텍스쳐의 오프셋(Offset)을 정의할 것입니다.

-------------------------------------------------

보기 좋은 속성

유니티의 Inspector창이 속성과 변소를 표시할 때, 그들의 이름은 보기 좋게 수정됩니다. 보통, 이는 이름의 대문자를 찾아내어 각각의 자리 앞에 스페이스를 넣는 것을 의미합니다. 추가적으로 유니티는 이름의 첫 글자를 대문자로 변환시킵니다. 그러므로 scrollSpeed는 Scroll Speed로 표시됩니다.

-------------------------------------------------


텍스쳐가 렌더링 되었을 때, 텍스쳐 자체는 그냥 이미지에 불과 합니다. 물체의 mainTextureOffset 속성은 유니티에게 UV 스페이스 내에서 텍스쳐의 이미지 오프셋을 그릴 것임을 알려줍니다. 이는 복잡한 애니메이션 시퀀스에 의존하지 않고 매우 효과적인 결과물을 만들어내는 데에 사용될 수 있습니다.

levelGeometry 게임객체를 확장하여 여러 다른 레벨 데이터 요소를 화면에 보이게 하십시오. 우리는 impoundFence 객체를 애니메이션화해야 하기 때문에,fenceTextureOffset 스크립트를 이곳에 드래그 해 놓습니다.


수집 가능한 아이템 스크립팅

현재 까지 럽츠는 레벨의 어떠한 아이템도 수집할 수 없습니다. 이는 유니티가 우리의 영웅에게 그렇게 하도록 말하지 않았기 때문입니다. 이를 구현하기 위해서는 우리는 두 가지의 요소를 각 아이템에 추가해야 합니다:

• 컬라이더 구성요소와,

• 컬라이더와 플레이어 체력의 업데이트 등을 다루는 스크립트 코드.

Hierarchy Pane의 아이템들은 모두 Prefab 인스턴스로서, 파란색으로 표시되어있습니다. 원본 Prefab을 수정함으로서 우리는 게임내의 모든 아이템을 자동으로 업데이트할 수 있습니다.

우리의 영웅이 수집할 수 있는 Prefab은 FuelCellPrefab과 HealthPickUpPrefab, 이 두개입니다. 이들은 Project Pane의 Props 폴더에서 찾을 수 있습니다.

ㅁ 가장 상위의 HealthPickUpPrefab 객체를 선택합니다.

ㅁ Component->Physics->Add Sphere Collider 메뉴를 사용하여 구체 컬라이더를 Prefab에 추가 시키십시오. 이리하면 Inspector창에 나타나는 구체 컬라이더를 볼 수 있습니다.

ㅁ 마지막으로 Is Trigger 체크박스에 체크표시를 하십시오.


Inspector 창에 나타난 HealthPickUpPrefab.

☆ 참고

ObjectRotator 스크립트는 이미 Prefab에 첨부가 되어있습니다. 이 스크립트는 매우 간단하며 아이템을 제자리에서 회전하게 합니다. 우리는 차후 챕터에서 스크립트화 된 애니메이션의 좀 더 복잡한 예제를 다룰 것입니다.

컬라이더들은 두 가지의 용도가 있습니다: 우리는 어떤 다른 물체로 이들과 충돌하게 할 수도 있고, 또는 이들을 트리거(Trigger)로 사용할 수 있습니다.

-------------------------------------------------

트리거

트리거(Trigger: 작동시키다)는 보이지 않는 구성요소로서, 이름의 뜻이 의미하듯이 이벤트를 작동시킵니다. 유니티에서 트리거는 Is Trigger 속성이 설정된 간단한 컬라이더입니다. 이는 어떤 것이 트리거와 충돌하면 , 물리적인 독립체이기보단 가상의 스위치처럼 작동함을 의미합니다.

트리거는 무언가에 의해 작동되었을 때 아래 세 개의 이벤트 메시지중 하나를 전송할 것입니다: On-TriggerEnter(), OnTriggerStay() and OnTriggerExit().


-------------------------------------------------

트리거 이벤트 메시지는 트리거 객체에 첨부된 모든 스크립트에 전송되어지기 때문에 지금 우리는 health Prefab에 적절한 스크립트를 추가해야합니다.

ㅁ Components 메뉴로 가서 Third Person Props 하위 메뉴에서 Pickup 스크립트를 선택하십시오. 이렇게 함으로서 우리의 Prefab에 Pickup 스크립트를 추가할 수 있습니다.

ㅁ Inspector 창의 위의 이미지에서 보인 것처럼 Pickup Type 속성을 Health로 설정합니다.

ㅁ 마지막으로 Amount 속성 값을 3 정도로 설정합니다. 이 값은 아이템이 플레이어에게 부여하는 체력의 값입니다.


-------------------------------------------------

체력의 양?

헤드 업 디스플레이, 또는 'HUD'는 플레이어의 현재 체력, 목숨, 등을 보여주는 디스플레이는 최대 여섯단계의 체력을 다룰 수 있습니다. 만약 플레이어의 체력 바가 이미 차있는 상태에서 체력 아이템을 수집하면 어떻게 될까요? 이는 취향의 따라 다르겠지만, 본 게임에서는 목숨의 추가를 트리거 하도록 만들었습니다. 이러한 논리는 플레이어의 상태를 체크하는 스크립트인 ThirdPersonStatus 스크립트에서 찾아볼 수 있습니다.

-------------------------------------------------


연료통 아이템 또한 동일한 방법으로 설정되었으나 두 가지 다른 점이 있습니다:

• Pickup Type 설정은 FuelCell 이어야하며,

• Amount 값은 연료통 아이템의 개수를 의미합니다. (1이 적절한 값이라고 생각됩니다.)


점프 패드


점프 패드

레벨 내에 밝은 노란색과 검은색 줄무늬 모양의 장소가 바로 점프 패드입니다. 이 점프 패드들은 럽츠를 공중위로 쏘아 올리는 기능을 합니다. 우리는 스크립트가 포함된 컬라이더를 이용하여 이 기능을 구현할 것입니다.

먼저, 빈 게임객체를 생성하고 Jump Pad Trigger라고 이름 짓습니다. 우리는 이 객체를 점프패드 트리거 객체들을 한데 모으는 폴더로 사용할 것입니다.

이제 Prefab을 만들어 봅시다:

ㅁ 새로운 빈 게임객체를 생성합니다.

ㅁ 이름을 JumpPad Trigger 1로 수정합니다.

ㅁ 박스 컬라이더(Box Collider) 객체를 추가합니다. (구체 컬라이더(Sphere Collider)도 이론적으로는 가능하지만, 박스 컬라이더가 점프 패드의 모양을 생각할 때 더 적합합니다.)

ㅁ 컬라이더를 트리거로 설정합니다. (Is Trigger 속성 체크)

ㅁ JumpPad 스크립트를 추가합니다.

이제 객체가 생성되었습니다. 이제 이것을 Prefab으로 바꾸어야합니다:

ㅁ Project Pane위의 있는 Create 메뉴에서 Prefab을 선택합니다.

ㅁ 우리가 만든 점프 패드 게임 객체를 새로운 Prefab에 드래그 드롭 합니다.

ㅁ Prefab을 JumpPad Trigger로 이름 바꿉니다.

ㅁ 원본 게임객체를 Hierarchy Pane으로부터 삭제합니다.

ㅁ JumpPad Prefab을 부대로 옮기고 점프패드가 위치한 지점들 중 하나 안에 설치합니다.
   (점프 패드는 총 여섯 개가 있습니다. 4 Split View를 이용하면 설치하는 데에 도움이 될 것입니다.

ㅁ 점프 패드의 Jump Height (점프 높이) 기본 값은 5로, 이는 럽츠를 정원이 있는 높이로 쏘아 올리기 충분하지 않습니다. 본 튜토리얼에서는 15에서 30까지의 값을 추천합니다. (완성된 프로젝트 샘플에서는 30을 사용합니다. (역자: 역자는 15가 적절하다고 생각됩니다. 30은 쏘아 올리는 높이만큼 솟아오르는 속도가 빨라 카메라가 따라잡지를 못합니다.)

ㅁ 마지막으로 플레이 버튼을 눌러 게임 내 새로운 트리거들이 잘 작동하는지 테스트합니다.


☆ 참고


스크립트는 Prefab과 유사하게 작동합니다: 우리는 방금 Props 폴더에 Pickup 스크립트로의 링크를 추가함으로서 우리의 Prefab에 또한 링크를 추가하였습니다. Project Pane에 있는 Prefab을 수정하는 것은 무대 위에 Prefab의 사본들에게도 영향을 줄 것입니다.

작업의 흐름을 부드럽고 방해 없이 진행하기 위해서는 좋은 구성이 매우 중요합니다.

• 인스턴스화 된 Prefab을 가능한 사용하십시오.

• 객체의 종류보단 기능으로 정리하십시오.

• 빈 게임객체를 컨테이너처럼 사용하십시오.

작은 크기의 프로젝트에서는 얼마나 많은 자산이 필요한지 알게 되면 매우 놀랄 것입니다.

본 튜토리얼 번역서는 (주)지피엠스튜디오가 운영하는 "유니티코리아" 회원님들을 위한 메뉴얼 번역 자료 입니다.
본 자료를 다른 곳에 개제 하실 때에는 아래의 번역과 출처를 명확히 밝혀 주시기 바랍니다.
본 자료는 제3자가 상업적인 용도로 사용 할 수 없음을 밝힙니다.

번역 :
유니티코리아 [U3K]게임인생
출처 : 유니티코리아(www.unity3dkorea.com)

이제 튜토리얼의 두번째 챕터인 씬 세팅하기는 짧아서 여기 까지 입니다. 다음 회차에는 세번째 챕터인 The GUI 에서 찾아 뵙겠습니다.겠습니다.