Billiard/Decal2017. 10. 1. 08:11

언리얼 엔진에서 지원하는 Decal을 블루프린트를 이용하여 원하는 Actor 위에 보여주는 방법


https://answers.unrealengine.com/questions/2184/how-to-make-a-decal-and-spawn-it.html


To spawn the decal you can use either "Spawn Decal At Location" (for non-moving objects like wall) or "Spawn Decal Attached" (for moving objects like a vehicle). 


당구공의 표면에 적색의 점을 표현하는 Decal을 생성하고 블루프린트에서 사용하는 예


CB에서 마우스 우측 > 머티리얼 > M_Decal_Red_Dot 등의 이름을 지정한다

더블클릭하여 머티리얼 에디터를 열고 왼쪽 아래의 [디테일] 뷰 / Material/Material Domain : Defered Decal 선택


사용할 텍스쳐가 알파채널을 가진 PNG 파일이라면 Blend Mode : Translucent 으로 설정한다


텍스쳐로 사용할 이미지를 CB에서 드래그하여 머티리얼 그래프에 놓고 RGB 핀을 [베이스 컬러] 핀에 연결한다




BP_Ball 클래스의 [이벤트 그래프]에서 다음과 같이 로직을 구성하고 게임을 실행하여 G 키를 누르면 플레이어 카메라가 바라보는 공의 정면에 위에서 준비한 Decal이 나타난다



마우스로 클릭된 액터의 표면에 데칼을 출력하는 예


ConvertMouseLocationToWorldSpace 노드는 마우스 커서의 2차원 좌표를 3차원 공간의 위치로 변환해준다. 그러나 그 위치는 마우스가 올려진 특정 액터의 표면 위치가 아닌 현재 영상이 보여지는 카메라의 표면의 위치에 해당하므로 마우스 커서 아래의 액터의 표면의 월드좌표를 구하려면 ConvertMouseLocationToWorldSpace 노드의 WorldLocation 핀과 WorldDirection을 사용하여 LineTraceByChannel 을 이용하여 라인이 충돌한 위치를 얻으면 된다

쉽게 표현하자면 ConvertMouseLocationToWorldSpace노드를 통해 얻은 마우스 커서의 월드좌표는 그 어떤 액터의 좌표를 의미하지 않고 모든 액터로부터 이격된 곳에 있는 카메라 렌즈상의 마우스 위치가 월드좌료로 리턴된다. 


당구공을 마우스로 클릭하여 당점을 설정할 때 클릭된 당구공의 표면 월드좌료를 저장했다가 당구공에 충격을 가할 때 그 위치에 가하면(Add Impluse At Location) 당구공이 이동하면서 회전하는 효과를 낼 수 있다.


위의 그림에서 LineTraceByChannel 노드의 Ignore Self 항목에 체크를 해제해야 공 자신에게도 라인이 그려진다.


Decal을 그릴 때 적절히 회전하여 그리는 방법

Decal이 그려지는 위치는 LineTraceByChannel 을 통해 구할 수 있고 Decal이 그려질 때 액터 상의 그려지는 방향에 따라서 Decal도 적절히 회전하여 그려줘야 Decal의 정면이 보여진다. 


간단한 벡터의 연산을 통해 Decal의 회전량을 구하는 방법은 아래의 내용을 참고하면 된다. 레벨 블루프린트를 이용한 경우이다


Posted by cwisky

애니메이션 블루프린트를 사용하면 State Machine을 활용하여 상태에 따른 애니메이션을 실행할 수 있고 각 상태 간의 전환 규칙도 간편하게 작성 및 관리할 수가 있다. Play Animation 노드를 사용할 때 보다 자연스러운 애니메이션이 가능하고 로직으로부터 애니메이션 관리기능을 분리할 수 있는 장점을 갖는다


애니메이션 블루프린트를 생성하고 사용하는 절차는 다음과 같다

Animation Blueprint 생성

Animation Blueprint를 생성하고 State Machine을 사용하여 상태에 따른 애니메이션을 지정하고 상태간의 전환규칙(Transition Rules)을 정의한다


캐릭터 클래스 생성 ( Character를 상속한 클래스 블루프린트 생성 )

Character 클래스를 상속하여 클래스 블루프린트를 생성하고 컴포넌트 패널의 Mesh 컴포넌트로 애니메이션이 속한 스켈레탈 메시(Skeletal Mesh)를 선택한다


캐릭터 클래스에 애니메이션 블루프린트 적용

캐릭터 클래스의 Mesh 컴포넌트를 선택하고 우측 [디테일] 뷰 / Animation / Animation Mode : Use Animation Blueprint 선택


캐릭터 클래스를 CB에서 뷰포트로 드래그하고 실행


1. Animation Blueprint 생성

CB에서 마우스 우측 > 애니메이션 > 애니메이션 블루프린트 > 설정창이 뜬다

부모 클래스 : AnimInstance

타겟 스켈레톤 : 애니메이션이 속한 스켈레톤을 선택


애님그래프 탭을 누르고 그래프 바탕에서 마우스 우측을 눌러 [스테이트머신 추가]를 선택하여 스테이트 머신을 생성하고 디폴트로 생성된 [Result] 노드와 연결해준다


