profile image

L o a d i n g . . .

반응형

https://www.youtube.com/watch?v=gHdwOiR0D0A

 

 

볼륨(Volume) 이용하기

플레이어가 방에 들어가면 불이 켜지고, 방에서 나가면 불이 꺼지는 것을 구현해 보자. 이는 게임 시작 시 자동으로 점등되는 기능보다 상호작용성이 높다.

레벨 상에서 '방에 들어간다'는 시점을 정하여, 방에 들어간다는 행동의 기준을 정의해야 한다. 이러한 행동은 '볼륨'으로 정의할 수 있다.

볼륨(Volume): 3차원 공간, 무언가 진입하거나 나가는 판정을 할 수 있는 레이어가 존재함

방 안에 볼륨을 설정하면 플레이어가 볼륨에 들어가는 것이 곧 방에 들어가는 것이고, 방에서 나올 때 역시 동일하다.

 

좌측 모드 탭 - 볼륨

이곳에 레벨에 추가할 수 있는 모든 볼륨이 준비되어 있다.

 

지금은 기본적인 볼륨으로도 충분하다.

좌측 모드 탭 - 기본 - 박스 트리거

박스 트리거, 구체 트리거는 다른 스크립트 등을 발동시킬 수 있는 오버랩 이벤트를 만들 때 사용한다. 

박스 트리거를 레벨로 끌어, 방 중앙 정도에 위치하게끔 배치한다.

 

이제 박스 트리거의 크기를 조정할 것이다. 그전에 문이 달린 앞쪽 벽을 클릭하고, 우측 월드 아웃라이너 탭에서 눈 버튼을 눌러 잠시 숨겨 놓는다.

 

R키를 눌러 스케일 조절 모드로 전환한다. 이때 축 가운데의 하얀 네모를 누르면 축 전체가 선택되고, 드래그 시 모든 축 방향으로 크기가 변한다.

 

이를 이용하여 가로 벽에 딱 맞게끔 박스 트리거의 사이즈를 적당히 조절한다.

 

이동 툴을 이용하여 다시금 박스 트리거의 위치를 조절해 준다. 상단에서 Y축 스케일 조절을 알맞게 설정했다면, Z축 위치만 위로 띄워서 적당히 조절해 주면 된다.

 

월드 아웃라이너 탭에서 문이 달린 벽의 숨김 상태를 해제한다. 이제 블루프린트 작업을 시작하자.

 

레벨 블루프린트 구현 - 점등과 소등

월드 아웃라이너에서 TriggerBox를 선택하고, 이 상태에서 레벨 블루프린트를 연다.

 

현재는 BeginPlay 이벤트로 Toggle Visibility를 작동시키고 있으며, Toggle Visibility 노드를 호출하여 스크립트를 사용하고 있다. 이번에는 BeginPlay가 아닌, 오버랩 이벤트로 Toggle Visibility를 호출할 것이다.

 

전편에서 다뤘던 것처럼, 현재 TriggerBox가 레벨에서 선택되어 있는 상태에서 레벨 블루프린트 내 우클릭을 하게 되면 TriggerBox 관련 선택지들이 맨 위에 표시된다. '이벤트 추가' 항목 옆의 삼각형을 눌러서 추가 선택지를 열고, Collision 메뉴를 연다.

Collision: 충돌 가능한 모든 오브젝트는 오브젝트 타입과 일련의 반응들을 통해 다른 모든 오브젝트 유형과 어떻게 상호작용하는지를 정의함, 즉, 월드 내 오브젝트와의 충돌 시점을 정할 때 사용

Collision > On Actor Begin Overlap 추가

 

OnActorBeginOverlap 노드와 BeginPlay 이벤트 노드를 비교해 보자. 이렇게 창 상부가 빨간 노드는 이벤트 노드다. Toggle Visibility 노드의 경우, 푸른색 창에 f자가 표시되어 있다. 이는 함수 노드라는 것을 뜻한다. 이렇듯 블루프린트에서 무슨 일이 일어나고 있는지 한눈에 봐도 구분하기 쉽게끔 노드에 시각적 특징을 넣었다.

 

BeginPlay 이벤트 노드 선택 > 삭제

OnActorBeginOverlap 노드 선택 > 좌클릭 드래그로 위쪽 옮김 > 실행부에서 드래그를 해서 Toggle Visibility 연결

