오늘은 게임개발 종합반 2주 차 강의를 수강하기 시작하는 날이다. 오늘의 강의에서는 액터의 배치와 상호작용을 블루프린트로 작성하는 법에 대해서 배울 수 있었는데 선생님께서는 자동문을 만들어 보라는 숙제를 내주셨다. 한번 만들어 보자

일단은 여러 가지 방식으로 자동문을 만들 수 있다 해당 맵이 있는 레벨의 블루프린트를 통해서 만들 수 있고 아니면 직접 문의 블루프린트 클래스를 액터로 지정하여 만든 후 액터를 배정하는 방식이 있다. 나는 후자를 선택하여 만들어 보도록 하겠다.

이후 블루프린트로 들어가 액터의 모양을 결정해 주기 위해 스태틱 매시 컴포넌트를 통해서 문 모양을 찾아준 다음 설정해 주고 원하는 위치에 액터를 배치해 준다.


그다음 캐릭터가 근처에 가면 문이 자동으로 열리게끔 sphere collision을 만들어준 다음 적절하게 반경과 위치를 조절해 준다.

이제 기본적인 세팅은 끝났다. 문제는 대망의 블루프린트를 이용한 로직작성인데 천천히 자동문의 메커니즘을 생각해 보도록 하자 일단 플레이어 캐릭터가 sphere collision의 영역에 오버랩되면 작동되어 문이 자동으로 열려야 하며 해당 플레이어가 오버랩되어 있는 동안 문은 계속 열려있어야 한다. 그리고 플레이어가 해당 구역을 벗어나면 문이 다시 닫혀야 할 것이다.
해당 로직을 구현하기 위해 여러 시행착오 결과 이번 시간에 배운 타임라인을 이용한 다음의 로직을 완성할 수 있었다.

일단 begin play시 문의 위치인 start loaction 값을 현재 오브젝트 위치로 설정해 주기 위해서 get actor location을 노드를 이어준다. 그다음 sphere collision과 플레이어 캐릭터가 오버랩 됐을 때만 작동하도록 compeonent begin ovelap(sphere)와 actor end overlap 이벤트 두 개를 각각 cast to BP_Character 노드와 연결해 준 다음 문이 열려있는지 닫혀있는지를 확인할 statement 변수를 bool 형식으로 작성하여 캐릭터가 오버랩 됐을 때 true를 오버랩이 아닐 경우 false를 출력하게끔 해주었다.
그다음 event tick에 branch를 연결하여 해당 statement 값이 true이면 문이 정방향으로 열리게 false이면 문이 반대 방향으로 닫히게끔 타임라인에 연결해 준 다음 lerp(vector)를 이용하여 시작 위치 값과 종료위치 값(시작위치 + 속도벡터)을 각각 지정해 준 뒤 set actor location 노드에 연결해 주었다.
해당 로직을 생각해 내는 과정에서 처음에는 set actor location만 이용하여 작성했을 때 캐릭터가 오버랩되면 1회만 살짝 움직이고 안 움직이는 문제가 발생하였다. 그 문제를 어떻게든 해결해 보고자 생각해 보았지만 타임라인을 이용하는 게 가장 간편하고 확실하게 해결할 수 있을 거 같아 위와 같은 방식을 채택하여 자동문을 만들어 보았다. 여러 테스트 결과 캐릭터가 문 앞의 일정 거리에 걸쳐서 오버랩되면 문이 열리다 말거나 닫히다 마는 현상이 있는데 이는 차후에 복습하면서 해결해 보도록 해보겠다.
다음 시간에는 오늘 배운 콜리전에 대한 내용을 자세하게 배울 거 같다. 오늘 배운 내용을 복습해서 다음 시간에 헷갈리지 않도록 준비를 철저하게 해야 할 것 같다.
추가)
새벽에 이것 저것 고민해 보다 위에서 언급한 버그의 원인을 찾은 것 같다. set actor location을 통해서 액터가 움직일 때 오버랩을 감지하는 collision이 액터와 같이 움직이는 것이 원인인 것 같다. 해서 로직을 단순화함과 동시에 간략하게 수정한 버전은 다음과 같다.

일단 staticmesh의 하위로 할당되었던 sphere collision을 동등하게 위치하게 수정해준 후 collsion은 모빌리티 스태틱상태(고정)로 staticmesh의 모빌리티는 무버블(움직임 가능) 상태로 수정해 둔 뒤 start location 변수의 값은 staticmesh를 기준으로 세팅해 주었다. 후에 오버랩 됐을 때 그것이 플레이어 캐릭터인지 체크해 주고 오버랩때 정상적인 타임라인 플레이, 오버랩이 아닐때 리버스로 타임라인이 플레이되게 해주고 set relative locatin의 new location 값을 위해 도착지점은 위의 값처럼 시작은 start location+velocity 값으로 지정해 주고 lerp(vector)를 통해 set relative location의 new location값으로 보내준다 당연히 set relative location의 오브젝트는 static mesh로 지정해 주면 collision은 그대로 두고 static mesh만 움직이며 해당 버그가 고쳐지게 된다. 야호 꿀잠 가능!
'unreal 5기' 카테고리의 다른 글
| 250723 사전캠프 8일차 TIL 사전캠프 퀘스트 3 (1) | 2025.07.23 |
|---|---|
| 250722 사전캠프 7일차 TIL 랜드스케이프와 머터리얼 (1) | 2025.07.22 |
| 250718 사전캠프 5일차 TIL 사전캠프 퀘스트 2 (1) | 2025.07.18 |
| 250717 사전캠프 4일차 TIL 사전캠프 퀘스트 수행하기 (0) | 2025.07.17 |
| 250716 사전캠프 3일차 TIL 액터와 블루프린트 (0) | 2025.07.16 |