생성된 스테이트 머신을 더블클릭하고 [Entry] 노드에서 드래그하여 놓고 새로운 상태를 생성하고 각 상태를 더블클릭하여 실행할 애니메이션을 우측 [Browse Assets] 패널에서 드래그하여 지정한다. 혹은 애니메이션을 드래그하여 상태 노드위에 놓으면 자동으로 애니메이션이 연결된다




애니메이션 노드를 선택하고 우측 [디테일]뷰에서 Loop Animation 항목에 체크 여부를 고려한다




상태 간의 전환규칙(Transition Rules)을 정의한다

상태 간의 전환규칙은 캐릭터의 상태에 따르는 경우가 대부분이므로 캐릭터의 참조를 구하고 캐릭터 클래스의 상태관련 변수의 값을 참조하여 애니메이션 상태 전환의 기준으로 사용하면 된다




이벤트 그래프 탭을 누르고 캐릭터의 참조를 구하고 캐릭터 클래스의 상태 변수 값을 애니메이션 블루프린트 클래스의 변수 값에 할당한다. 이 값은 각 상태의 전환규칙을 정의할 때 사용될 수 있다


주의 : Animation Blueprint 에서는 Get AI Controller 노드가 제대로 작동하지 않으므로 콘트롤러를 구하려면 Try Get Pawn Owner -> Get Controller 방법을 사용해야 한다

아래의 예에서는 Try Get Pawn Owner 노드를 사용하여 애니메이션이 적용되는 Pawn 의 참조를 구하고 있다




2. 캐릭터 클래스 생성

애니메이션이 속한 스켈레톤을 메시 컴포넌트로 포함하는 클래스 블루프린트를 생성한다. 이 때 부모 클래스를 Character으로 지정한다

스켈레톤에 소켓을 추가하면 스켈레탈 메시를 포함하는 클래스 블루프린트에서 소켓에 무기 등을 연결해 줄 수 있다.

[디테일] 뷰 / Mesh / Skeletal Mesh : 애니메이션이 속한 스켈레탈 메시 지정

[디테일] 뷰 / Animation / Animation Mode : Use Animation Blueprint 선택

Anim Class : 위에서 작성된 애니메이션 블루프린트 이름을 선택


혹은 캐릭터 클래스를 새로 생성하지 않고 ThirdPersonCharacter 캐릭터를 복제하여 [디테일]뷰/Animation/Animation Mode : Use Animation Blueprint, 와 Anim Class : 애니메이션 블루프린트 이름을 선택하면 된다


커스텀 캐릭터가 사용되기 위해서는 언리얼 레벨 에디터의 [디테일]뷰/GameMode/Default Pawn Class에 등록해야 한다


이렇게 설정하면 현재 캐릭터 클래스에서는 지정한 애니메이션 블루프린트가 사용된다




캐릭터 클래스의 [이벤트 그래프]에는 다음과 같이 애니메이션 블루프린트와 통신하기 위한 상태변수(CurrState)가 선언되어 캐릭터의 상태를 애니메이션 블루프린트에 전달하는 역할을 하게 된다. 여기서는 캐릭터의 CurrState 변수의 값을 애니메이션 블루프린트의 [이벤트 그래프] 탭에 작성된 내용에서 참조하고 있다 그러므로 캐릭터 클래스에서는 애니메이션을 직접 호출하거나 실행하는 것이 아니라 상태변수의 값만 변경해주면 현재 캐릭터에 등록된 애니메이션 블루프린트에서 자동으로 상태 값을 확인하여 상태에 연결된 애니메이션이 실행되는 구조이다



AI 캐릭터가 총에 맞았을 때 쓰러지는 애니메이션을 실행하는 경우


AI 캐릭터가 총소리를 들었을 때 그 방향으로 돌아서는 경우


위에서 사용된 TimeLine 노드의 그래프




3. 캐릭터 클래스를 CB로부터 뷰포트에 드래그하 놓고 게임을 실행하여 상태전한에 따른 각 애니메이션이 적절히 실행되는지 확인한다




Posted by cwisky

언리얼 엔진에서 Pawn Noise Emitter 컴포넌트의 Make Noise 노드를 사용하면 AI 캐릭터가 Pawn Sensing 컴포넌트의 On Hear Noise 이벤트를 이용하여 반응하게 할 수 있다


노이즈 생성 ( 일인칭 캐릭터의 블루프린트 )



위의 Loudness 값은 0.0 ~ 1.0 사이의 값으로 AI Pawn Sensing 컴포넌트의 HearingThreshold.속성으로 설정된 영역에 직접적으로 영향을 미친다. 즉 Loudness를 1.0으로 한다면 On Hear Noise 이벤트에 전달되는 Volumn 값도 1.0이라는 의미이다. 단, AI의 HearingThreshold로 지정한 영역 내에만 적용된다


노이즈 청취 ( AI 캐릭터의 블루프린트 )



AI 캐릭터가 소리가 나는 방향으로 자세를 회전하는 예


Posted by cwisky