이전 내용보기


앞장에서 작성된 내용에 Pawn Sensing을 추가하여 AI 적 캐릭터가 플레이어 캐릭터를 발견하면 총을 들고 달려 오다가 플레이어가 총을 쏘아 명중하면 쓰러지는 내용으로 애니메이션을 테스트하려고 한다. 애니메이션을 실행할 때는 블루프린트 Play Animation 노드를사용할 것이다


여기서도 앞장과 마찬가지로 Animation Starter Pack에 포함된 애니메이션을 사용할 것이고 스켈레탈 메시를 참조하는 클래스 블루프린트는 앞장에서 사용했던 BP_Enemy_AI 를 사용한다


사용된 Skeletal Mesh는 Animation Starter Pack에 포함되어 있는 SK_Mannequin 이므로 Animation Starter Pack에 포함된 모든 애니메이션을 BP_Enemy_AI 블루프린트에서 Play Animation 노드를 통해 실행할 수 있다.


컴포넌트 패널의 [컴포넌트 추가] 버튼을 누르고 Pawn Sensing을 검색하여 컴포넌트로 추가하고 우측 [디테일] 뷰에서 시야의 각도와 시야의 반경을 적절히 설정한다


컴포넌트 패널에서 Pawn Sensing 컴포넌트를 선택하고 [이벤트 그래프] 바탕에서 마우스 우측을 누르고 On See Pawn 이벤트 노드를 추가하고 아래와 같은 내용을 작성한다. 그 외에 BeginPlay 이벤트와 OnComponentHit 이벤트도 작성한다


아래의 내용은 AI 캐릭터가 총을 들고 서 있다가 플레이어 캐릭터를 발견하면 달려 오다가 플레이어가 총을 쏘아 명중하면 AI 캐릭터가 쓰러지는 내용이다


AI 캐릭터가 활동하기 위해서는 Floor에 Nav Mesh Bound Volumn 도 설정해주는 것을 잊지 않아야 한다




Posted by cwisky

언리얼 엔진의 Skeleton 에 Socket을 추가하고 Skeletal Mesh를 참조하는 클래스 블루프린트에서 Socket에 총 모델을 연결하기


이전의 내용을 이해한 후에 여기를 참조해야 제대로 이해할 수 있습니다

이전의 내용 보기


특정 Skeleton을 이용하여 생성된 기본 캐릭터 모델(Skeletal Mesh)이 있고 그 모델에 다른 모델을 부착하려는 경우에는 Socket을 Skeleton에 추가해야 한다. 추가된 소켓에 무기나 다른 모델을 부착하려면 해당 메시를 참조하는 블루프린트에서 컴포넌트를 추가하는 방법을 사용할 수 있다.


여기서는 앞장에서 생성한 블루프린트를 사용하여 그 안에서 참조하는 Skeletal Mesh에 소총 모델을 부착하여 애니메이션과 함께 움직이도록 설정하려고 한다


준비물

Skeleton : Animation Starter Pack에 포함되어 있는 UE4_Mannequin_Skeleton

Skeletal Mesh : Animation Starter Pack에 포함되어 있는 SK_Mannequin

클래스 블루프린트 : 앞장에서 생성된 스켈레탈 메시를 참조하는 클래스 블루프린트

소총 모델 : free3d.com 등에서 배포하는 무료 모델 

fbx.zip



Skeleton파일을 찾아 더블클릭하여 페르소나 에디터를 연다

사용할 Skeleton파일이 저자된 곳은 다음과 같다

콘텐츠/AnimStarterPack/UE4_Mannequin/Mesh/UE4_Mannequin_Skeleton

스켈레톤 파일을 더블클릭하여 페르소나 에디터를 열고 아래의 그림과 같이 소켓을 추가한다. 아래의 그림에서는 왼손의 뼈에 해당하는 hand_l 에 소켓을 추가하고 있다


소켓의 이름은 자동으로 본의 이름을 따서 [hand_l소켓]으로 붙여진다

툴바에서 [저장] 버튼을 누르고 에디터를 닫는다


앞장에서 생성한 BP_Enemy_AI 클래스 블루프린트를 더블클릭하여 연다. 이 클래스는 위에서 소켓이 추가된 바로 그 Skeleton을 적용한 Skeletal Mesh의 참조를 사용하고 있으므로 소켓에 접속할 수가 있다


