게임 화면에서 바로 고치는 월드 에디터를 만들었습니다
AI가 만든 경험을 게임 화면 위에서 직접 옮기고 고치는 에디터를 만들었습니다. 10월에 접었던 방식과 무엇이 다른지, 저장을 6분에서 7~9초로 줄인 과정, 직접 수정을 에디터 하나로 합친 이유를 정리했습니다.

- 10월에 만들었다가 접은 에디터를, 게임 코드는 그대로 두고 플랫폼이 물건마다 이름표를 붙이는 방식으로 다시 만들었습니다.
- 3D 물건 옮기기 · 돌리기 · 크기 · 복제 · 삭제, 모델 추가와 바꾸기, 게임 카메라, 하늘 · 안개 · 밝기, 화면 글자, 조절 값과 그림 · 소리 파일까지 한 에디터에서 고칩니다. 저장에는 AI와 크레딧이 쓰이지 않습니다.
- 저장 시간은 처음 6분에서 7~9초로 줄었고, 폰에서도 같은 에디터를 씁니다. 11월 11일 모든 사용자에게 열었고, 11월 12일부터는 공동 개발자 · 클랜원이 같은 에디터를 같이 열어 실시간으로 고칩니다.
Pogl에서는 AI에게 말로 경험을 고칩니다. 그런데 나무를 조금 옆으로 옮기거나 벽 하나를 지우는 일은 말로 설명하는 것보다 직접 옮기는 편이 빠릅니다. 직접 고치게 해 달라는 의견이 계속 들어왔고, 11월 11일 월드 에디터를 만들어 모든 사용자에게 열었습니다.
10월에 만든 에디터는 실제 물건을 옮기지 못했습니다
10월에도 에디터를 한 번 만들었습니다. 두 가지 방식을 시험했고 둘 다 접었습니다.
첫 번째는 화면에서 누른 위치로 어떤 물건인지 짐작하는 방식이었습니다. AI가 쓴 게임 코드에는 물건마다 정해진 이름이 없었기 때문입니다. 짐작이 틀리면 에디터에서 옮겨도 실제 물건은 그 자리에 있었습니다.
두 번째는 게임이 맵 파일을 읽어 물건을 놓게 만드는 방식이었습니다. 이름표는 정확해졌지만, AI가 맵 파일 형식에 맞춰 게임을 만들면서 회색 상자와 빈 땅이 많은 밋밋한 게임이 나왔습니다.
게임 코드는 그대로 두고, 플랫폼이 이름표를 붙입니다
Pogl에서는 게임이 3D 물건을 장면에 붙이는 순간 플랫폼이 이름표를 붙입니다. 이름은 물건의 종류와 그 종류가 생긴 순서입니다. 게임은 실행할 때마다 같은 순서로 물건을 만들기 때문에, 다음에 켜도 같은 물건이 같은 이름을 받습니다. 게임이 three.js를 자기 파일에 넣어 온 옛 게임도 같은 방식으로 잡혀서, 게임을 다시 만들지 않아도 에디터가 열립니다.
에디터에서 고친 내용은 덮어쓰기 파일(pogl.scene.json) 하나에 저장됩니다. 게임이 켜질 때 물건이 장면에 붙는 순간 이 내용을 얹기 때문에, 그 뒤에 게임이 계산하는 충돌 판정도 옮긴 자리를 따릅니다. 파일에는 물건의 처음 자리도 같이 적어 둡니다. 다음에 켰을 때 같은 이름의 물건이 다른 자리에서 시작하면 얹지 않습니다. 엉뚱한 물건이 옮겨지는 것을 막기 위해서입니다.
실제 게임에서 막힌 곳을 하나씩 풀었습니다
처음 만든 판은 시험용 게임에서는 잘 동작했지만, 실제로 만들어진 게임을 열자 막히는 곳이 나왔습니다. 11월 11일 하루 동안 열두 번 고쳐 올렸습니다.
- 같은 모양을 한 번에 그린 물건: 원뿔 320개를 한 번에 그린 게임에서는 하나만 옮길 수 없었습니다. 지금은 하나를 누르면 그 하나만 옮기고, 지우고, 색을 바꿉니다.
- 블록으로 지은 마을: 집 여러 채가 블록 수백 개로 이루어진 물체 하나에 들어 있는 게임이 있었습니다. 서로 닿은 블록을 건물 하나로 묶어, 처음 누르면 집 한 채가 골라지고 한 번 더 누르면 블록 하나가 골라지게 했습니다.
- three.js를 직접 넣은 옛 게임: 누른 곳의 물체를 찾는 기능이 빠져 있어서, 섬 전체를 덮는 땅만 골라졌습니다. 상자로 먼저 거른 뒤 실제 모양으로 다시 맞혀 고르게 했습니다.
- 비스듬히 내려다보는 게임: 카메라를 가까이 가져가도 화면이 커지지 않는 방식이라 확대가 되지 않았습니다. 이런 게임은 화면 배율을 키워 확대합니다.
- 2D 게임: 화면의 글자 · 단추 · 그림은 모든 게임에서 고칠 수 있습니다. 그림 속 캐릭터와 아이템은 처음에는 게임이 «옮길 수 있는 물체»라고 알려 줘야 해서 새로 만든 게임에서만 됐습니다. 11월 12일부터는 게임이 화면에 한 덩어리로 그리는 것과 그림 한 장 한 장을 플랫폼이 직접 물체로 잡아, 이미 있던 2D 게임에서도 옮기고 숨깁니다.
- 여러 조각으로 된 물건: 경주 게임의 출발 문처럼 기둥 · 간판 · 글씨판이 한 묶음에 든 물건은 묶음째로만 골라졌습니다. 게임이 조각을 비웠다가 다시 채우는 경우까지 잡아, 처음 누르면 묶음 전체, 한 번 더 누르면 조각 하나가 골라지게 했습니다.
이 과정에서 편집 권한이 있는 게임 40개를 하나씩 열어 확인했습니다. 40개 모두 에디터가 열렸습니다.
저장은 6분에서 7~9초가 됐습니다
처음 운영에서 저장했을 때는 6분이 걸렸습니다. 그중 5분 20초는 배포 검사였습니다. 게임을 별도의 가상 컴퓨터에 띄워 폰과 컴퓨터 화면을 모두 찍어 보는 검사입니다.
에디터 저장은 게임 코드를 한 글자도 바꾸지 않고 덮어쓰기 파일 하나만 바꿉니다. 그래서 이 검사를 다시 하지 않고, 파일 형식 같은 빠른 검사만 한 뒤 바로 전 버전의 검사 결과를 이어서 씁니다. 여럿이 하는 게임은 서버 규칙 파일로 두 명을 넣어 보는 확인만 그 자리에서 다시 합니다. 게임 문구를 다시 읽는 단계도 건너뛰고, 파일을 하나씩 올리던 것을 8개씩 동시에 올리게 바꿨습니다. 업로드를 바꾼 덕분에 AI 고치기와 공개 저장도 같이 빨라졌습니다.
처음에는 여럿이 하는 게임은 서버 쪽 확인이 필요하다고 보고 매번 5분짜리 검사를 다시 거쳤습니다. 11월 12일, 검사용 컴퓨터가 붐빈 시간에 한 저장이 «준비 신호가 늦다»는 이유로 막혔고, 같은 파일을 다시 검사하니 세 번 모두 통과했습니다. 에디터는 서버 규칙 파일을 바꾸지 않기 때문에, 여럿이 하는 게임도 두 명을 넣어 보는 확인만 다시 하고 바로 저장하게 바꿨습니다. 같은 게임의 저장이 7초에 끝났습니다. 다른 저장에서도 검사가 이런 이유로만 떨어지면 한 번 더 확인합니다.
저장하면 새 버전이 생깁니다. 버전 목록에서 저장 전 버전으로 언제든 되돌릴 수 있고, 공개된 게임은 [업데이트]를 눌러야 플레이어에게 반영됩니다.
고치는 곳을 에디터 하나로 합쳤습니다
원래 Pogl에는 속도 같은 숫자, 주요 색, 게임 글자, 그림 · 소리 파일을 바꾸는 «직접 수정» 화면이 따로 있었습니다. 에디터가 생기면서 고치는 곳이 두 군데가 됐고, 두 화면의 모양도 달랐습니다. 그래서 직접 수정에 있던 기능을 모두 에디터 안으로 옮기고, 이전 입구는 없앴습니다.
화면도 단순하게 줄였습니다. 컴퓨터에서는 무대 위 가운데 알약 하나 [플레이 | 에디터 · ↶ · 저장]로 들어가고 나옵니다. 물건을 고르면 이름, [복제] [삭제], 색, 크기만 보이고, 위치 · 회전 · 재질 · 충돌은 «자세히»를 눌렀을 때 펼쳐집니다. 폰에서는 위에 [✕] [플레이 | 에디터] [⋯], 아래에 [목록] [+ 추가하기]만 둡니다. 게임 화면 아래쪽의 조작 단추를 가리지 않기 위해서입니다.

