-
Minor On Air 개발 - < AI 3D 모델링에 하네스 씌우기 > TOP NEW
개요 말로만 그림을 설명하고 상대가 그리게 하는 게임에서, 그리는 쪽이 갑자기 스케치 세 장을 내밀며 “이 중에 뭐야?”라고 물으면 어떻게 될까? AI로 플레이어 로봇을 모델링하면서 도면을 아무리 자세히 그려도 blockout(큰 덩어리만 잡은 초안)에서 더 나아가지 않았다. 그래서 설명을 더 하는 대신 AI가 일하는 틀, 하네스를 만들었다. 고쳐도 되는 범위, 고친 뒤 재야 할 것, 남겨야 할 기록을 저장소 규칙과 코드로 정해 둔 것이다. 그러자 장면이 바뀌었다. 내가 추상적으로 말한 것이 후보 보드로 렌더되어 돌아왔고, AI가 이 중 어느 쪽이냐고 되물었다. 고치기 전에 먼저 재고, 잰 숫자와 수정안부터 ... Read More
-
Minor On Air 개발 - < 도면으로 AI 3D 모델링 > TOP NEW
개요 말로만 그림을 설명하고 상대가 그리게 하는 게임이 있다. 설명이 자세할수록 그림이 닮아갈 거라 믿게 된다. 나도 그렇게 믿었다. 도면만 제대로 뽑아주면 AI가 잘 만들 거라 생각해서, GPT로 정면·측면·단면·분해도까지 담은 도면을 만드는 데 시간을 바쳤다. 그런데 Blender 안의 로봇은 아무리 설명을 보태도 blockout(큰 덩어리만 잡은 초안 모델)에서 더 나아가지 않았다.. Minor On Air는 로봇 광부들이 거대한 생명체 안에서 광석을 캐는 1인칭 협동 게임이다. 이번엔 플레이어가 조종할 그 로봇을 AI로 모델링해 보려 했다. ChatGPT 6.1-sol과 Claude Opus 5.5를... Read More
-
이론 정리 - < IO 멀티플렉싱은 블로킹을 한 곳에 모은다 > TOP NEW
개요 아파트 경비원 한 명이 수백 세대를 맡는다. 세대마다 문 앞에 서 있을 순 없으니 경비실 호출 패널만 본다. 불이 들어온 세대 번호로 가면 된다. 순찰도 돌아야 한다. 규칙은 “호출이 10분 동안 없으면 순찰을 돈다.” 택배가 몰리는 날 호출이 5분마다 오면 순찰은 한 번도 못 돈다..! 게임 서버가 이 경비원이다. 호출 패널은 epoll, 순찰은 틱( 몬스터를 움직이고 버프 시간을 줄이는, 일정 간격의 세계 갱신 )이다. 처음엔 서버도 이 규칙대로 짜면 된다고 생각했다. 패널을 기다리는 함수가 돌려주는 숫자가 0이면 “그동안 호출이 없었다”는 뜻이니 그때 틱을 돌리면 된다고. 그 숫자는 시간이 아니라 ... Read More
-
Algorithm - < 최단 경로 세 가지 > TOP NEW
개요 이번에 배운 건 최단 경로를 구하는 알고리즘 세 가지다. 다익스트라, 벨만-포드, 플로이드-워셜. 셋 다 “가장 싼 길”을 찾지만 쓰는 자리가 다르고, 그 자리를 가르는 건 두 질문이다. 몇 쌍을 묻는가. 한 점에서 출발하는 거리면 다익스트라·벨만-포드, 모든 점 사이의 거리면 플로이드-워셜 음수 간선을 믿을 수 있는가. 간선이 전부 0 이상이면 다익스트라, 음수가 섞이면 벨만-포드·플로이드-워셜 세 알고리즘이 맞는 이유를 한 문장씩으로 줄여 두면, 그 문장이 깨지는 조건도 같이 보인다. 다익스트라: 큐에서 꺼낸 순간 거리가 확정된다. 간선이 0 이상일 때만 참이다 벨만-포드: V−... Read More
-
C# - < 이벤트 구독 해제 > TOP NEW
개요 보스전이 있는 게임을 떠올려 보자. 화면 위에는 보스 체력바가 있고, 옆에는 퀘스트 기록창이 있다. 둘 다 보스의 “죽었다” 이벤트를 구독해 두고, 보스가 죽으면 알림을 받아 각자 할 일을 한다. 보스 쪽은 알림을 보낸 다음 보상 상자를 떨어뜨린다. 전투 도중 UI가 한 번 다시 만들어지면서 체력바가 닫혔다가 새로 생겼다. 그런데 옛 체력바는 구독을 풀지 않은 채 사라졌다. 이 상태로 보스를 잡으면 보상 상자가 안 떨어진다. 보상 코드에는 아무 문제가 없다. 일은 이렇게 이어진다. 보스가 “죽었다” 알림을 보낸다 알림 목록에 아직 남아 있던 옛 체력바도 알림을 받는다 옛 체력바가 이미 사라... Read More
-
Algorithm - < 동적 계획법 > TOP NEW
개요 마트 세 곳을 돌며 우유 최저가를 메모지에 적는다고 해보자. 동적 계획법( DP )에서 표의 한 칸에 최솟값을 채우는 일이 이 메모지와 같다. 첫 가게에서는 가격을 그냥 적고, 두 번째 가게부터는 더 쌀 때만 고쳐 적는다. 다 돌고 나면 메모지에 남은 건 마지막에 본 가격이 아니라 최저가다. 같은 메모지를 다음 날 또 들고 나가면 얘기가 달라진다. 첫 가게라고 그냥 덮어쓰면 어제 찾은 최저가가 지워지니, 첫 가게부터 어제 값과 비교해야 한다. 수영장 문제 코드를 고치다가 dp[i]에 첫 후보를 비교 없이 대입하는 줄에서 멈췄다. 이러면 최솟값이 아니라 최신 값만 남는 거 아닌가..? 이번 글에서 헷갈렸... Read More
-
Minor On Air 개발 - < 손맛은 클라이언트, 결과는 서버 > TOP NEW
개요 반 발짝 옆에서는 되는데 여기서는 안 된다. 같은 바위, 같은 각도, 같은 클릭. 광질 게임을 만들다 만난 이 자리에서는 무엇이 달랐을까? 바위도 서버도 아니었다. 달라진 건 내 몸의 위치였다. 찍을 대상을 고르는 선이 바위보다 내 몸에 먼저 걸렸고, 2편에서 내가 세운 “자기 자신이면 무시” 필터가 그 클릭을 조용히 버렸다.. 이번엔 채굴 방식에 재미 요소를 넣어줬다. Unity NGO(Netcode for GameObjects)처럼 서버가 판정을 쥐는 구조에서 찍는 순간의 소리와 흔들림, 바위에 금이 가거나 부서지는 결과가 화면에서 같아야 한다. 이 둘을 어떻게 나눴는지, 그리고 그 사이에 숨어 있... Read More
-
Minor On Air 기획 - < 규칙 먼저, 세계관은 나중에 > TOP NEW
개요 등 뒤에서 쉿 소리가 점점 커진다. 방금 캔 터지는 광물이 가방에 들어갔는데, 가방은 등에 달린 해치라 내가 열 수 없다. 할 수 있는 건 옆 동료에게 “빨리 꺼내줘!!”라고 비는 것뿐이다.. Minor On Air의 세계관을 짜면서 제일 기억에 남는 장면이다. 이 장면은 세계관에서 나온 게 아니라 규칙에서 먼저 나왔다. 1편에서 정한 건 도망가는 광물, 터지는 광물, 팀킬 같은 규칙이었고, 세계관은 그 뒤에 “왜 광물이 움직이지?”, “왜 가방을 못 열지?”에 이유를 대려고 붙였다. 협동 게임을 기획하면서 규칙과 설정 중 뭘 먼저 잡을지 고민 중이라면, 규칙이 먼저 있고 설정이 하나씩 이유를 대 가는 ... Read More