제트 팩
럽츠의 제트 팩이 작동하고 있습니다.
현재 시점에선 우리의 캐릭터는 달리고 점프하며 날뛰고 있지만, 캐릭터의 제트 팩은 아직 작동하지 않고 있습니다. 제트팩은 럽츠의 낙하 속도를 감소시키기 위해 사용됩니다. 이 속도가 감속되는 동작은 이미 사용 중이지만, 제트 팩의 제트가 전혀 애니메이션화 돼 있지 않습니다. 제트가 작동하도록 하기위해 우리는 ParticleSystem(파티클 시스템) 과 Point Light(포인트라이트: 트), 이 두 개의 구성요소를 추가 시킬 필요가 있습니다. 파티클 시스템은 화염 같은 효과를 만들어 낼 것이며, 포인트라이트는 화염이 빛을 내는 것 같은 효과를 낼것입니다.
★ 팁
이론적으로는 각각 제트 분사기에 광원효과를 내기위해 두개의 포인트라이트를 필요로 하겠지만, 제트 분사기가 충분히 가깝기 때문에 하나의 포인트라이트로도 충분합니다. 조명효과는 컴퓨터에게 큰 부담을 주기 때문에, 이러한 조치는 유용한 최적화 방법 중 하나입니다.
-----------------------------------------------
파티클 시스템이란?
파티클 시스템은 주로 평평한 2D 빌보드(billboard) 또는 스프라이트(sprite)와 같은 수많은 파티클을 3D 세계로 배출합니다. 각 파티클은 설정된 속력과 속도로 배출되며 특정 시간동안 존재합니다. 사용된 설정과 빌보드 물체에 따라 이 파티클 시스템은 불, 연기, 폭발, 은하수 등 무엇이든지 만들어 내는데 사용될 수 있습니다.
-----------------------------------------------
파티클 시스템 추가하기
ㅁ GameObject 메뉴를 이용하여 Hierarchy Pane에 빈 GameObject를 생성하십시오.
ㅁ 이 GameObject의 이름을 "Jet"로 바꾸십시오.
이 새로운 GameObject를 선택한 상태에서 아래의 항목들을 추가하십시오:
ㅁ An Ellipsoid Particle Emitter
ㅁ A Particle Animator
ㅁ A World Particle Collider
ㅁ A Particle Renderer
ㅁ Particle Renderer 구성요소의 Inspector 창에서 "Enabled" 체크 박스를 푸십시오.
이렇게 함으로써 Particle Renderer를 임시로 사용불가하게 할 수 있습니다.
ㅁ Jet GameObject를 럽츠의 우측 제트 분사기 바로 밑에 위치시킵니다.
ㅁ Particle Render를 다시 사용가능으로 바꿉니다.
ㅁ Ellipsoid Particle Emitter의 설정의 아래와 같이 수정합니다:
Ellipsoid Particle Emitter의 설정.
이 설정으로 하여금 제트의 화염을 구성할때 사용할 좁은 줄기의 파티클을 만들 수 있습니다.
★ 팁
만약 파티클이 수직으로 하강하지 않는다면, 유니티의 회전 도구(Rotation tool)를 이용하여 제트가 제트 팩의 분사기와 수직으로 움직일 때까지 객체를 수정하십시오.
이 작업이 끝나면, 파티클 시스템은 Player GameObject의 하위 객체인 "torso"에 첨부될 것입니다. 이러함으로서 제트가 플레이어의 움직임을 따라가도록 할 수 있습니다. 그러나 현재 시점에선, 우리는 제트가 올바르 게 보이도록 하는데 초점을 둘 것이기 때문에 정확한 위치지정에는 너무 신경을 쓰지 않으셔도 됩니다.
설정의 Min Size와 Max Size는 파티클의 크기 범위를 설정합니다. Min Energy 와 Max Energy설정은 파티클의 최소와 최대 수명을 설정합니다. 우리의 파티클은 사라지기 전까지 짧은 시간(본 프로젝트에서는 0.2초)동안만 존재할 것입니다.
우리는 배출되는 파티클의 양(Quantity)을 50으로 지정할 것입니다. Min Emission 과 MaxEmission 범위는 얼마나 많은 파티클들이 스크린 상에 한 번에 표시되길 원하는지, 또 이 배출의 양을 얼마나 다양하게 할 것인지를 정의할 수 있습니다. 우리는 최소와 최대 범위를 서로 비슷하게 정의하여 제트가 털털거리는 것처럼 보이기보다 부드럽게 발사될 수 있도록 하였고, 결과적으로는 부드러운 파티클의 흐름을 만들어 낼 것입니다.
☆ 참고
우리는 여기서 "Simulate in Worldspace"를 사용하지 않도록 하였습니다. 이렇게 함으로서 파티클이 그다지 빠르게 움직이지 않음에도 불구하고 느리게 발사되는 화염보다 뜨겁고 붉게 분사되는 제트의 느낌을 줄 수 있습니다. 제트가 럽츠의 비틀기와 회전을 무시하게 함으로서, 제트에서 나오는 화염은 좀 더 뜨겁고 고정된 화염과 비슷하게 보이게 됩니다.
ㅁ 이제 Particle Animator 구성요소의 설정을 아래와 같이 설정하십시오:
Particle Animator의 설정. 표에 표시된 값들은 Color Animation의 입력 값을 의미합니다. 다른 설정들도 수정하는
것을 잊지 마십시오!
Particle Animator는 시간이 지남에 따라 파티클 컬러를 애니메이션화 할 것입니다. 파티클들은 우리의 가상 제트가 식어감에 따라 하얀색에서 시작해서 노란색 그리고 주황색으로 어두워질 것입니다. 우리는 텍스쳐 를 각각의 파티클에 렌더링할 것이고, Particle Animator로 하여금 이 파티클에 색깔을 넣도록 할 것이기 때문에, 색상 애니메이션은 매우 미묘하지만 효과적인 애니메이션을 기대할 수 있습니다.
사용자가 컬러를 클릭했을 때 나타나는 컬러픽커 다이얼로그 또한 "Opacity(불투명도)" 슬라이더를 제공합니다. 표에 표시된 컬러설정 또한 이를 포함하고 있으며 애니메이션 사이클 중에 불투명도를 줄여가게 함으로서 "화염" 파티클들이 식어감에 따라 사라지는 것처럼 보이게 될 것입니다.
☆ 참고
불투명도 설정은 파티클의 알파 채널을 수정하여 투명의 정도를 정의합니다. 우리가 사용하고 있는 파티클 물체는 이미 알파 채널 정보를 포함하고 있으며, 이는 추가적으로 불투명도 설정을 통해 수정하게 됩니다.
다음은 Particle Renderer를 알아볼 차례입니다. 이 구성요소는 각각의 파티클을 그려내므로, 파티클들이 어떻게 나타날게 될지에 대한 정보를 받을 필요가 있습니다. 또한 Particle Renderer는 각 파티클을 렌더링하기위해 사용되는 물체를 정의합니다. 우리는 제트에서 나오는 화염같은 효과를 원하므로, "fire add" 물체를 이용해야 할 것이며 이는 Particles->Sources->
Materials->fire add에서 찾을 수 있습니다.
★ 팁
이 자산 또한 Standard Assets 폴더에 포함되어있습니다.
ㅁ 이 구성요소의 값은 아래와 같이 설정하십시오:
Particle Renderer 설정.
"Stretch Particles" 설정은 유니티에게 파티클들이 높은 속력으로 움직이고 있을 시에 스트레치 렌더링 돼야 하는지를 알려줍니다. 우리는 파티클들이 그들의 속도에 따라 약간 늘려지키를 원합니다. 이는 미묘한 시각적 신호를 덧붙이게 되어 우리 제트에 사용하는 작고 원형 모양을 서로 좀 더 혼합될 수 있도록 만듭니다.
☆ 참고
Cast Shadows 와 Receive Shadows 설정은 사용자지정 쉐이더를 사용하지 않는 한 아무런 영향을 주지 않습니다. 이 부분은 본 튜토리얼이 다루는 분야를 벗어나는 고급주제입니다.
조명 추가하기
우리가 만들어낸 제트는 꽤 멋집니다만, 정말 말 그대로 효과일 뿐입니다: 파티클 시스템은 그저 많은 양의 작은 이미지를 쏟아내고 있지만 결과물로서 나오는 작은 화염 같은 효과는 빛을 내지 않습니다. 이 효과을 마무리하기위해서는 우리는 독립된 Point Light 게임 객체를 만들어야합니다. 우리는 이 객체를 제트와 같은 시간에 켜고 끌 것입니다. 이렇게 함으로서 제트에서 나오는 화염이 주위 근방을 즉시 밝혀주도록 할 것입니다. (우리는 제트 하나당 조명하나 보다는 단일 조명을 사용하여 우리가 사용하는 효과를 관리할 때 사용되는 처리 능력을 아낄 수 있습니다.)
ㅁ 새로운 Point Light 게임 객체를 생성하십시오.
ㅁ 이 새로운 객체를 "Jet Light"라 이름 붙이고 럽츠의 2개의 제트 모델 사이에 위치시키십시오. (제트 파티클 시스템에 대해서는 곧 설명하도록 하겠습니다.) 이 조명이 제트가 빛을 내는 것 같은 효과를 줄 것입니다.
우리가 이 효과를 내기 위해서는 고강도의 밝은 포인트라이트가 필요합니다.
ㅁ Jet Light 객체를 선택하고 설정을 아래와 같이 수정하십시오:
제트 팩의 조명 설정
-----------------------------------------------
그림자는 왜 없을까?
그림자는 모든 컴퓨터 하드웨어에 큰 부담을 줍니다. 때문에 우리가 그림자를 쓰지 않아도 되는 여건이 된다면 이를 계산에 넣지 않는 것이 좋으며, 그러므로 우리가 그냥 무시하고 넘어갈 수 있는 부분입니다. 제트 자체가 별로 크지 않기 때문에 럽츠의 등을 비춰주기만 하면 됩니다. 포인트라이트는 또한 근처 배경에 반사될 것이지만, 그다지 밝진 않아서 그림자의 부재를 눈치 챌 수 없을 것입니다.
-----------------------------------------------
다음 단계는 우리의 제트와 조명 객체를 포함하기 위해 Player 게임 객체를 업데이트 하는 것입니다. 이를 하기 위해선 먼저 우리의 제트를 조립품(Prefab)으로서 프로젝트 창(Project Pane)에 추가하는 것입니다:
ㅁ Project Pane에서 (빈) Player 폴더를 선택한 상태에서 Create...를 클릭하십시오.
ㅁ 드롭다운 메뉴에서 Prefab을 선택하십시오. 이렇게 함으로서 빈 Prefab 객체가 폴더 안에 만들어 질것입니다.
ㅁ Prefab의 이름을 Jet으로 명명합니다.
ㅁ 우리의 새 Jet 객체를 Hierarchy Pane에서 우리의 새 Prefab에 드래그 해 넣습니다.
Hierarchy Pane의 Jet의 이름이 파란색으로 변하면서 Prefab과 연결되어 있음을 보여줄 것입니다. 우리는 럽츠의 제트 팩을 구현하기 위해 두개의 Jet Prefab을 사용할 것입니다. Prefab을 사용함으로서 우리는 두개의 제트를 하나의 Prefab만을 수정하는 것으로 변화를 줄 수 있습니다.
ㅁ 기존의 Jet 객체를 Hierarchy Pane으로부터 지웁니다.
(그렇지만 Jet Light는 있는 그대로 나두도록 합니다!)
이제 제트를 두 개와 조명 하나를 Player에 추가합시다:
ㅁ Hierarchy Pane의 Player로 가서,
ㅁ torso 하위 객체가 보일 때까지 하위 객체들을 열어나갑니다.
ㅁ Jet Prefab 객체를 이 객체에 두 번 드래그 해 옮깁니다.
ㅁ 이렇게 함으로서 두개의 Jet 인스턴스가 생성될 것입니다.
두 개의 Jet 인스턴스들을 Jet L 과 Jet R로 각각 명명합니다.
ㅁ Jet Light 객체 또한 torso 객체에 드래그 해 놓습니다.
여기 까지 잘 따라했다면 객체 Hierarchy는 이처럼 보일 것입니다:
제트 팩의 계층(Hierarchy)
ㅁ 유니티의 조작 도구를 이용하여 각 Jet Prefab을 럽츠 모델의 제트에 각각 위치시킵니다.
필요에 따라 회전을 시켜 파티클들이 올바른 방향으로 분출되도록 합니다.
ㅁ Jet Light를 두 Jet Prefab 사이에 위치시킵니다.
여기까지 하셨다면, 이제 럽츠는 이동 중에 두 개의 불꽃이 뿜어 나오는 제트 팩을 가지게 될 것입니다.
거의 다 되었습니다!
마지막 단계는 Jet Prefab들과 Jet Light 객체가 점프할 때에만 활성화 되도록 하는 것입니다. 이는 스크립트를 통해서 할 수 있습니다.
ㅁ scripts->Player 폴더의 JetPackParticleController 스크립트를 Hierarchy Pane의 가장 '상위' Player 객체에 드래그 해 놓습니다. 이로서 플레이어의 캐릭터에 스크립트가 추가 되었습니다.
이제 실행해보면 제트 팩이 예상했던 대로 잘 작동하는 것을 볼 수 있을 것입니다. 스크립트는 두개의 파티클 시스템과 조명을 제어하며, 럽츠의 움직임과 동기화하며, 플레이어가 점프 버튼을 눌렀을 때 점프 또는 낙하 시 감속을 위해 이 세 가지 요소들을 동시에 작동시킵니다.
럽츠의 제트 팩이 작동 중에 있습니다.
원형 그림자
게임이 시각적으로 바빠질 때 플레이어가 자신의 아바타를 화면에서 놓치지 않으려면 럽츠는 언제나 게임 상의 다른 객체들로 부터 쉽게 구별되어야 합니다. 이러한 일의 대부분은 아티스트나 게임 디자이너의 몫이겠지만, 유니티 스스로가 다룰 수 있는 몇 가지 요소들이 있습니다.
그 중 가장 중요한 점 하나는 그림자와 조명입니다. 성능 향상을 위해서, 조명 효과는 주로 아티스트 에 의해 모델링 패키지를 사용하여 미리 텍스쳐에 렌더링 되며 이러한 테크닉을 "베이킹(Baking)"이라고 부릅니다. 이 테크닉은 세트 또는 고정된 소품 같은 고정적인 객체에만 잘 적용됩니다. (본 튜토리얼의 자산에는 이러한 테크닉을 자의적으로 피하였습니다.)
직사광선 아래 걷는 캐릭터는 조명에 실시간으로 반응해야합니다. 캐릭터 발밑의 도로 정도는 조명이 미리 "베이킹"될 수 있겠지만, 캐릭터 자체는 이러한 방법을 사용할 수 없을 뿐만 아니라 캐릭터 스스로도 조명에 반응해야합니다.
이 문제의 해결방법은 역동적인 조명, 다이내믹 라이트가 필요한 곳에 배치하되 -- 만약 베이킹된 텍스쳐를 사용하면, 베이킹된 조명이 암시하는 곳에 조명을 추가하는 것을 기억하십시오 -- 조명이 움직이는 객체에 만 영향을 주도록 하는 것입니다. 이러한 조명들은 사용자를 위해 무대에 미리 준비가 되어있습니다.
그러므로 우리에게 남은 마지막 요소는: 그림자입니다.
3D 플랫폼 게임에 있어서 그림자는 캐릭터가 어디에 점프 또는 낙하 할 때에 어디에 착지하는지를 우리에게 알려주는 중요한 역할을 합니다. 이는 럽츠가 현재까지 자신에게는 없는 훌륭한 시각적 그림자가 필요함을 의미합니다.
그림자는 조명을 이용하여 그래픽 엔진을 이용하여 실시간으로 계산되고 렌더링 되어 만들어질 수도 있습니다. 그러나 이러한 그림자들은 처리능력 면에서 매우 무겁습니다. 게다가 모든 그래픽 카드들이 이러한 그림자들을 빠르고 효과적으로 계산할 수 있는 것도 아니며, 오래된 그래픽 카드들은 이 조차도 수행할 수 없을 지도 모릅니다.
그렇기 때문에, 우리는 럽츠에게 원형 그림자를 사용할 것입니다.
원형 그림자 추가하기
원형 그림자는 꼼수(?)입니다. 빛줄기를 쏘아서 물체에 닿는지를 체크하는 대신, 우리의 캐릭터 발밑에 검은 이미지를 표시합니다 -- 본 튜토리얼에 경우 그냥 검정색 원형 얼룩입니다. 이렇게 하는 것이 그래픽 카드에게 더욱 빠르고 쉽기 때문에 여러 종류의 하드웨어에서 잘 작동할 것입니다.
유니티가 제공하는 Standard Assets 컬렉션에서 Blow-Shadow(원형 그림자) prefab을 포함하고 있기 때문에, 스스로 직접 그림자를 만들기 보다는 이를 사용할 것입니다. 이 자산은 이미 Blob-Shadow 폴더에 프로젝트에 임포트되고 추가되었습니다. 이 폴더를 열고 blob shadow project prefab을 클릭하고 Hierarchy Pane에서의 가장 상위 캐릭터 객체인 Player에 드래그 해놓습니다. 이렇게 함으로서 Projector를 Player 객체 계층에서 가장 상위권에 추가시킬 것입니다:
Player 객체의 계층 속 Blob Shadow Projector (원형 그림자 프로젝터).
다음엔 blob shadow projector의 위치와 회전 값을 수정하여 프로젝터가 캐릭터의 바로 위에서 수직으로 비추도록 수정해야합니다.
ㅁ 4-Split layout을 선택합니다.
ㅁ blob shadow projector의 Rotation(회전) 값을 각각 90, 180, 0으로 설정합니다.
ㅁ 이제 측면(Side)과 상공(Top) 뷰를 이용하여 프로젝터를 럽츠 머리의 바로 위에 위치할 수 있도록 움직입니다. 그림자의 크기가 맘에 들지 않는다면, 원하는 크기가 나올 때까지 프로젝터를 위아래로 약간 움직일 수도 있습니다.
새 레이어 추가하기
화면을 살펴보면 현재는 원형 그림자가 럽츠 위로 드리워진 것을 알 수 있습니다. 우리는 이를 바라지 않습니다. 이 문제를 해결하기 위해서는 2가지의 방법이 있습니다: Near Clip Plane(전방 클립면)의 위치를 프로젝터로 부터 좀 더 멀리 떨어뜨려 놓거나 또는 간단히 프로젝터에게 특정 레이어에는 투사하지 않도록 하게 하는 방법이 있습니다. 우리는 후자의 방법을 이용할 것입니다.
-----------------------------------------------
왜 니어 클립 플레인(전방 클립면)을 수정하지 않는가?
얼핏 보기에는 이 테크닉이 더 쉬워 보이지만, 클립면은 스크립트에 의해 럽츠의 애니메이션을 고려하여 수정되어야 할 것입니다. 럽츠의 발은 점프할 때 좀 더 멀리 뻗어나가고 착지할 때 다시 가까워집니다. 럽츠의 그림자는 언제나 럽츠가 서있는 지면에 투사되어야 하며, 이러한 시퀀스에서는 니어 클립 플레인이 언제나 동일하게 존재할 수 없음을 의미합니다.
-----------------------------------------------
ㅁ Player 게임 객체를 엽니다.
ㅁ Inspector 창에서 Layer 드롭다운 메뉴를 엽니다.
ㅁ Add new layer...(새 레이어 추가)를 선택합니다.
ㅁ 비어있는 User Layer중에 가장 위에 있는 입력 값을 선택하고 noShadow라 이름 짓습니다.
(역자 주: 역자가 해본 결과 튜토리얼에는 스크린샷과 달리 User Layer 8, 9, 10도 이름 없이 비어있었으나 8에 noShadow라 입력하면 그림자가 제대로 작동하지 않습니다. 그냥 User Layer 11에 noShadow를 입력합시다)
이제 Inspector창을 확인하면 아래와 같이 보일 것입니다:
Tag Manager(태그 관리자)에 새 레이어를 추가하는 모습.
ㅁ 이제 다시 Hierarchy Pane의 Player 객체를 선택하고 평소처럼 Inspector 설정을 띄웁니다.
ㅁ Layer 드롭다운 메뉴를 클릭하고 새 레이어 이름인 noShadow를 선택하여 설정합니다. 유니티가 이 설정을 모든 하위 게임객체에 적용하고 싶은지 물으면 "Change Children Layers(하위 레이어를 변경하기)"를 클릭합니다.
다음은 Blob Shadow Projector에게 이 레이어 밑에 있는 객체들에게 그림자를 투사하지 않도록 알려줘야 합니다.
ㅁ Inspector창에 blob shadow의 속성을 불러온 후 Projector 구성요소의 Ignore Layer 입력값에 주목합시다.
ㅁ 아래의 그림처럼 우측의 드롭다운 메뉴를 이용하여 noShadow 레이어를 선택하십시오 (이렇게 함으로서 하위 객체에도 적용될 것입니다):
Blob Shadow Projector의 설정.
이제 게임을 실행하고 캐릭터를 움직여보면 그림자가 연료 아이템 주변을 점프할 때만을 제외하고는 거의 예상한대로 움직이는 것을 볼 수 있습니다. 연료 아이템근처에서 점프해보면, 아이템 또한 원형그림자를 표시하는 것을 볼 수 있습니다.
우리는 모든 아이템들이 언제나 쉽게 눈에 띄도록 하고 싶기 때문에, Blob Shadow Project가 아이템에게도 투사하는 것을 제외하게 하는 것이 적절할 것입니다.
우리는 이 아이템들에 대해 다음 챕터에서 더욱 자세히 알아볼 것이며, 지금은 우리가 맞닥뜨린 문제를 고쳐보도록 합시다.
ㅁ 먼저 게임을 멈춥니다.
ㅁ Project Pane으로 가서 FuelCellPrefab과 HealthLifePickUpPrefab 객체를 찾으십시오.
이들은 Props폴더에서 찾아볼 수 있습니다.
ㅁ 각 Prefab의 상위 객체를 선택하고 아래의 그림과 같이 이들의 레이어를 noShadow으로 설정합니다:
레이어가 "noShadow"로 바뀌었습니다.
☆ 참고
우리가 상위 객체에 변화를 줄때, 유니티는 종종 하위 객체에도 이 변경된 내용을 적용시킬지를 물을 것입니다. 변경된 내용이 하위 객체에 미칠 영향을 모두 고려하지 않은 채로 적용하는 것은 위험한일일 수도 있습니다.
본 튜토리얼에 경우, "FuelCellPrefab"과 "HealthLifePickUpPrefab"의 하위 객체가 같은 "noShadow"레이어에 있기를 바라므로, 유니티가 이를 물을 때는 하위객체에 변경내용을 적용하도록 동의합시다.
본 튜토리얼 번역서는 (주)지피엠스튜디오가 운영하는 "유니티코리아" 회원님들을 위한 메뉴얼 번역 자료 입니다.
본 자료를 다른 곳에 개제 하실 때에는 아래의 번역과 출처를 명확히 밝혀 주시기 바랍니다.
본 자료는 제3자가 상업적인 용도로 사용 할 수 없음을 밝힙니다.
번역 : 유니티코리아 [U3K]게임인생
출처 : 유니티코리아(www.unity3dkorea.com)
'Game Engine > Unity' 카테고리의 다른 글
No.5 Unity 3D Platform Tutorial "Setting the Scenes" (0) | 2010.08.09 |
---|---|
No.4 Unity 3D Platform Tutorial "First Steps #3" (0) | 2010.08.09 |
No.2 Unity 3D Platform Tutorial "First Steps" (0) | 2010.08.09 |
No.1 Unity 3D Platform Tutorial "Introduction" (0) | 2010.08.09 |
[Unity Manual - Building Scenes] Lights(라이트 / 조명) (0) | 2010.08.09 |