CB에서 소총 모델을 드래그하여 컴포넌트 패널에 있는 Mesh의 하위 컴포넌트가 되도록 놓고 우측 [디테일] 뷰 / 소켓 / 부모소켓 : [hand_l소켓] 으로 설정한다. 이 때 중요한 점은 소켓이 추가된 Mesh의 하위 컴포넌트가 되도록 설정해야 한다는 것이다. 그래야만 부모 소켓 항목에서 소켓을 선택할 수 있게 된다


추가된 소총모델을 선택하고 우측 [디테일] 뷰 /트랜스폼/ 에서 위치를 0, 0, 0 으로 설정하면 부모소켓의 위치에 소총모델이 위치하게 된다. 소총의 크기가 캐릭터에 비해서 너무 작기 때문에 스케일 툴을 이용하여 크기를 조정하고 소총모델을 회전하여 총구가 앞으로 오도록 설정한다. 이때 에디터 뷰포트에서 애니메이션이 실행 중이면 소총의 위치를 설정하기가 어려우므로 컴포넌트 패널에서 Mesh를 선택하고 우측 [디테일] 뷰 / Animation / Pause Anims 를 선택하여 애니메이션을 일시중지하고 소총의 위치를 설정한 다음에 Pause Anims 선택을 해제하면 된다. 실수로 Pause Anims를 선택한 상태로 게임을 실행하면 애니메이션이 실행되지 않는다

위와 같이 설정하고 Pause Anims 선택을 해제하면 뷰포트 상에서 지정된 애니메이션이 실행될 때 캐릭터의 움직임을 따라서 소총도 자연스럽게 따라 움직이는 것을 확인할 수 있다


캐릭터의 자세를 따라 소총이 따라서 움직이는지 확인하기 위해서 [이벤트 그래프]에 다음과 같은 간단한 내용으로 테스트해 본다. 적용해본 애니메이션은 Fire_Rifle_Ironsights 으로 견착사격하는 애니메이션이다


위의 내용을 [저장] [컴파일] 후에 게임을 실행해 보면 다음과 같이 캐릭터의 자세의 변화에 따라 소켓에 연결된 소총도 제대로 따르는 것을 확인할 수 있다



Posted by cwisky

스켈레탈 애니메이션(Skeletal Animation)은 관절체로 구성된 오브젝트의 움직임을 표현한 애니메이션을 말한다 언리얼 엔진에서 스켈레탈 애니메이션은 스켈레톤(Skeleton)에 등록되며 스켈레톤의 참조를 이용하면 해당 스켈레톤에 등록된 많은 애니메이션 중에서 상황에 따라서 특정 애니메이션을 선택하여 사용할 수 있다. 그러므로 스켈레탈 애니메이션을 화면에 보여주려면 반드시 스켈레톤(Skeleton)이 있어야 하며 캐릭터의 외형을 나타내는 스켈레탈 메시(Skeletal Mesh)도 반드시 필요하다 Skeleton은 뼈의 계층구조에 대한 정보만 있고 오브젝트를 표현하는 메시 정보는 가지고 있지 않다. Skeletal Mesh는 Skeleton(뼈의 계층구조 정보)을 적용하여 생성한 3D 메시를 말한다


언리얼 엔진을 설치하고 일인칭, 삼인칭 템플릿을 이용하여 프로젝트를 생성하면 엔진에서 제공하는 Skeleton, Skeletal Mesh 와 해당 스켈레탈 메시를 사용해서 만들어진 몇가지 스켈레탈 애니메이션이 제공된다.  


블루프린트에서 스켈레탈 애니메이션을 화면에 출력하는 방법은 Play Animation 노드를 사용하는 것이 기본이다. 단순히 적절한 상황에서 특정 애니메이션을 보여주기만 한다면 그 이상의 수단은 필요 없을 것이다. 그러나 몇가지 애니메이션이 자연스럽게 연결되도록 보간(Interpolation)하는 방법을 제공하는 Blend Spaces 라는 수단도 있고 State Machine 을 사용하여 상태에 따라 다른 애니메이션을 선택하여 보여 줄 수도 있다. 또 Animation Montage를 이용하여 2가지 애니메이션을 동시에 실행하도록 혼합할 수도 있다


모든 스켈레탈 애니메이션의 실행을 위해서는 해당 스켈레텔 메시가 반드시 필요하며 Character를 상속한 클래스 블루프린트를 생성하고 Mesh 컴포넌트를 원하는 스켈레탈 메시로 지정해 주면 블루프린트 안에서 Mesh의 참조를 구할 수 있으므로 해당 Mesh에 등록된 모든 스켈레탈 애니메이션을 불러서 실행할 수가 있다.


여기서는 위에서 언급한 대로 Character를 상속한 클래스 블루프린트를 생성하고 Mesh 컴포넌트에 Animation Starter Pack에서 제공하는 SK_Skeleton 메시를 지정하는 방법에 대해서 알아본다