넣은 물건도 부딪히게 할 수 있습니다
에디터로 넣은 물건을 화면에 그리는 것은 플랫폼이 하지만, 부딪힘 판정은 게임마다 AI가 따로 짠 코드에 들어 있습니다. 그래서 게임이 넣은 물건의 자리를 읽을 수 있는 통로(pogl.scene.solids())를 만들었습니다. 새로 만드는 게임은 처음부터 이 통로를 씁니다.
넣은 물건을 고르면 «충돌» 스위치가 있습니다. 이미 있던 게임이 아직 이 통로를 쓰지 않으면 스위치 아래에 «AI 연결 전»이라고 나옵니다. 스위치를 누르면 대화 입력칸에 연결 요청이 들어가고, 보내면 AI가 그 게임에 한 번 연결합니다. 그 뒤로는 넣는 물건마다 부딪힙니다. 부딪히는 모양은 물건마다 끔 · 상자 · 구 · 캡슐 중에서 고릅니다.
게임 카메라와 물건 모델도 바꿉니다
장면 칸의 «게임 카메라»에서 플레이할 때 보이는 시점을 고칩니다. 시야, 확대, 뒤로 · 앞으로, 위 · 아래 네 가지입니다. 카메라를 따라가게 하는 계산은 게임 코드에 있어서, 플랫폼은 게임이 화면을 그리기 직전에만 카메라를 옮기고 그린 뒤 바로 되돌립니다. 그래서 게임의 따라가기 · 조준 계산은 그대로 두고 보이는 시점만 바뀝니다. [게임 카메라로 보기]를 켜면 에디터에서 바로 확인할 수 있습니다.
물건 하나의 모델만 다른 모델로 바꿀 수도 있습니다. 물건을 고르고 «모델 바꾸기»에서 라이브러리 모델이나 내가 올린 모델을 고르면, 원래 모양은 숨기고 같은 자리에 같은 크기로 새 모델을 보여 줍니다. 자리와 부딪힘 같은 게임 규칙은 원래 물건 그대로입니다. «원래 모델로»를 누르면 되돌아갑니다.
«값» 탭에는 게임의 속도 · 적 수처럼 조절할 수 있는 값이 나옵니다. 아직 값이 적은 게임은 탭 맨 아래 [AI에게 조절 값 만들어 달라기]를 누르면, 바꿔 볼 만한 설정을 AI가 조절 값으로 꺼내 줍니다. 이 단계는 AI가 하기 때문에 크레딧이 듭니다.
여럿이 같이 고칩니다
공동 개발자나 클랜에서 경험 수정 권한이 있는 사람은 같은 경험의 에디터를 같이 열어 고칠 수 있습니다. 누가 들어오면 «○○님이 에디터에 들어왔습니다»가 뜨고, 무대 위에 «○○님도 편집 중»이 계속 보입니다. 다른 사람이 고른 물건에는 그 사람 색의 테두리와 이름표가 붙습니다.
에디터는 0.1초마다 지금 모습을 직전에 보낸 모습과 비교해 바뀐 칸만 실시간 채널로 보냅니다. 물건을 끄는 동안에도 움직임을 보내기 때문에 다른 사람 화면에서 같이 움직입니다. 나중에 들어온 사람에게는 먼저 있던 사람이 아직 저장하지 않은 고침을 건네서, 같은 화면에서 시작합니다. 되돌리기는 내가 고친 것만 되돌리고 다른 사람이 고친 것은 그대로 둡니다. 실시간으로 주고받는 내용은 저장하기 전까지 서버 기록에 남지 않습니다.
처음에는 두 사람이 차례로 저장하면 나중에 저장한 쪽이 앞사람의 고침을 통째로 덮어썼습니다. 지금은 저장할 때 서버가 그 사이 저장된 버전을 읽어, 물건마다 내가 바꾼 것만 내 것으로 하고 나머지는 앞사람 것을 남깁니다. 같은 물건을 둘 다 바꿨으면 나중에 저장한 쪽이 남습니다. 다른 사람이 저장해서 내 화면과 같아지면 내 [저장] 단추도 꺼집니다.
AI 고치기와 이어집니다
에디터로 고친 버전에서 AI에게 고치기를 보내면, AI는 에디터로 바꾼 상태에서 이어서 고칩니다. 에디터를 연 사이에 AI가 새 버전을 만들었다면, 저장은 그 새 버전 위에 얹어서 AI가 고친 것을 잃지 않습니다.
고른 물건의 이름 · 위치 · 크기 · 색과 코드상 처음 자리를 대화 입력칸에 넣어 주는 [AI에게 부탁]도 있습니다. 손으로 옮기기 어려운 일, 예를 들어 «이 벽을 빨간 벽돌로 바꿔 줘»는 이어서 말로 부탁하면 됩니다. 이 부분은 AI가 고치기 때문에 크레딧이 듭니다.



