발판 만들기
충돌 감지
발판과 누르는 애니메이션을 만들어볼 것이다! 후에 문과 연결할 생각에 신이 난다 ㅎ_ㅎ
발판을 만들기 위해 아까와 같이 새 블루프린트(Actor)를 생성해주었다.
Frame과 Platform 메쉬를 모두 끌고 온 후, Frame을 루트로 만들어주었다.
발판과 물체가 닿으면, 발판이 눌러져야 하기 때문에 Box Collision을 추가하고 크기를 잡았다. 트리거로 할 예정이다.
아까와 같이 BeginOverlap, EndOverlap 이벤트를 사용해주었다. 이벤트 그래프에서는 각 객체에 대한 함수도 같은 곳에서 액세스할 수 있는 게 신기했다. PressurePlate뿐만 아니라, Frame이나 Box나 Platform이나 이런 자식들... C++ 스크립트는 어떻게 접근하는지 궁금했다.
시험삼아 각 이벤트에 Print String을 연결해주었더니 잘 작동되는 모습이다!
애니메이션 (Timeline)
발판을 누르고 떼는 애니메이션을 만들기 위해 새 Timeline 노드를 만들어주었다.
타임라인 에디터 안으로 들어가서...
Length를 0.5로 설정하고 Float Track이라는 것을 추가했다.
키를 두 개 추가해서 0초에 0, 0.5초에 1인 그래프를 만들었다. 시간이 지날수록 값이 증가하는 1차 함수이다.
다시 이벤트 그래프로 돌아와서 로직을 짜주었다.
타임라인을 건드릴 때부터, 반대쪽 애니메이션은 안 하는지 걱정이 들었는데, 괜한 걱정이었다. Timeline에 Reverse라는 좋은 속성이 있었다!
PlateMovement는 우상향이므로 발판을 누를 때는 계속 업데이트되는 Plate Movement * -10을 상대 좌표의 Z로 설정한다. 음수를 곱하면 우하향 그래프가 되기 때문에 0.5초 동안 Z값이 0부터 -10으로 내려간다. 발판을 뗄 때는 Reverse 속성이므로 그와 반대로 -10에서부터 0으로 올라간다.
상대 좌표가 바뀜에 따라 애니메이션이 잘 적용되는 것을 볼 수 있었다.
문 만들기
앵커 설치
상대 위치를 (0,0,0)으로 유지하기 위해 Scene 컴포넌트를 앵커로 놓아줄 예정이다.
추가한 Scene을 적절한 위치에 놓고 문의 부모로 설정해주었다. 그리고 문의 상대좌표를 (0, 0, 0)으로 해주면
문이 딱 맞는다~ 부모 오브젝트와 자식 오브젝트, 그 사이의 상대 좌표를 이용하는 트릭은 Unity에서도 정말 많이 해봤기에 고향집에 온 듯 익숙했다. 반대쪽도 똑같이 한 다음, Z축 회전을 180도 돌려주었다.
여닫는 애니메이션을 만들기 좋은 구성이 완성되었다 ^__^
애니메이션 (Timeline)
애니메이션을 실행하기 위해 이벤트 그래프로 향했다.
문을 열 때 실행되는 이벤트, 닫을 때 실행되는 이벤트. 그리고 애니메이션이 있는 DoorAnimation 타임라인이 있다. 아까 발판 애니메이션과 비슷한 구성이다.
발판 애니메이션과 같이 (0, 0)과 (0.5, 1)의 1차 함수로 만들어주었는데, 두 키를 모두 선택해 우클릭한 뒤 Linear에서 Break로 바꿔주었다.
곡선이 되었다~ 찌부가 된 탄젠트 모양이다.
핸들을 낮춰서 경사가 있는 커브를 만들었다. 애니메이션이 조금 더 재미있게 나올 듯하다.
머티리얼도 바꾸고 애니메이션 실험도 해봤다. 중간에 속도를 조금 더 올려서 열리는 게 마음에 든다!
발판-문 상호작용
ActorComponent
발판을 밟으면, 문이 열리도록 상호작용을 하기 위해서 소유한 컴포넌트를 사용하는 방식을 채택했다. Actor Component라는 것을 만들어주었다.
내용만 보면 아무 액터에나 붙일 수 있는 컴포넌트 같은데... 어떻게 쓰는 걸까?
에디터를 열어보았다. 어떠한 뷰포트도, 컴포넌트도 보이지 않는다! 이게 내가 처음에 상상했던 블루프린트의 모습이었다. 그저 비주얼 스크립팅뿐인 기능!
블루프린트가 비주얼 스크립팅뿐만이 아니라는 건 강의를 들으며 익히 알고 있었던 사실. 내가 강의를 듣기 전 착각하던 기능의 이름을 Actor Component라고 하는구나.
두 개의 커스텀 이벤트를 만들어주었다.
이 이벤트가 일어났음을 월드에 알리기 위하여 Event Dispatcher라는 것도 추가해주었다.
새로 만든 Event Dispathcer에 bool형 Input 값을 하나 넣어주었다. 아직 나오지는 않았지만, 발판을 눌렀을 때는 true, 그렇지 않다면 false를 입력하는 것 같다.
로직은 예상과 맞게 Start일 때는 On을 체크해서 이벤트 발생을 알려주고 Stop일 때는 On을 해제해서 이벤트 발생을 알려준다.
이벤트 호출 (발판)
발판에 연결하기 위해 방금 만든 Actor Componenet를 붙여주었다.
충돌하기 시작했을 때는 Start Interaction 이벤트를 호출한 다음 애니메이션이 실행되도록 설정했다. 충돌이 끝났을 때도 마찬가지로, Stop Interaction 이벤트를 호출한 다음 애니메이션이 Reverse 돼서 실행되도록 설정했다.
이벤트 구독 (문)
호출한 이벤트를 문이 구독하는 구조이므로 아까 만든 문 블루프린트에 갔다.
Actor(Object Reference)형 변수로 Trigger라는 변수를 만들어주었다. 이벤트를 트리거하는 액터를 가지고 있는 변수인 것 같다. 후에 레벨에서 발판을 넣어줄 것이므로 눈 아이콘을 켜준다.
안전한 Get 형태의 변수를 그래프로 끌고 왔다. 좋은 기능인 듯하다!
그리고 해당 Actor에 있는 BP_Interaction 상호작용 컴포넌트를 가져오는 로직을 만들었다. GetComponent라니! 익숙한 이름이라 기분이 좋았다.
발판의 OnInteract 이벤트를 구독하는 새 Custom Event를 만들었다. On이 True이면 문을 열고 그렇지 않으면 문을 닫는다.
이쯤 되니 이벤트와 함수에 대해 혼동이 오기 시작한다! 찾아봤다. 아래 링크에서 찾을 수 있었다.
함수는 알다시피 시간을 조작할 수 없고 지역 변수를 만들 수 있으며 반환값을 만들 수 있다. 이벤트는 멀티 플레이어 게임일 대 복제가 가능(?)하다고 하며 비동기식이라고 한다. 복제가 가능하다는 건 감이 잘 안 온다...
레벨로 돌아간 다음, 문에 있는 Trigger 변수를 발판으로 설정해주었다. 이제 실행해볼 것이다!
발판을 누르면 문이 잘 열리고 떼면 잘 닫히는 것을 볼 수 있다! 블루프린트끼리 이벤트를 주고받는 것을 만들다니... 근사하다!
'Unreal' 카테고리의 다른 글
[공부일지][3일차] <Your First Game In UE5> End (0) | 2023.01.24 |
---|---|
[공부일지][3일차] <Your First Game In UE5> 4 (0) | 2023.01.24 |
[공부일지][2일차] <Your First Game In UE5> 3 (0) | 2023.01.23 |
[공부일지][2일차] <Your First Game In UE5> 2 (1) | 2023.01.23 |
[공부일지][1일차] <Your First Game In UE5> 1 (1) | 2023.01.22 |