연결이 완료되었으면, 블루프린트 창 상단 메뉴의 컴파일을 눌러 주자.

Other Actor: 트리거를 오버랩할 수 있는 액터 지정, 특정 유형의 액터만이 Toggle Visibility를 발동시킬 수 있게 지정(ex: 플레이어가 발사하는 투사체가 있을 경우, 투사체를 발사할 때마다 생성되는 액터로 트리거가 발동하게끔 설정)

 

테스트하기 전, 플레이어의 시작 지점을 방 밖으로 이동한다. 테스트를 해 보면 플레이어가 방 안으로 들어가면 불이 켜지는 걸 확인할 수 있다. 방을 나오는 경우에는 아직 스크립트를 구현하지 않아, 불은 그대로 켜져 있을 것이다. 그 상태에서 다시 방에 들어갔을 때는 액터가 Toggle Visibility를 호출하기 때문에 라이트가 다시 꺼지게 된다.

 

 

월드 아웃라이너 탭에서 TriggerBox를 선택한다.

블루프린트 창에서 오른쪽 버튼 > 이벤트 추가 > Collision > On Actor End Overlap 추가

 

OnActorEndOverlap 노드 또한 실행 핀을 드래그하여 ToggleVisibility 노드에 연결한다. 

두 노드를 모두 ToggleVisibility 노드에 연결할 수 있는 이유는 두 노드의 오버랩하는 시점이 절대 겹치지 않기 때문이다. 방에 들어가면 OnActorBegin 노드가 Toggle Visibility를 호출하고, 방에서 나오면 OnActorEnd 노드가 Toggle Visibility를 호출하게 된다.

UE4의 블루프린트는 원하는 순서대로 직관적이고 순차적이게끔 명령을 실행할 수 있다. 블루프린트로 작업하는 대다수의 스크립트는 대부분 순차적으로 발동하니, 결국 각 노드는 대부분 배치한 순서대로 발동하게 된다. (ㅁ->ㅁ->ㅁ)

테스트를 해 보자. 방에 들어가면 라이트가 켜지고, 방에서 나오면 라이트가 꺼지는 것을 확인할 수 있다.

 

레벨 블루프린트 구현 - 딜레이

OnActorBeginOverlap 노드의 실행 핀에서 빈 그래프 공간으로 드래그를 하면 '새 노드를 배치합니다'라는 문구가 뜨는데, 그때 클릭을 뗀다.

 

delay 검색 > Flow Control > Delay

Retriggerable Delay는 보다 복잡한 블루프린트에 적절하다. Delay 옆에 있는 f 아이콘이 함수임을 나타내고 있다.

 

Delay를 추가하면 다음과 같이 변한다. 노드를 추가해 줄 뿐만 아니라, Toggle Visibility 노드에 자동으로 연결해 준다. 블루프린트가 두 노드 사이에 함수 노드가 추가되는 것을 알고, 자동으로 알맞은 자리에 노드를 배치해 주는 것이다. 

Delay 함수 노드의 Duration을 0.5초 정도로 수정한다. 이는 플레이어가 Trigger Box에 들어가게 되면, 0.5초의 간격을 두었다가 라이트가 켜지게 되는 것이다.

 

OnActorEnd 노드에도 같은 작업을 해 준다. Delay 노드를 선택하고, Ctrl+C를 눌러 복사한다. 그리고 빈 공간을 클릭하여 Ctrl+V를 눌러 붙여 넣는다. 이처럼 블루프린트 내에서도 노드의 복사, 붙여넣기 기능을 사용할 수 있다. 마지막으로 각 실행 핀을 연결해 준다.

컴파일 후 테스트해 본다.

 

레벨 블루프린트레벨 하나의 스크립트를 구성하는 데 좋은 툴이다. 그러나 다양한 레벨에서 작동하는 스크립트를 만들려면 클래스 블루프린트를 사용하는 것이 좋다.

레벨 블루프린트에서 만든 블루프린트는 해당 레벨에서만 효력을 발휘하기 때문에, 우리가 만들어 본 방의 볼륨이나 라이트 관련 스크립트를 다른 레벨로 복사하고 싶다면 관련 애셋까지 전부 복사해 주어야 한다. 그 작업을 일일히 할 수도 있지만, 적용하고 싶은 레벨에 드래그해서 바로바로 활용하는 편이 낫다. 

반응형
복사했습니다!