엘리베이터 만들기
엘리베이터 설치
먼저 https://www.meshy.ai/discover meshy.ai로 내가 원하는 창문형 엘리베이터를 만들었다.
실제로 움직이는 엘리베이터 본체와 각 층마다 엘리베이터를 호출하거나 문을 여는 엘리베이터 입구로 이루어져 있다.
원래는 원하는 층에 도달하면 자동으로 문이 열리고 몇 초후에 엘리베이터가 닫혀야하는데 이 부분은 나중에 구현하도록 하겠다.그래서 오른쪽 버튼은 엘리베이터를 열고 닫는 버튼이고
왼쪽 5개의 버튼은 각각 1~5층으로 이동하는 버튼이다.
각 층마다 엘리베이터 입구에는 엘레리이터를 호출하거나 열 수 있는 버튼이 있다.
구현
일단 엘리베이터를 만들기 전에 구현해야 하는 로직을 정리해 봤다.
각 층에서 엘리베이터를 호출할 때
- 엘리베이터가 해당 층에 있다면 현재 문과 엘리베이터 내부 문을 동시에 열거나 닫는다.
- 엘리베이터가 해당 층에 없다면 엘리베이터를 해당 층으로 호출해야 한다. 이 때 엘리베이터의 문은 닫혀있어야 하고 움직이는 상태가 아니어야 한다.
엘리베이터 내부에서 조작할 때
- 엘리베이터 내부에서 문을 여는 버튼을 눌렀을 때 엘리베이터가 위치하고 있는 현재의 층과 같은 층의 외부문을 동시에 열거나 닫는다.
- 엘리베이터 내부에서 원하는 층 버튼을 눌렀을 때 현재 층과 버튼을 누른 층이 다를 경우 해당 층으로 이동해야 하고 이 때 엘리베이터는 문이 닫혀 있어야하고 움직이는 상태가 아니어야 한다.
이제 이걸 토대로 외부와 내부를 만들어 보자.
일단 기본적으로 외부에서 호출할 때와 내부에서 조작할 때 공통되는 조건과 동작들이 있기 때문에 실질적으로 움직이는 구현은 엘리베이터 블루프린트 클래스에서, 엘리베이터 호출과 엘리베이터 입구 동작은 엘리베이터 버튼과 문에서 만들면 된다.
모든 엘리베이터와 관련된 버튼은 인터페이스로 구현했으며
각 층 엘리베이터의 외부 버튼 같은 경우에는 클릭 당했을 때 Interact로 해당 층과 엘리베이터의 층이 같다면 둘의 문을 열고 층이 다르다면 엘리베이터를 해당 층으로 이동시킨다.근데 여기서 문제는 엘리베이터가 맵에 하나만 존재하면 상관없지만 엘리베이터와 각 층의 엘리베이터 문이 여러 개가 있을 수 있다.
( 예를 들어서 학교같은 건물은 건물 좌우로 엘리베이터가 하나 씩 존재할 수 있다. )만약 로직을 구현할 때 단순히 같은 층이면 열리게하거나, 호출 했을 때 엘리베이터 클래스를 가진 액터를 이동시키거나, Get All Actor Of Class로 하나의 엘리베이터에 모든 버튼 클래스를 할당시켜버리면 문제가 발생한다.
그렇게 된다면 3층에서 호출버튼을 누르면 건물의 모든 엘리베이터가 3층으로 이동하고, 문이 열리고, 5층 버튼을 누르면 모든 엘리베이터가 5층으로 가게 된다.
이런 사태를 막기 위해서 Tag를 쓰거나 아니면 블루프린트에서 여러 방법으로 주변의 버튼, 엘리베이터끼리 묶을 수 있지만 제일 간단한 방법은 에디터에서 해당 액터에 값을 미리 지정해주는 것이다.
서로 연결할 변수를 만들어주고 "인스턴스 편집가능"과 "스폰시 노출"을 체크하면 에디터에서 해당 액터의 변수 값을 직접 설정이 가능하다.
같은 방식으로 엘리베이터에도 각 층의 버튼을 미리 지정해놓으면 똑같은 클래스의 엘리베이터나 층 버튼을 몇 개를 만들어내도 간단하게 직관적으로 서로 연결이 가능하다.
결과
올라가거나 내려갈 때 너무 빠르게 움직이는 것도 수정이 필요하고
로직 자체가 해당 층까지 도달하기 전까지 1층 단위 타임라인으로 이동하기 때문에 중간에 뚝뚝 끊기는 느낌이 있다.
일단 설정창이나 AI는 뒤로 미루고 멀티플레이 구현부터 테스트하겠다.