본문 바로가기

[언리얼 엔진 4.7] 블루프린트 퀵샷 - 07. 인터렉션 추가 ( 상호작용 ) 본문

Tool/Unreal Engine 4

[언리얼 엔진 4.7] 블루프린트 퀵샷 - 07. 인터렉션 추가 ( 상호작용 )

블로그 디렉터 2019. 1. 15. 05:39

언리얼 엔진 공식 유튜브 튜토리얼 시리즈 [ https://youtu.be/4jZT9ibp_ko ] 학습 후 필기 복습

추가 [ https://docs.unrealengine.com/ko-KR/Engine/Blueprints/UserGuide/Types/Interface/UsingInterfaces ]



StarterContents - Blueprints - Blueprint_CeilingLight 를 플레이어가 바라본 상태에서 버튼을 누르면 불을 끌 수 있는 기능을 구현해보려고 한다.

Blueprint_CeilingLight 를 레벨에 드래그 앤 드롭하고, 클래스 블루프린트 이벤트 그래프에서 Custom Event 노드를 추가하고 ToggleLight 로 이름을 변경해준다.

Custom Event 노드는 블루프린트 외부에서 블루프린트 내에 구성한 스크립트를 호출하는 기능을 하게 된다.



좌측의 My Blueprint 패널의 변수에서 PointLight1 을 불러와 Set Intensity 노드와 연결한 다음 컴파일하고 닫아준다.


FristPersonBP - Blueprint - FirstPersonCharacter 블루프린트를 열어 여백의 이벤트 그래프에서 키보드 이벤트 F 노드를 불러온다.

My Blueprint 패널 변수에서 My Character 를 클릭해 탭을 열면 FirstPersonCamera 변수가 있는데, 이 변수를 플레이어의 1인칭 시점을 나타내는 변수이다.


Line Trace by Channel 노드는 게임 속에서 시작점으로부터 목표점까지 보이지 않는 선을 발사하고 이 선이 뭔가에 닿으면 무엇에 닿았는지 정보를 반환하는 노드로, 불러와준다.

Line Trace by Channel 노드와 F 노드의 실행핀을 연결해주고, First Person Camera 변수의 핀은 게임 내 위치를 구하는 Get World Location 노드를 불러와 연결해준다.


First Person Camera 변수의 핀을 하나 더 드래그해 Get Forward Vector 노드를 불러와 카메라 전방의 벡터값을 구해준다.

Get Forward Vector 노드의 Return Value 핀을 다시 드래그해 Vector * Float 노드를 불러와 5000 을 입력하여, 전방 5000 까지 발사될 수 있도록 해준다.



이미지와 같이 Get World Location 의 Return ( 노드의 오른쪽 핀 ) 핀을 하나 더 드래그해 Vector + Vector 노드를 불러오고, Vector * Float 노드의 Return 벡터값과 연결한 다음, Line Trace by Channel 노드의 End 핀과 연결해준다.


Line Trace by Channel 노드의 핀 중 DrawDebug Type 항목을 보면 기본 None 으로 되어있는데, 이를 Persistent 로 변경해주고 컴파일한다.



동영상 강좌도 헷깔리게 쓰여있어서 그림으로 그려서 이해해 보려고 했다.

Get World Location 노드로 월드 내의 위치를 규정하기 이전의 Vector 들은 상대적인 위치 값이기 때문에 더해주었을때 적용된다.

( 게임 배틀그라운드는 총을 쏠때 탄도학을 반영하는데, 이를 통해 Float 값을 응용하면 직접 총알 Mesh 를 날리는 물리적 방식을 사용하지 않고도 구현해볼 수 있겠다고 추측해본다. )



플레이를 누르고 F 키를 누르면 이미지와 같이 선과 앞쪽에 붉은 상자가 생기게 된다. ( DrawDebug 의 Persistent - 지속성있는 설정의 영향인 것 같다. )


다시 FirstPersonCharater 이벤트 그래프로 돌아가 공백의 배경에 단축키 " B " 를 누르면 Branch ( 분기 ) 노드가 생긴다.

분기 노드는 Boolean ( 참/거짓 정보 ) 를 요구한다. ( 빨간색 Condition 핀 )

Line Trace by Channel 노드의 Return Value 핀의 툴팁을 보면 ( 마우스를 올려 도움말을 보면 ), Hit 한 경우 True 값을 내고 아닌 경우 False 를 낸다는 것을 볼 수 있다.

Return Value 핀과 Condition 핀을 연결해주면 뭔가에 Hit 했을때, 그 정보를 분기 노드 ( Branch ) 에 전달할 것이다.


Line Trace by Channel 의 Out Hit 은 ( 구조체 유형으로 ) Hit Result 핀도 포함하는데, 이 구조체는 다양한 정보와 변수의 집합이다.

OutHit 구조체 핀을 드래그해 Break Hit Result 노드를 불러와 연결해주면, 다양한 정보 핀을 모두 볼 수 있게 된다.



Break Hit Result 의 정보 중 필요한 것은 Actor 에 Hit 여부 정보이기 때문에, Hit Actor 핀을 드래그해 Cast to Blueprint_CellingLight 노드를 불러와 연결해준다.

그리고 Blueprint_CeilingLight 를 Hit 했을때 CeilingLight 블루프린트 이벤트 그래프 내에서 Custom Event 로 만들었던 ToggleLight 를 작동시키기 위해, As Blueprint Ceiling Light 핀을 드래그해 Toggle Light 노드를 불러와 연결해준다.



이미지와 같이 실행 핀을 연결해준다.


F 키를 눌렀을 경우 카메라가 바라보는 곳으로 선을 만든다. ( 트레이스를 시행한다. )

선이 아무데도 닿지 않으면 ( Boolean 값은 False ) 아무 일도 하지 않는다. ( Branch 노드에서 False 가 출력된다. )

선이 뭔가에 닿았고 ( Boolean 값이 True 고, Branch 의 True 실행 핀 작동 ), 그것이 Actor ( Hit Actor ) 이라면,

Actor 중 CeilingLight 라면 ( As Blueprint Ceiling Light ), ToggleLight 함수 호출

Line Trace by Channel 의 Persistent 를 다시 None 으로 설정해주고 컴파일 후 플레이해본다.




레벨에 CeilingLight 와 같은 블루프린트가 다수 있을때, 플레이어가 각각의 물체를 바라보며 같은 버튼을 누를때 각각 다른 기능을 수행하도록 만들어본다. ( FPS 게임에서 바닥이나 벽을 쐈을 때 각기 다른 자국이 남는 데에 응용할 수 있겠다고 추측해본다. )


StarterContent - Blueprints - Blueprint_WallSconce 와 모드 탭의 Empty Actor 를 레벨로 드래그 앤 드롭해준다.

Empty Actor 에는 Shape_Cube 스태틱 메시 컴포넌트를 추가하고, Blueprint / Add Script 버튼으로 클래스 블루프린트를 만들어 StarterContent - Blueprints 폴더 에 저장해준다.


CeilingLight 를 쳐다보며 F 키를 누르면 라이트의 불이 꺼지고, 벽걸이 라이트를 보며 F 키를 누르면 벽걸이 라이트가 아예 사라져 버리며, 육면체를 바라보며 같은 키를 누르면 육면체가 Z 축 방향으로 공중으로 올라가게 설정하려고 한다.



콘텐츠 브라우저에서 우클릭 후 Blueprints - Blueprint Interface 를 선택하여 블루프린트 인터페이스를 만들어주고 PlayerInterface 로 이름을 변경해준다.

블루프린트 인터페이스를 더블클릭해 들어가면 블루프린트 이벤트 그래프와 비슷한 화면이 뜨고, 창 우측 상단의 My Blueprint 패널에서 함수를 만들어달라는 요청을 하는 것을 볼 수 있다.

Looking At 이라는 이름으로 함수를 만들고 컴파일해준다. ( 하단의 디테일 패널의 Input 과 Output 으로 작업을 보다 깔끔하게 만들수도 있지만, 기능 설명을 위한 영상이기 때문에 넘어간다고 한다. )



Blueprint_Ceiling 이벤트 그래프로 들어가 Toggle Light 노드를 지워주고 창 상단 툴바의 Class Settings 를 누른 다음, 디테일 패널 Interfaces 항목의 Add 버튼으로 PlayerInterface 플레이어 인터페이스를 추가해준다.

그래프에서 우클릭 후 Event Looking At 을 검색해 ( 플레이어 인터페이스 안에서 추가했던 Looking At 함수를 불러온 것이다. ) 추가해주면, 노드 우측 상단에 인터페이스 이벤트라는 것을 표시하는 아이콘과 함께 노드가 생기게 된다.

Event Looking At 노드와 Set Intensity 노드의 실행핀을 연결하고 컴파일해준다.


FirstPersonCharacter 블루프린트 이벤트 그래프의 Blueprint_CeilingLight 와 Toggle Light 노드를 지워준다.



역시 Class Setting - Interfaces - Add - PlayerInterface 로 인터페이스를 추가하고 이벤트 그래프 내에서 우클릭해 Player Interface 를 찾아주는데, 이미지와 같이 Context Sensitive 의 체크박스를 해제해 Looking At (Message) 노드를 보이게 한 후 선택해준다.

이 노드에 분기 ( Branch ) 노드의 True 실행 핀과 Break Hit Result 의 Hit Actor 핀을 연결해주고 컴파일해준다.


Buleprint_WallSonce 를 선택해 이벤트 그래프로 들어가 역시 인터페이스를 추가하고, 파티클과 ( 효과 ) 함께 사라지게 설정하기 위해 컴포넌트 추가로 Particle System 을 추가한다.

Particle System 의 디테일 패널 Template 을 P_Explosion 으로 설정하고 Activation 의 Auto Activate ( 스크립트로 실행하기 위해 ) 는 꺼준다.

Particle System 변수를 Ctrl 드래그 앤 드롭하고 Activate 노드를 불러와 연결해준다.

Activate 노드의 실행 핀을 드래그해 Delay 노드를 불러와 연결해주고 Duration 은 0.2 로 설정해준다. ( 0.2 초 뒤에 액터가 사라지는 설정을 위해 )



Delay 노드의 실행핀을 드래그해 Destroy Actor 노드와 연결하고 이미지와 같이 핀이 모두 연결된 것을 확인하고 컴파일해준다.


플레이를 눌러 WallSonce 와 CeilingLight 를 쏴보면, F 버튼을 누르고 그 정면에 위치한 대상을 인식하는 노드는 전부 CeilingLight 블루프린트 안에만 작성하였지만, ( 원래 Cast - 형변환 을 대체한 ) Looking At 노드가 실행되는 조건에 Event Looking At 노드도 실행되는 것을 알 수 있다. ( WallSonce 이벤트 블루프린트에서는 Activate 노드에서 Target 에 넣은 변수 대상으로 작동 대상이 바뀌게 된다. )



Empty Actor 에 Shape Cube 스태틱 메시를 추가하고 저장했던 블루프린트의 이벤트 그래프에서도 클래스 세팅으로 블루프린트 인터페이스를 추가하고 Event Looking At 노드와 Static Mesh 변수를 Add Local Offset 노드에 이미지와 같이 연결해준다.

Add Local Offset 노드 Delta Location 의 Z 값을 50 으로 설정해주고 컴파일하면 쏠때마다 50 씩 육면체가 상승하는 것을 볼 수 있다.

Comments