클래스 블루프린트
이번에는 플레이어가 Trigger Volume에 들어갔을 때 라이트가 자동으로 켜지지 않고, 특정 버튼을 눌러야 켜지는 기능을 구현할 것이다.
지금까지는 Light_BP를 콘텐츠 브라우저에서 더블클릭해 열었지만, 레벨 상에서 해당 블루프린트의 애셋을 선택한 후 우측 디테일 창에서 '블루프린트 편집' 버튼을 누르면 드롭다운 메뉴가 표시된다. 여기서 '블루프린트 에디터 열기'를 클릭하면 동일하게 클래스 블루프린트 에디터가 뜬다.
'스크립트 추가 또는 편집'은 해당 애셋에 대한 블루프린트 에디터를 열어 이벤트 그래프를 표시해 준다. 둘 중 어떤 기능을 선택해도 상관없다.
아니면 위쪽 메인 툴바의 '블루프린트'를 클릭해도 된다. '블루프린트 클래스 열기...'에서 Light_BP를 선택한다.
유효한 버튼 입력 구현
일단 플레이어들은 Trigger Volume 내에 있을 때만 유효한 버튼 입력을 할 수 있다. 그러니 우선 BeginOverlap 노드와 EndOverlap 노드부터 작업해서 플레이어가 현재 볼륨 내에 있으니 버튼 입력이 가능하다고 알리는 기능을 만들어 보자.
기존 노드의 연결을 끊어 준다. Toggle Visibility의 실행핀에 Alt키를 누르고 마우스를 가져가 보자. 그러면 현재 연결돼 있는 두 선에 하이라이트 효과가 나타난다. 이 상태에서 좌클릭을 하면 모든 연결이 끊어진다.
좌클릭 후 드래그를 통해 Spot Light와 Toggle Visibility 노드를 동시에 선택한다. 그리고 End Overlap의 하단으로 치워 놓는다. Overlap 노드부터 집중해서 작업하겠다.
플레이어가 볼륨에 접근했다는 것을 파악하고, 라이트를 켜고 끌 수 있는 입력을 허락할 수 있다. 이를 위한 레퍼런스도 Get 노드도 없으니 새 노드를 하나 만들어 보자. 볼륨 접근과 관련된 노드이니 Begin Overlap 노드의 실행핀에서 드래그하여 만든다. 특정 키를 입력할 경우, 그에 따른 기능을 넣고 싶은 것이기 때문에 input을 검색해 본다.
Head Mounted DIsplay 등 상단에 있는 카테고리들은 좌측 삼각형▷을 클릭하여 닫도록 한다. 우리가 사용할 것은 Enable Input이다. Player Controller, 즉 플레이어가 게임 속에서 조종하는 캐릭터 등의 액터로 플레이어의 입력을 전달한다는 뜻이다.
Begin Overlap 실행핀에서 드래그 > input 검색 > Enable Input 선택
새 노드가 생긴 것을 확인할 수 있다. 이 노드의 타겟은 액터다. 현재는 기본값인 self(해당 블루프린트 자체)로 지정되어 있다. Enable Input의 Player Controller에서 역방향(←)으로 드래그하여 Player Controller를 찾는다. Create 함수를 쓸 필요는 없고, Get Player Controller 함수를 사용하여 특정 Player Index에 Player Controller 레퍼런스를 받아오게끔 한다.
만약 멀티 플레이를 구현하는 상황이라면 보다 어렵고 복잡할 수 있지만, Player Index는 숫자 0부터 각 인원을 파악하기 때문에 Player Index 0이라고 하면 곧 1번 플레이어를 의미한다. 따라서 싱글 플레이에서 0번은 플레이어 본인을 뜻하는 것이며, 이 노드는 플레이어에게 입력을 허가하는 Player Controller를 반환할 것이다.
End Overlap 노드도 역시 실행핀에서 드래그를 해서 Input을 검색한다. 이번에는 Disable Input을 선택한다.
End Overlap 실행핀에서 드래그 > input 검색 > Disable Input 선택
이 노드 역시 Player Controller의 레퍼런스를 요구하고, 타겟을 self로 설정하고 있다. 해당 레퍼런스로는 현재 생성해 놓은 Player Controller 노드를 사용하겠다. Get Player Controller 노드의 Return Value 핀과 Disable Input 노드의 Player Controller 핀을 연결한다.
이제 볼륨에 들어간 플레이어에게 입력 설정을 해 줄 수 있다. 아래로 옮겨 두었던 Toggle Visibility 노드로 가서, 플레이어가 키를 눌러 라이트를 제어할 수 있게 처리하겠다. 그래프 상에 우클릭 후, 검색창에서 F를 검색한다. 키보드 이벤트 카테고리의 F를 클릭하여 추가한다. 찾기 힘들 때는 '키보드 F'라고 검색하면 나온다.
그래프에서 우클릭 > 'F' 또는 '키보드 F' 검색 > F 선택
생성된 노드에는 Pressed 핀과 Released 핀이 존재한다. 여기서 사용할 것은 Pressed 핀이다. Pressed 핀과 Toggle Visibility 노드의 실행 핀을 연결해 준다.
컴파일 후 저장하고, 플레이 버튼을 눌러 테스트해 본다. 볼륨에 접근해서 F를 누르면 라이트의 점등/소등 기능이 작동하며, 볼륨 밖에서 F를 누르면 아무런 일이 일어나지 않는다.
또한 집 뒤쪽에 배치했었던 라이트에 가까이 가서 F를 눌러도 동일하게 작동하는 것을 확인할 수 있다. 하지만 이쪽 인스턴스가 그래프 상에서 별다른 반응을 나타내지 않는 이유는 현재 켜져 있는 이벤트 그래프가 뒤쪽의 인스턴스를 보여 주는 것이 아니기 때문이다. Shift + F1 키를 눌러 주면, 마우스 컨트롤이 가능하다. 클래스 블루프린트 에디터 상단 메뉴에서 플레이 우측의 Light_BP를 클릭하면 디버그 오브젝트를 변경할 수 있다. 이를 Light_BP2로 설정하고, 뒤쪽 라이트에 가면 해당 인스턴스에 대한 디버깅을 할 수 있다.
안내 문구 표시하기
이제 남은 건 HelpfulText를 처리해 주는 것뿐이다. 컴포넌트 탭에서 HelpfulText를 선택하고, 좌클릭 드래그를 통해 그래프 상에 배치한다. HelpfulText 역시 볼륨 접근에 따른 Visibility만 조정해 주면 된다. HelpfulText 노드에서 좌클릭 드래그를 한 후, Toggle Visibility를 찾는다.
이제 Trigger Volume에 접근하면 Enable Input이 발동하고, 이는 다시 Helpful Text의 Toggle Visibility까지 발동시켜야 한다. 따라서 Enable Input과 Toggle Visibility 노드를 연결한다.
반면에 Trigger Volume에서 멀어져서 텍스트가 사라지는 경우에는 역시 EndOverlap에서 Disable Input 노드를 거쳐 Toggle Visibility를 호출하게 된다. 따라서 Disable Input 역시 Toggle Visibility 노드와 연결한다.
컴파일 후 저장한다. 그리고 에디터에서 플레이를 눌러 테스트해 보자.
블루프린트의 정리, '코멘트' 기능
마지막으로 블루프린트를 깔끔하게 정리하는 법에 대해서 알아보겠다. F키와 관련된 노드를 제외하고, 그 위에 있는 노드들을 왼쪽 위부터 쭉 드래그하여 모두 선택한다. 그리고 키보드의 C키를 누르면 코멘트 창으로 묶여진다.
코멘트 창은 해당 노드들이 어떤 역할을 하는지 가리키는 것이다. 우측의 디테일 탭에서 원하는 코멘트 색을 지정할 수 있다. 화면을 축소했을 때, 말풍선을 볼 것인지 말 것인지 선택할 수도 있다. 또한 코멘트 박스를 그룹으로 묶어 전체를 이동할 수 있게끔 할 수 있다.