Animation Starter Pack을 다운로드 및 임포트했다면 콘텐츠 / AnimStarterPack / UE4_Mannequin / Mesh / 안에서 스켈레톤(UE4_Mannequin_Skeleton)과 스켈레탈 메시(SK_Mannequin)를 찾을 수 있다

Animation Starter Pack에 포함된 많은 애니메이션은 콘텐츠/AnimStarterPack 안에서 찾을 수 있다


일인칭 템플릿을 사용하여 새로운 프로젝트를 생성하고 [월드 세팅] / Game Mode / Game Mode Override : FirstPersonGameMode, Default Pawn Class : FirstPersonCharacter 으로 설정한다


CB의 적당한 폴더에서 마우스 우측 > 블루프린트 클래스 > 부모 클래스 선택 : Character > 블루프린트 이름: BP_Enemy_AI 등으로 지정


BP_Enemy_AI 를 더블클릭하여 에디터를 연다


에디터 왼쪽 컴포넌트 패널에서 Mesh 선택, 우측 [디테일] 뷰 / Mesh / Skeletal Mesh 항목에 Game/ AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin 선택

그 위에 있는 Animation / Animation Mode : Use Animation Asset 선택, Anim to Play : Idle_Rifle_Hip 선택, 툴바에서 [저장], [컴파일]


위와같이 설정하면 지정된 애니메이션이 뷰포트에서도 실행되고 있는 것을 확인할 수 있다


뷰포트 상의 캐릭터가 Capsule Component 의 위치와 일치하도록 캐릭터를 이동툴로 내려서 조정하고 캐릭터가 X축을 향하도록 회전툴을 사용하여 90도 회전한다


아래처럼 이미 AI Controller Class 항목에 AIController으로 설정된 상태이기 때문에 이 클래스에서는 AI 기능(Pawn Sensing, AI Move To 등)을 사용할 수가 있다.


컴포넌트 패널에서 CapsuleComponent 를 선택하고 우측 [디테일] 뷰 / Collision / 콜리전프리셋 : BlockAll 으로 설정

이벤트 항목에서 OnComponent Hit 의 초록색 버튼을 누른다


이벤트 그래프를 다음과 같이 작성한다. 캐릭터가 발사체(FirstPersonProjectile)를 맞으면 죽는 것처럼 쓰러지는 애님메이션(Death_Ironsights_1)이 실행되는 내용이다


지금까지 작성된 BP_Enem_AI 블루프린트를 CB에서 드래그하여 뷰포트에 배치하고 게임을 실행한 후 일인칭 캐릭터가 총을 조준하여 발사하도록 마우스 왼쪽 버튼을 누르면 적 캐릭터에 명중하면 쓰러지는 애니메이션이 실행되는 것을 확인할 수 있다



Posted by cwisky

Animation Starter Pack에 포함된 Skeleton Mesh와 애니메이션을 이용하여 상황에 따라 다른 애니메이션을 보여주는 예제이다


Skeletal Animation은 Skeleton Mesh에 연결되어 있으므로 Skeleton Mesh를 클래스 블루프린트로 전환하여 Mesh 콤포넌트를 타겟으로 하여 Play Animation 노드를 사용하면 해당 스켈레톤에 연결된 모든 애니메이션을 플레이할 수 있다. 그러므로 상황에 따른 적절한 애니메이션을 선택하여 실행할 수가 있다


Mesh의 Collision Type을 Ragdoll 이 아닌 NoCollision으로  설정하였고 그 대신 Death_Ironsights 애니메이션을 사용하여 좀더 실감나게 할 수 있다.


AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin 위에서 마우스 우측 > 애셋액션 > 다음을 사용하여 블루프린트 생성... 을 선택하면 블루프린트가 생성되면서 SK_Mannequin 스켈레톤 메시가 블루프린트내의 Mesh 콤포넌트로 포함되면서 블루프린트가 생성된다. 이 Mesh를 타겟으로 하여 Play Animation 노드를 사용하면 애니메이션을 실행할 수 있다


그리고 이미 스켈레톤 메시를 이용하여 블루프린트 클래스가 생성되어 있다 AnimStarterPack / Ue4ASP_Character 가 그것이므로 이 클래스를 복제하여 그래프 내용을 모두 지우고 사용하면 된다


다음은 SK_Mannequin 과 Pawn Sensing을 사용하여 플레이어 캐릭터를 발견한 경우에 달려오다가 플레이어 캐릭터가 총을 쏘면 쓰러지는 내용이다.

