환영합니다
저번 강의에서는 Dissolve(디졸브) 머티리얼을 완성하고 여러분에게 숙제를
드렸었습니다
지금쯤 다 끝내셨을 거라 생각합니다
아직 못 끝내셨다면
나중에 결과를 비교해 볼 것이기 때문에 지금 해두시는 게 좋을 것 같습니다
좋습니다
일단 숙제를 하셨다고 생각하겠습니다
이 머티리얼의 코멘트 내용과 설정한 파라미터를 비교해보겠습니다
이 머티리얼 안으로 들어왔습니다
보시다시피 코멘트를 많이 작성해뒀습니다
하나씩 살펴보겠습니다
이 머티리얼의 첫 부분은 Opacity Mask(불투명도 마스크) 입니다
자세히 살펴봅시다
먼저 노이즈 텍스처로 Dissolve(디졸브) 효과를 주었고 이것을 텍스처 파라미터로 변환했는데
이 노이즈 텍스처를 언제든 다른 노이즈 텍스처로 바꿀 수 있다는 뜻입니다
노이즈 텍스처마다 다른 Dissolve(디졸브) 효과를 줄 수 있기 때문입니다
그 다음엔 Add 노드를 사용해 노이즈 텍스처에 값을 더함으로써 Dissolve(디졸브) 양을 조절했습니다
값이 완전히 흰색이거나 검정색이 되도록 하며
머티리얼의 Dissolve(디졸브) 양에 영향을 줍니다
그리고 이 머티리얼에 더하는 값은 사인입니다
Time(시간)을 값과 곱하는 것입니다
여기서는 Time(시간)을 늦추고 두 값을 교대로 바꿔서
하나는 1, 하나는 -1의 값을 사용합니다
그리고 올바른 결과를 보장하기 위해 Saturate 노드로 값을 0과 1 사이에
고정합니다
그리고 흰색과 검정색을 더 가미하기 위해 Contrast(대비)를 키웠습니다
마지막으로 모든 노드들을 이 Opacity Mask(불투명도 마스크)에 cache(캐시)하여
여기서 사용했습니다
이 부분에서 Opacity Mask(불투명도 마스크)를 UV의 입력 값으로 사용하고
이는 두 Float들을 필요로 하기 때문에 또 다른 Constant1Vector를 사용해 Append로 합쳐주었습니다
이제 두 Float들이 있으니 이것을 UV 소켓에 플러그하면 이전 머티리얼과 비교했을 때
이런 결과를 얻게 됩니다
큰 차이가 보입니다
이것을 노이즈의 선과 텍스처를 따로 다루기 위해 사용하고 나중에 CheapContrast 노드로
Contrast(대비)를 키워서 흰색과 검정색을 더 또렷하게 할 수 있습니다
그리고 우리가 원하는 결과를 위해서 One Minus 노드를 사용해 결과를 반전시켰고
Dissolve(디졸브)된 선에는 Emissive Color(이미시브 컬러)만 보이게 됩니다
마지막으로 전체 출력을 이 작은 노드에 cache(캐시)하여 이것을 Glow Edge Mask에
사용합니다
그리고 이 cache(캐시)된 두 노드들을 사용하는데
Opacity Mask(불투명도 마스크)는 Opacity(불투명도) 소켓에 플러그하고
Glow Mask는 Glow Edge(빛나는 선)의 색과 Multiply하여 또 Multiply 노드를 사용해 Brightness(밝기)를 올려줍니다
그 다음에 이것을 Emissive Color(이미시브 컬러)에 플러그합니다 그리고 지금까지 이 머티리얼에 설정한 파라미터는 하나인데
그건 이 텍스처 파라미터이고 이유는 나중에 이 노이즈 텍스처를 바꾸고 싶기 때문입니다
추가될 수 있는 파라미터는 더 많습니다
예를 들어 이 색은 Glow Edge(빛나는 선)의 색을 제어하기 위해 사용합니다
보시다시피 지금은 보라색입니다
나중에 이 색을 바꾸고 싶어질 수도 있습니다
그러므로 이것을 파라미터로 변환하고 GlowEdgeColor라고 지어줍니다
그리고 이건 Glow Edge(빛나는 선)의 Brightness(밝기)를 제어하는데 사용합니다
이것도 파라미터로 변환해주고 BrightnessForGlowEdge라고 지어줍니다
적용합니다
다시 돌아와보겠습니다
이걸 바탕으로 머티리얼 인스턴스를 생성하고 MI_Dissolve라고 짓겠습니다
이 큐브를 선택해서 이것에 머티리얼 인스턴스를 설정하면 이제 머티리얼 에디터 외부에서
속성들을 다룰 수 있습니다
예를 들어 여기서 Glow Edge(빛나는 선)의 색이 마음에 안들 때
언제든 바꿀 수 있습니다
초록빛으로 바꿔 볼 수도 있고 머티리얼의 변화를 바로 확인할 수 있습니다
Dissolve(디졸브) 효과가 마음에 들지 않으면 이 노이즈 텍스처를 다른 것으로 바꿀 수도
있습니다
noise 라고 입력하면 엔진이 제공하는 여러 노이즈 텍스처들이 보입니다
T_Noise01을 사용해보겠습니다
굉장히 다른 Dissolve(디졸브) 효과가 보입니다
이것도 얼마든 다른 것으로 바꿀 수 있습니다
T_NoiseErosion으로 바꿔보겠습니다
이걸 사용하면 또 아까와는 다른 Dissolve(디졸브) 효과가 연출됩니다
그러므로 보여지는 결과물을 결국 여러분이 무슨 노이즈 텍스처를 사용하는지에 따라 달라집니다
다시 T_Noise01으로 바꿔주겠습니다
저는 이게 마음에 듭니다
좋습니다
벌써 이 큐브에 멋진 Dissolve(디졸브) 머티리얼이 생겼습니다
그리고 이곳에 네 개의 머티리얼이 생겼는데 떠다니는 바위, Fireball(파이어볼), 플랫폼
그리고 Dissolve(디졸브)된 큐브입니다
재생을 누르면 이 캐릭터로 뛰어다닐 수 있습니다
이 캐릭터가 머티리얼들과 상호작용을 할 수 있다면 좋지 않을까요?
예를 들어 캐릭터가 지저분한 플랫폼을 밟으면 그 방향대로
이동시켜 주는 것입니다
이번 강의에서는 이런 상호작용이 어떻게 이루어지는지 살펴보겠습니다
우선 어떤 효과를 연출하고 싶은 것인가를 확실히 알아야 합니다
우리가 원하는 것은 이 캐릭터가 지저분한 플랫폼을 밟으면
캐릭터를 화살표의 방향대로 발사/이동시켜 주는 것
입니다
이런 효과를 달성하기 위해서 주로 컴포넌트가 필요합니다
Collision Volume이라고 부릅니다
사용하기 위해서 이제 머티리얼 쪽은 마무리하고 블루프린트 쪽을
시작해야 합니다
이 강의에서는 전에 언리얼 엔진을 사용한 경험이 있다면 블루프린트에 익숙하실 것입니다
우선 블루프린트가 무엇인지 살펴보겠습니다
지금까지는 이 머티리얼 그래프 내에서 작업을 했습니다
그리고 다시 상기시켜 보면 섹션 초기에서 머티리얼 그래프는 코드라는 언급을
했었습니다
핀들을 연결하거나 노드를 드래그하는 것은 사실 코드를 입력하는 것과 같습니다
조금 더 시각적인 방식인 것입니다
머티리얼 그래프 속 블루프린트도 마찬가지입니다
머티리얼 그래프라고 불렸지만 블루프린트는 이벤트 그래프라고 불리웁니다
마찬가지로 노드를 사용해야 합니다
물론 노드들을 연결하기도 합니다
그런 식으로 코드를 입력하는 것입니다
이 과정은 머티리얼 그래프와 같지만 캐릭터가 Object(오브젝트)와 상호작용하기 위해서는
블루프린트를 사용해야 하며 이는 머티리얼 그래프 내에서는 이루어질 수 없습니다
다시 에디터로 돌아와 첫 블루프린트를 생성해 보겠습니다
Content 폴더에 가서 새 폴더를 생성합니다
Blueprint라고 지어주고 더블 클릭으로 열어준 다음 우클릭을 해서
Blueprint Class를 선택합니다
고를 수 있는 클래스들이 많이 있는데 이것은 Parent Class(부모 클래스)로 적용되는 것입니다
이 인터페이스를 처음 보신다면 어려워 보일 수 있지만
그렇지 않습니다
여러분이 무엇을 해야 하는지만 알고 있다면 어떤 Parent Class(부모 클래스)를 골라야 하는지
잘 알게 될 것입니다
예를 들어 첫 번째는 액터인데 액터는 월드에 배치할 수 있는 Object(오브젝트)라고 합니다
그리고 세 번째에 캐릭터는 폰의 종류로 걸어다닐 수 있는 기능을 포함합니다
이 두 클래스들부터 살펴보겠습니다
Parent Class(부모 클래스)를 선택한다는 것은 이 클래스들을 부모로 선택하면
그 클래스로부터 모든 기능들을 기본 값으로 상속 받는 것입니다
예를 들어 액터 클래스의 자손 클래스를 생성하면 액터 클래스 속 모든 기능들을
기본 값으로 상속받습니다
캐릭터 클래스가 Parent Class(부모 클래스)라면 캐릭터 클래스의 기능들을 상속받는 것입니다
그렇다면 액터와 캐릭터에는 어떤 기능들이 있을까요?
만약 여러분이 원하는 기능이 단순히
아이템을 월드에 배치하는 것이라면
액터를 사용할 수 있습니다
여러분이 원하는 기능이 캐릭터를 제어하고
뼈대 mesh(메시)를 원하고 뼈대 mesh(메시)에 카메라를 부착하려는 경우
캐릭터 클래스를 사용하는 게 좋습니다
언리얼에서는 거의 모든 클래스가 액터 클래스로부터 상속을 받습니다
그러므로 캐릭터를 Parent Class(부모 클래스)로 선택해도 액터의 기능을 전부 상속 받습니다
하지만 액터를 Parent Class(부모 클래스)로 선택하면 캐릭터의 기능은 상속되지 않습니다
상속은 그런 식으로 이루어지지 않기 때문입니다
부모는 자녀로부터 상속을 받지 않으므로 액터는 자녀인 캐릭터로부터 상속을 받지 않습니다
좋습니다 이론은 이 정도로 충분합니다
이제 첫 블루프린트 클래스 생성해볼 건데 그저 "지저분한 플랫폼"을
월드에
배치하고 싶으므로 액터를 고르겠습니다
좌클릭하여 BP_MovingArrow라고 이름을 지어주고 더블 클릭으로
열어줍니다
여러분이 보게 될 인터페이스입니다
블루프린트 클래스는 필요한 컴포넌트들이 담긴 보관함이라고 생각하시면 됩니다
언제든 컴포넌트를 추가할 수 있으며 여기서 우리가 원하는 동작은 간단합니다
그저 "지저분한 플랫폼"과 "움직이는 화살표"가 이곳에 보이도록 하는 것입니다
그러기 위해서 우선 정적인 mesh(메시)부터 추가해야 합니다
일단 큐브를 추가할 것이고 제가 원하는 사이즈로 조정을 한 후
머티리얼은 "지저분한 플랫폼"으로 바꿔줍니다
이름은 "MI_DirtyPlatform"이었습니다
좋습니다
이제 이 블루프린트 안에 우리의 "지저분한 플랫폼"이 생겼습니다
다음으로는 Plane(평면)을 "움직이는 화살표"의 mesh(메시)로 추가하는 것입니다
그리고 머티리얼은 MI_MovingArrow로 바꾸고
살짝 위로 옮겨주겠습니다
지저분한 플랫폼 바로 위에 있으며 이제 저장하고 돌아가 보겠습니다
이제 블루프린트 클래스가 있으므로
이곳에서 이 큐브를 지워주고 Plane(평면)은 남겨둔 채 BP_MovingArrow를 끌어옵니다
이런 식으로 말입니다
이제 여기에 블루프린트 클래스가 생겼습니다
계속 컴포넌트를 추가할 건데 다음 컴포넌트는 Box Collision입니다
Box라고 입력을 하면
바로 Box Collision이 보입니다
이 유형의 컴포넌트는 오버랩 이벤트를 생성하는 역할을 하며
바로 우리가 원하는 것입니다
CollisionBox로 이름을 수정해 주겠습니다
여기서 Box Extent(박스 범위)도 바꿔주겠습니다
X축과 Y축의 크기를 조금 키워줄 건데 그렇게 하면
오버랩 이벤트에 더 효과적이며 컴파일하겠습니다
다시 월드로 돌아가보겠습니다
지저분한 플랫폼 위에 BoxCollision이 있는 것이 보입니다
다음으로는 이 컴포넌트의 함수들을 활용해볼 것입니다
블루프린트 내에서 작업을 할 때 중요한 것은 올바른 함수를 선택하는 것이며
제가 원하는 동작을 위한 함수에는 두 가지가 있습니다
우선 On Component Begin Overlap 이라는 함수가 Box Collision 클래스 안에 있으므로
그것을 사용할 수 있고 또 다른 함수는 Launch Character입니다
어떻게 이 두 함수를 블루프린트 이벤트 그래프에서 찾을 수 있는지 알아보겠습니다
이벤트 그래프로 돌아와서 Collision Box로 가서 오른쪽 부분에서 스크롤을 내려줍니다
그러면 여기 선택할 수 있는 여러 기본 이벤트들이 보입니다
On Component Begin Overlap의 더하기 아이콘을 클릭하면
블루프린트 그래프 안에 자동으로 이 함수가 불러와집니다
이 블루프린트 그래프를 열 때 생기는 세 개의 기본 이벤트들을 삭제해주겠습니다
하나는 Begin Play고
하나는 Tick인데 우리가 하려는 작업에는
이 세 가지가 필요 없으므로 지워주겠습니다
그리고 이 On Component Begin Overlap은
무언가 Collision Box와 오버랩될 때 이 함수가 작동될 것입니다
증명을 위해 핀을 끌어와 Print String을 입력하겠습니다
스크린에 'Overlapping Begins(오버랩 시작)'이라는 문구를 프린트하도록 하고 월드에 돌아가 보겠습니다
재생합니다
캐릭터가 플랫폼과 오버랩될 때 스크린에
'Overlapping Begins(오버랩 시작)'가 보입니다
좋습니다
이제 이 함수가 잘 작동한다는 것을 알았으나 한 가지 문제가 있습니다
어떤 문제인지 보여드리겠습니다
이런 식으로 큐브를 끌어온 후 재생해보겠습니다
큐브가 플랫폼과 오버랩되면서 함수가 작동되었습니다
그리고 그건 우리가 원하는 것이 아닙니다
일단 정지시키겠습니다
그 이유는 지금 Collision Box에 무언가 오버랩되기만 하면 이 함수가
작동됩니다
하지만 우리가 원하는 것은 그게 아닙니다
움직이는 Object(오브젝트)나 움직이는 적들이 있을 때 그것들이 이 함수를
작동시키는 것이 아니라 오직 우리의 캐릭터 하나만 이 함수를 작동시켜야 합니다
그러므로 범위를 줄여야 합니다
범위를 줄여서 이 함수를 작동시키는 것이 오직 우리의 캐릭터여야만 합니다
그러기 위해서 Cast 함수를 사용해야 합니다
이제 출력하던 메시지를 지우고 여길 보시면 CollisionBox와
무언가 오버랩될 때 이런 류의 정보를 얻을 수 있습니다
정확히 어떤 컴포넌트가 CollisionBox에 오버랩되는지를 알 수 있습니다
어떤 종류의 액터가 오버랩되는지 알 수 있습니다
다시 말씀드리지만 캐릭터는 액터의 한 종류입니다
액터의 자녀입니다
그러므로 액터로부터 기능들을 상속 받아 사용할 수 있습니다
Other Actor로부터 핀을 끌어와 Cast to BP_ThirdPersonCharacter를 입력합니다
Cast라는 용어를 처음 접하셨을 분들을 위해 설명드리자면 Cast는 프로그래밍 용어입니다
이렇게 기억하시면 됩니다
범위를 줄여주는 용도라고 말입니다
Cast는 월드 내 모든 것의 범위를 이 BP_ThirdPersonCharacter로 줄여줍니다
그리고 그건 캐릭터에 대한 통제권입니다
보여드리기 위해 ThirdPerson의 블루프린트로 갑니다
보시다시피 이것이 우리가 제어하던 캐릭터이며 이름은
BP_ThirdPersonCharacter 입니다
이 캐릭터가 CollisionBox와 오버랩되는 캐릭터라고 설정하고 나면
해야 할 것이 있습니다
그리고 제가 사용할 함수는 LaunchCharacter 입니다
우클릭을 하고 LaunchCharacter를 입력하면 그런 함수를 찾을 수 없습니다
그 이유는 이 이벤트 그래프는 기본적으로 모든 접촉이 민감하여
이 블루프린트나 액터 안에 존재하는 함수들만 보이게 합니다
하지만 LaunchCharacter는 이 두 클래스 안에 속한 클래스가 아닙니다
액터 클래스 안에서는 찾을 수 없습니다
캐릭터 클래스의 함수입니다
하지만 어떻게 캐릭터 클래스에 접근할 수 있을까요?
방금 Cast to BP_ThirdPersonCharacter를 했습니다
그리고 그곳에 파란색 핀이 있습니다
이 핀을 끌어와 launch character를 입력합니다
그러면 함수가 보이고 Cast를 사용해 캐릭터 클래스의 함수에 접근할 수 있는 것입니다
범위를 좁혀놨으므로 이 함수를 안전하게 사용할 수 있습니다
이제 입력 값 두개를 필요로 합니다
첫 번째 입력 값은 Target(목표)입니다
어떤 캐릭터를 Launch(실행)하고 싶은지 묻는 것입니다
보시다시피 BP_ThirdPersonCharacter를 추진하는 것이고 또 다른 하나는 Launch Velocity(실행 속도)입니다
Velocity(속도)란 무엇일까요?
Velocity(속도)를 이해하자면 Speed(속력)라는 친숙한 용어와 같은 개념입니다
두 그림을 준비했습니다
왼쪽은 자동차가 20m/s의 Speed(속력)로 주행 중입니다
그것이 Speed(속력)입니다
Speed(속력)는 얼마나 빨리 이동하느냐 입니다
하지만 오른쪽에는 자동차가 동쪽을 향해 20m/s의 Velocity(속도)로 주행 중이라고 써있습니다
Speed(속력)와 Velocity(속도)의 차이는 방향을 아는 지의 차이입니다
Velocity(속도)는 Speed(속력)에서 방향이 추가된 것이라고 보면 됩니다
그럼 이제 Velocity(속도)에 필요한 것은 두 가지가 있습니다
하나는 Speed(속력)이고
하나는 Direction(방향)입니다
Speed(속력)부터 해결해보겠습니다
Speed(속력)를 위해 이미 Variables(변수)가 생성된 것이 보입니다
지우고 다시 보여드리겠습니다
Variables(변수)로 가서 더하기 아이콘을 클릭하면
바로
여러 기본 Variables(변수) 타입들을 고를 수 있습니다
Boolean(불리언)입니다
이건 또 다시 프로그래밍 쪽 개념이 포함되어 있습니다
Variables(변수)가 무엇인지 모른다면 그저 값을 보관하기 위해 사용하며
이 값들을 원하는 동작을 다루는데 사용할 수 있다는 것만 알면 됩니다
Boolean(불리언)은 true(참)과 false(거짓)이라는 오직 두 값만 갖고 있는 타입입니다
우리가 원하는 타입은 Float이며 Speed라고 이름을 짓고 컴파일합니다
그러면 입력 값을 필요로 합니다
기본 값으로 1000으로 설정됐으나 이것으로 launch(추진)의 속도를 조절하므로
여러분이 원하는대로 설정하면 됩니다
이 변수를 드래그해서 Get Speed(Speed 가져오기)를 선택합니다
이제 Speed(속력)가 준비됐습니다
다음은 Direction(방향)입니다
캐릭터를 앞으로 추진하고 싶습니다
하지만 뷰포트로 돌아가서 이 플랫폼을 살펴보면 우리가 말하는 '앞'은 캐릭터가 이 화살표를 따라
움직이는 것입니다
바라보는 방향에 따라 바뀌기 때문에 이것은 굉장히 상대적인 개념입니다
여러분이 말하는 '앞'과 이 화살표의 '앞'은 다를 수 있습니다
그러므로 이 방향을 확실히 정하는 방법을 찾아야 합니다
이 화살표를 위한 한 방향을 정확히 정해야 하며 그에 필요한 컴포넌트가
있습니다
그 컴포넌트는 바로 Arrow(화살표) 컴포넌트입니다
그저 컴포넌트입니다
기본적으로 이 화살표는 x축을 가리키며 이 컴포넌트로 어느 쪽이 앞인지를
구분할 수 있습니다
이를 위한 함수가 있습니다
Get Forward Vector이며 1 길이를 갖고 있습니다
굉장히 짧으며 길이를 조절할 수 없다면 유용해 보이지 않지만
이것의 방향 정보를 사용할 수 있습니다
다시 블루프린트 에디터로 돌아옵니다
Arrow(화살표) 컴포넌트를 추가하겠습니다
Add를 클릭하고 Arrow(화살표)를 선택하여 블루프린트 뷰포트에 추가한 다음 위로 옮겨줍니다
보시다시피 화살표 모양이 있어서 이벤트 그래프의 앞과 뒤를
명확히 알 수 있습니다
Arrow(화살표)를 드래그 해온 다음 핀을 끌어오면
Get Forward Vector라는 함수가 있습니다
이것을 방향으로 사용할 것이며 Speed(속력)와 합치기 위해 Multiply를 사용하겠습니다
우클릭하여 Multiply를 입력하고 곱해주고 싶은 것들은
이 두 값들이며 이것이 Velocity(속도) 값이 되므로 Launch Velocity(실행 속도)에 연결해줍니다
이제 캐릭터가 Collision에 오버랩될 때 이 함수가 캐릭터를 앞쪽 방향으로
1000 유닛 추진시킵니다
에디터로 확인해보겠습니다
재생합니다
우선 큐브를 삭제하고 재생한 다음 오버랩하겠습니다
캐릭터가 추진되는 것이 보입니다
다시 돌아가서 오버랩하겠습니다
보시다시피 캐릭터가 추진되며 오늘의 과제를 시작해 보겠습니다
On Component Begin Overlap 컴포넌트를 사용해 함수를 활성화시키고 제가 보여드린 것처럼
캐릭터를 앞으로 추진시킬 수 있기를 바랍니다
그리고 다음 단계도 시도해 보시기 바랍니다
LaunchCharacter 함수를 사용해 캐릭터를 공중으로 추진시키는 것입니다
더 이상 캐릭터를 앞으로 추진시키지 않습니다
Up Vector가 필요하며 Arrow(화살표) 컴포넌트를 사용해 다룰 수 있습니다
그럼 이제 영상을 멈추고
직접 시도해 보시기 바랍니다
도움이 필요하실 때 돌아오셔도 됩니다
어떠셨나요?
성공적으로 캐릭터를 추진시켰나요?
어떻게 하는지 살펴보겠습니다
다시 블루프린트 그래프로 돌아갑니다
지금은 Arrow(화살표) 컴포넌트를 사용해 Forward Vector를 다루고 있습니다
Speed(속력)와 Multiply하면 그것이 캐릭터를 추진하는 Velocity(속도)입니다
Up Vector도 사용할 수 있습니다
이것은 Unit Vector(유닛 벡터)이며 길이는 1이고 윗 방향을 가리킵니다
이 두 핀을 연결한 다음 컴파일하겠습니다
재생을 하고 캐릭터를 오버랩하면 공중으로 추진되고
이 함수를 사용해 플랫폼을 더 만들어 볼 수도 있습니다
공중에도 여러 플랫폼을 만들어서 사용자들이
섬세한 조작으로 다른 플랫폼에 착지하도록 합니다
소리를 추가하거나 파편 작업을 하는 등 더 멋지게 보완할 수도 있습니다
이번 강의에서는 월드 내 Object(오브젝트)들의 상호작용에 대해 알아보았고
On Component Begin Overlap 함수의 도움을 받았습니다
그리고 어떤 함수를 사용해야 하는지도 살펴보았습니다
올바른 함수를 사용하기 위해서는 올바른 클래스에 접근해야 한다는 것을 기억해야 합니다
마지막으로는 Arrow(화살표) 컴포넌트의 활용법과 그것으로 방향을 정하는 방법에 대해서도 알아보았습니다
좋습니다
다음 강의에서 뵙겠습니다