사용된 애니메이션은 3가지인데, Idle_Rifle_Hip, Jog_Fwd_Rifle, Death_Ironsights 등이다


Floor 에 Nav Mesh Bounds Volumn을 설정해야 AI 캐릭터가 움직인다는 것도 주의해야 한다


1. Skeleton Mesh 파일을 찾아서 클래스 블루프린트를 생성한다


2. 생성된 블루프린트를 더블클릭하여 에디터를 열고 컴포넌트 패널의 Mesh를 선택한다


3. 우측 [디테일] 뷰 / Animation / Anim to Play : Idle_Rifle_Hip(총을 허리에 밀착한 자세의 애니메이션) 선택 혹은,

Animation Mode : Use Animation Blueprint를 선택하고 Anim Class : UE4ASP_HeroTPP_AnimBlueprint_C를 선택해도 된다


4. free3d.com 등의 사이트에서 소총 모델을 다운로드하여 압축을 해제하고 fbx 파일을 임포트하여 CB에 준비한다

fbx.zip

4-2. 임포트할 때 머티리얼과 텍스쳐가 임포된 경우에는 머티리얼을 더블클릭하여 머티리얼 에디터를 열고 포함된 텍스쳐를 적용해 주고 머티리얼을 소총 모델에 적용해준다


4-3. 에디터에서 애니메이션이 진행되는 중에는 마네킹에 소총을 결합하기가 어려울 수 있으므로 [컴포넌트] 패널에서 Mesh를 선택하고 우측 [디테일] 뷰 / Animation / Pause Anims 를 선택하여 애니메이션을 중지하고 작업을 하면 된다. 작업 후에는 반드시 선택을 해제해야만 실제 뷰포트에 놓았을 때 애니메이션이 작동한다


5. AnimStarterPack / Ue4ASP_Character(스켈레톤 메시)를 더블클릭하여 [스켈레톤] 탭을 누르고 [스켈레톤 트리] 를 선택하여 hand_l 노드를 찾아서 마우스 우측을 누르고 [소켓 추가]를 선택한다


6. 소켓 이름을 적절히 지정하고 [저장]을 누른 후 에디터를 닫는다


7. 스켈레톤 메시로부터 생성된 클래스 블루프린트를 더블클릭하여 열고 [컴포넌트] 패널 안으로 다운로드하여 임포트한 소총 fbx 를 드래그하여 놓는다


8. 컴포넌트로 추가된 소총을 선택하고 우측 [디테일] 뷰 / 소켓 / 부모소켓 : 추가된 소켓의 이름을 찾아 지정하고 트랜스폼 항목에서 x:0,  y:0,  z:0으로 설정하면 소총이 소켓의 위치에 놓인다


9. 스케일, 이동, 회전 툴을 사용하여 소총이 마네킹의 자세에 적절히 어울리도록 조정한다

그 외에 Pawn Sensing 컴포넌트를 추가하고 Floor에는 Nav Mesh Bounds Volumn 을 설정하는 것도 잊지 말아야 한다


완성된 블루프린트를 뷰포트에 드래그하여 놓고 게임을 실행하면 소총을 든 마네킹이 플레이어 캐릭터를 발견한 경우 달려오는 것을 확인할 수 있고, 플레이어가 총을 쏘면 실감나게 쓰러지는 것도 볼 수 있다





Posted by cwisky

Animation Blueprint에서 다른 액터의 참조 구하는 예




BP_Event 클래스의 내용


Posted by cwisky

언리얼 엔진에서 Blend Space는 2개 이상의 실행 속도가 다른 애니메이션을 연결하여 중간 속도의 애니메이션을 만들어 낼 수 있는 기술이다.

예를 들어, ASP에 포함된 애니메이션 시퀀스에는 Idle, Jog, Sprint 등의 애니메이션은 있지만 Idle과 Jog 사이의 실행속도를 가진 Walk 애니메이션은 포함되어 있지 않으므로 Walk 속도 애니메이션이 필요하다면 Blend Space 방법을 이용하여 Idle, Jog 애니메이션을 키 프레임으로 사용하여 그 중간 속도의 애니메이션을 생성해 낼 수 있다.


Blend Space 생성 절차

CB 에서 마우스 우측 > 애니메이션 > 블렌드 스페이스 1D > 파일 이름을 BS_EnemyWalk 등으로 지정

생성된  BS_EnemyWalk 을 더블클릭하여 페르소나 애디터를 연다




가로축의 이름을 Speed 등으로 지정한다

이 때 입력된 이름은 완성 후에 이 애니메이션을 사용할 때 노드의 입력핀으로 설정되어 임의의 값을 입력할 수 있다



키 프레임으로 사용될 애니메이션 시퀀스 설정하기

Blend Space 편집 창의 0.0 지점에 [애셋브라우저] 에 있는 애니메이션 시퀀스 중에서 정지한 상태로 있는  Idle_Rifle_Hip 을 드래그하여 놓고, 중간 지점에는 Jog_Fwd_Rifle, 100.0 지점에는 Sprint_FWD_Rifle 를 드래그하여 놓는다



중간단계 애니메이션 미리보기

중간에 있는 초록색 핸들을 마우스로 클릭하여 좌우로 드래그해보면 미리보기 화면에 중간단계의 애니메이션이 실행된다. 툴바에서 [저장] 버튼을 누르면 Blend Space 가 완성되고 애니메이션 블루프린트에서 사용할 수 있는 상태가 된다



애니메이션 블루프린트에서 블렌드 스페이스 애니메이션 사용하기

애니메이션 블루프린트에서 특정 스테이트에 앞에서 작성한 BS_EnemyWalk 를 드래그하여 넣는다



해당 스테이트를 더블클릭하여 들어가서 아래와 같이 적당한 Speed 값을 입력해주면 해당하는 속도의 애니메이션이 실행되는 것을 확인할 수 있다. 물론 애니메이션 블루프린트는 특정 Skeletal Mesh에 설정해주고 게임을 실행해보면 애니메이션이 작동하는 것을 확인할 수 있다


애니메이션 블루프린트에서 사용된 블렌드 스페이스 애니메이션


Posted by cwisky

적 캐릭터가 플레이어 캐릭터를 향해 총알을 발사하는 예



Posted by cwisky

F키를 누르면 1인칭 카메라 1미터 앞에서 총알이 발사되도록 한 예


먼저 언리얼에서 1인칭 템플릿을 사용하여 프로젝트를 생성하고 Actor 를 기반으로 클래스 블루프린트를 생성하고 아래처럼 작성한 후에 CB에서 드래그하여 뷰포트에 올리고 게임을 실행하여 F키를 누르면 일인칭 캐리턱 카메라 1미터 앞에서 정면으로 총알이 발사되는 것을 확인할 수 있다



Posted by cwisky

BlendSpace는 다수개의 애니메이션이 부드럽게 연결되어 실행될 수 있도록 설정하는 파일이며 언리얼 엔진은 BlendSpace에 설정된 다수개의 애니메이션 사이에 보간법(Interpolation)을 적용하여 자연스럽게 연결되도록 한다


Idle, Walk, Run 애니메이션을 속도를 기반으로 배치 연결하여 임의의 속도에서의 애니메이션 구현하기

예를 들어, 속도를 기반으로 하여 다수개의 애니메이션을 연결한 경우, 중간속도 구간에서는 언리얼 엔진에 의해 보간된 애니메이션이 자동으로 지원된다.


CB에서 마우스 우측 > 애니메이션 > Blend Space > 파일 이름을 BS_Idle_Walk_Run 등으로 입력

생성된 Blend Space를 더블클릭하여 페르소나 에디터를 열고 다음과 같이 설정한다


Idle, Walk, Run 애니메이션을 연결할 때 속도에 따라 나열하면 중간 구간에서는 언리얼 엔진에 의해 보간된 애니메이션이 지원된다. 하단 그래프의 초록색 점을 마우스로 상하로 이동하면 보간된 애니메이션을 미리 확인할 수 있다



State Machine에 Blend Space를 설정하기

Animation Blueprint를 작성하고 State Machine 을 생성하고 특정 상태에 위에서 작성된 Blend Space파일을 드래그하면 된다



스테이트 머신 안에 포함된 특정 스테이트 안에 Blend Space를 설정한 예

속도 기반으로 3개의 애니메이션을 연결했기 때문에 특정 속도를 지정하면 해당 속도대의 애니메이션이 실행된다



속도를 부드럽게 올리거나 내리면서 다양한 속도에 따른 애니메이션을 실행하는 경우

예를 들어, 캐릭터가 정지하고 있다가 걷기 시작하고 이어서 달리는 애니메이션을 화면에 출력하고자 한다면 다음과 같이 Speed 값을 0 ~ 375까지 점차적으로 변경해주면 된다



애니메이션 블루프린트의 이벤트 그래프에서 위에서 사용된 Speed 변수의 값을 점차적으로 증가하거나 감소하면 된다



캐릭터에 애니메이션 블루프린트를 설정한다


Posted by cwisky