[체험기] "게임 만들어줘" 한마디면 '뚝딱'... 한마디 무서운 진실
![[체험기] "게임 만들어줘" 한마디면 '뚝딱'... 한마디 무서운 진실](/_next/image?url=https%3A%2F%2Fdata.develog.develrocket.com%2Fupload%2Fdevelog%2Fdh%2F1790821524131-naujft%2FGemini_Generated_Image_of6p6lof6p6lof6p.png&w=3840&q=75)
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
본 시리즈는 현실을 기반으로 하되, 예능 중심으로 구성되어 있습니다.
재미있게 즐겨주시면 감사하겠습니다.
주요 목차
"문명 같은 전략 시뮬레이션 게임 만들어줘"
"메이플스토리 같은 게임 만들어줘"
"친구들이랑 가볍게 저녁내기 할 게임 만들어줘"
"1000만명이 즐길 수 있는 MMO RPG 게임 만들어줘"
"포트나이트나 배틀그라운드처럼 재미있는 게임 만들어줘"
실제 코딩을 전혀 모른다는 전제하에 진행해보겠습니다.
제가 한번 해보겠습니다.
EP 1
- AI와의 첫대면 (상상과 현실의 괴리)
우선 시작은
가볍게 제미나이를 통해서 자동차 이미지를 만들어보겠습니다
오랜만에 드라이브를 하고싶으니까 자동차를 만들어보겠습니다.

오...
멋지게 나왔습니다
이미지를 다운로드 받아보겠습니다

AI가 요즘 훌륭하군요?

그대로 이미지를 가져다가
바르코 3D에 가져옵니다
바로 생성해보겠습니다

마이카를 잘 만들어주고 있습니다..
기대가 됩니다
저는 오늘 게임을 만들고
이 차를 타고 드라이브를 가고 커피 한잔을 할 수 있을지

완성품이 나왔습니다



생각보다는 때깔이 괜찮죠??
바르코 3D가 생각보다 괜찮더라고요?
텍스쳐나 페인트를 입혀보도록 하겠습니다
EP 02
- 개발자의 눈물 vs 사장님의 환호






이정도로 퀄리티가 좋다고요??

지금 당장이라도
이 차를 타고 GTA처럼 추격전을 하고싶은 마음입니다



아재 개그와 농담은 그만하고..
이어서 게임을 만들어보도록하겠습니다
차를 fbx로 다운로드받습니다
제미나이로드 다시 갑니다

니드포스피드?
레이싱 게임 많지만 갑자기 이게 생각났습니다..

자 이제 시켜보고 기다리겠습니다.

돈을..달라고 하네요...
구독해달래요...


영상으로 만들어준다고 하고..
게임은 안되나..?
돈을 내랍니다..
이에 질세라
다시 요청해보겠습니다
밀고당기고

살짝 밀당을 해줘야겠습니다.
밀고 당기고 조이고 칠하자!
이친구가 약간 단호박이군요..

자 구독한다고 미끼도 던졌습니다
Show me the money got tham
그리고 팁도 줬습니다
이제 뽑아줄까요?
프롬프트를 실행해보겠습니다.
팁은 받았지만 게임을 만들어주진 않았습니다..

전혀 안해준다고 합니다..
유니티나 언리얼 엔진으로 가라고 합니다
약간의 실망감을 감추고 다시 한번 해보겠습니다

미니게임으로 잘 토닥였습니다.
할수있어 제미나이야 넌 최고야..
가즈아..

결과를은.. 대단했다...
빨간도형.. 마이 블루카는 어디갔죠..?


EP 03
- 똥겜도 내가만들면 고티(GOTY)지!
제미나이보다는 지피티로 갑시다..
AI 선수 교체들어갑니다
제미나이 들어오시고요 챗지피티 들어가세요

선수 교체 했으니 일단 인사부터 합시다

시작부터 무례함을 던지고 시작하죠
게임은 상당히 복잡한 작업을 거쳐야 하기때문에
선무례로 다가갑시다




일단 커피 기프티콘은 안준다고 합니다
그 부분은 상당히 아쉽지만
게임 만드는걸 잘 도와준다고 하니,
일단 릴렉스해보고 요구사항을 말해보도록 하겠습니다

일단 게임을 만들어달라고 했습니다.

뭘 하는척을 하는데
일단 기대반 설렘반으로 기다려 보겠습니다.



과연....


만들었다네요?
만들었다고..?
만...들..었..다..고??

게임 다운로드....???
해봅시다
조작은:
W / ↑ 가속
A / D / ← / → 조향
S / ↓ / Space 브레이크
R 리셋
일단 믿고 다운받고 조작법도 익혀보도록 하겠습니다..
R이 리셋 스페이스가 브레이크 w가 가속 오케이
실행해 보겠습니다.

뭔가 ...
이게 뭘까요..?
제 블루 스포츄카 어디갔을까요?


잘했다고 해야될까요?


배경에
나무도 많이 심어놨네요..
여러분들이 즐길 수 있도록
소스코드 공유하겠습니다..
여기까지만 하겠습니다..
피로도가 상당히 올라가네요
게임 만들어줘는 여기까지 였습니다......


'무서운 진실'은 여기까지 입니다..
ai는 프로그래밍이나 기획을 어느정도 아는 사람에게는 날개를 달아주지만,
어쩌면 날개 뿐만 아니라 부스터도 달아주지만
전혀 모르는 사람에게는 엄청난 벽이 있다..

게임을 만들고 싶다면
게임 국비 아카데미로 수강 해야겠습니다
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>BLUE ROCKET RACING</title>
<style>
html,body{margin:0;height:100%;overflow:hidden;background:#081018;font-family:Arial,sans-serif;color:#fff}
#hud{position:fixed;inset:0;pointer-events:none;z-index:5}
#title{position:absolute;left:24px;top:18px;font-weight:900;font-size:22px;letter-spacing:2px;text-shadow:0 2px 8px #000}
#stats{position:absolute;right:24px;top:18px;text-align:right;font-weight:800;font-size:18px;line-height:1.6;text-shadow:0 2px 8px #000}
#help{position:absolute;left:24px;bottom:20px;font-size:14px;opacity:.9;text-shadow:0 2px 8px #000}
#msg{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center;font-size:24px;font-weight:900;text-shadow:0 3px 12px #000}
#msg small{display:block;font-size:14px;margin-top:10px;opacity:.85}
#bar{position:absolute;left:50%;bottom:22px;transform:translateX(-50%);width:260px;height:8px;border-radius:8px;background:#ffffff33;overflow:hidden}
#bar i{display:block;height:100%;width:100%;background:#fff;transform-origin:left}
</style>
</head>
<body>
<div id="hud">
<div id="title">🚀 BLUE ROCKET RACING</div>
<div id="stats"><div>속도 <span id="speed">0</span> km/h</div><div>랩 <span id="lap">1</span> / 3</div><div>기록 <span id="time">0.0</span>s</div></div>
<div id="help">WASD / 방향키 : 운전 R : 리셋 SPACE : 브레이크</div>
<div id="msg">차량을 불러오는 중...<small>bluecar.fbx</small></div>
<div id="bar"><i></i></div>
</div>
<script type="importmap">
{"imports":{"three":"https://cdn.jsdelivr.net/npm/three@0.180.0/build/three.module.js","three/addons/":"https://cdn.jsdelivr.net/npm/three@0.180.0/examples/jsm/"}}
</script>
<script type="module">
import * as THREE from 'three';
import { FBXLoader } from 'three/addons/loaders/FBXLoader.js';
const scene=new THREE.Scene();
scene.background=new THREE.Color(0x8cc8ee); scene.fog=new THREE.Fog(0x8cc8ee,120,500);
const camera=new THREE.PerspectiveCamera(65,innerWidth/innerHeight,.1,1000);
const renderer=new THREE.WebGLRenderer({antialias:true}); renderer.setPixelRatio(Math.min(devicePixelRatio,2)); renderer.setSize(innerWidth,innerHeight); renderer.shadowMap.enabled=true; document.body.appendChild(renderer.domElement);
scene.add(new THREE.HemisphereLight(0xdff3ff,0x36522e,2.2));
const sun=new THREE.DirectionalLight(0xffffff,2.6); sun.position.set(-80,120,40); sun.castShadow=true; sun.shadow.mapSize.set(2048,2048); scene.add(sun);
const ground=new THREE.Mesh(new THREE.PlaneGeometry(900,900),new THREE.MeshStandardMaterial({color:0x2d6b39,roughness:1})); ground.rotation.x=-Math.PI/2; ground.receiveShadow=true; scene.add(ground);
// Oval racing circuit
const RX=92,RZ=58, ROAD=15;
function trackPoint(t){return new THREE.Vector3(RX*Math.cos(t),0,RZ*Math.sin(t));}
function trackTangent(t){return new THREE.Vector3(-RX*Math.sin(t),0,RZ*Math.cos(t)).normalize();}
function trackAngle(t){const p=trackTangent(t); return Math.atan2(p.x,p.z);}
const roadShape=new THREE.Shape();
for(let i=0;i<=160;i++){let t=i/160*Math.PI*2;let x=RX*Math.cos(t),z=RZ*Math.sin(t); if(i===0)roadShape.moveTo(x,z); else roadShape.lineTo(x,z)}
const roadPts=[]; for(let i=0;i<160;i++){let t=i/160*Math.PI*2; roadPts.push(trackPoint(t));}
const roadGeom=new THREE.BufferGeometry().setFromPoints(roadPts); roadGeom.setDrawRange(0,160); // centerline only
const roadMat=new THREE.LineBasicMaterial({color:0x2b2f34,linewidth:12}); scene.add(new THREE.LineLoop(roadGeom,roadMat));
// Wide road using segments
const roadGroup=new THREE.Group(); scene.add(roadGroup);
for(let i=0;i<160;i++){let t=i/160*Math.PI*2,t2=(i+1)/160*Math.PI*2;let a=trackPoint(t),b=trackPoint(t2);let mid=a.clone().add(b).multiplyScalar(.5);let len=a.distanceTo(b);let m=new THREE.Mesh(new THREE.BoxGeometry(ROAD,0.18,len+0.8),new THREE.MeshStandardMaterial({color:0x30343a,roughness:.9}));m.position.copy(mid);m.rotation.y=-Math.atan2(b.x-a.x,b.z-a.z);m.receiveShadow=true;roadGroup.add(m)}
// curbs
for(let side of [-1,1]) for(let i=0;i<160;i+=4){let t=i/160*Math.PI*2;let p=trackPoint(t),tan=trackTangent(t),n=new THREE.Vector3(-tan.z,0,tan.x).multiplyScalar(side*(ROAD/2+1.2));p.add(n);let c=new THREE.Mesh(new THREE.BoxGeometry(2.4,.25,3.0),new THREE.MeshStandardMaterial({color:i%8===0?0xf5f5f5:0xe63d3d}));c.position.copy(p);c.rotation.y=trackAngle(t);roadGroup.add(c)}
// center dashed line
for(let i=0;i<80;i+=2){let t=i/80*Math.PI*2;let p=trackPoint(t);let d=trackTangent(t);let m=new THREE.Mesh(new THREE.BoxGeometry(.35,.03,2.5),new THREE.MeshBasicMaterial({color:0xf5d85b}));m.position.set(p.x,.11,p.z);m.rotation.y=Math.atan2(d.x,d.z);scene.add(m)}
// trees / scenery
for(let i=0;i<75;i++){let t=Math.random()*Math.PI*2,r=115+Math.random()*75,p=new THREE.Vector3(Math.cos(t)*r,0,Math.sin(t)*r);let trunk=new THREE.Mesh(new THREE.CylinderGeometry(.7,1,5,7),new THREE.MeshStandardMaterial({color:0x6b4026}));trunk.position.set(p.x,2.5,p.z);trunk.castShadow=true;scene.add(trunk);let crown=new THREE.Mesh(new THREE.ConeGeometry(4+Math.random()*2,9,8),new THREE.MeshStandardMaterial({color:0x1f5e2d}));crown.position.set(p.x,9,p.z);crown.castShadow=true;scene.add(crown)}
// Start/finish
const line=new THREE.Mesh(new THREE.BoxGeometry(ROAD,.03,2.5),new THREE.MeshBasicMaterial({color:0xffffff}));line.position.set(RX,0.12,0);line.rotation.y=Math.PI/2;scene.add(line);
for(let z=-ROAD/2;z<ROAD/2;z+=2.5){let q=new THREE.Mesh(new THREE.BoxGeometry(.08,.04,2.5),new THREE.MeshBasicMaterial({color:((z/2.5)%2===0)?0x111111:0xffffff}));q.position.set(RX+.1,.15,z);q.rotation.y=Math.PI/2;scene.add(q)}
let carRoot=new THREE.Group(); scene.add(carRoot); let carModel=null;
function fallbackCar(){let g=new THREE.Group();let body=new THREE.Mesh(new THREE.BoxGeometry(2.5,.65,4.8),new THREE.MeshStandardMaterial({color:0x126cff,metalness:.35,roughness:.3}));body.position.y=.8;g.add(body);let cabin=new THREE.Mesh(new THREE.BoxGeometry(1.8,.65,2),new THREE.MeshStandardMaterial({color:0x18242f,metalness:.1,roughness:.2}));cabin.position.set(0,1.25,.15);g.add(cabin);for(let x of [-1.05,1.05])for(let z of [-1.65,1.65]){let w=new THREE.Mesh(new THREE.CylinderGeometry(.42,.42,.3,16),new THREE.MeshStandardMaterial({color:0x111111}));w.rotation.z=Math.PI/2;w.position.set(x,.45,z);g.add(w)}return g}
const loader=new FBXLoader();
loader.load('./bluecar.fbx',obj=>{
carModel=obj; carModel.traverse(o=>{if(o.isMesh){o.castShadow=true;o.receiveShadow=true}});
const box=new THREE.Box3().setFromObject(carModel), size=box.getSize(new THREE.Vector3()), max=Math.max(size.x,size.y,size.z); const s=5.0/max; carModel.scale.setScalar(s);
const b2=new THREE.Box3().setFromObject(carModel); const c=b2.getCenter(new THREE.Vector3()); carModel.position.sub(c); carModel.position.y=-b2.min.y;
// Common FBX car orientation adjustment; reset here if your model already faces forward.
carModel.rotation.y=Math.PI;
carRoot.add(carModel); start();
},undefined,err=>{console.warn(err);carModel=fallbackCar();carRoot.add(carModel);document.getElementById('msg').innerHTML='차량 파일을 읽지 못해 임시 차량으로 시작합니다.<small>bluecar.fbx를 다시 확인해주세요.</small>';start();});
const keys={}; addEventListener('keydown',e=>{keys[e.key.toLowerCase()]=true;if(e.key.toLowerCase()==='r')reset()}); addEventListener('keyup',e=>keys[e.key.toLowerCase()]=false);
let tParam=0,lap=1,speed=0,heading=0,started=false,startTime=0,lastT=0;
function reset(){tParam=0;lap=1;speed=0;heading=trackAngle(0);lastT=0;carRoot.position.copy(trackPoint(0));carRoot.position.y=.2;carRoot.rotation.y=heading;startTime=performance.now();}
function start(){reset();started=true;document.getElementById('msg').innerHTML='3...<small>W / ↑ 로 출발!</small>';setTimeout(()=>document.getElementById('msg').innerHTML='2...',700);setTimeout(()=>document.getElementById('msg').innerHTML='1...',1400);setTimeout(()=>document.getElementById('msg').innerHTML='GO!',2100);setTimeout(()=>document.getElementById('msg').innerHTML='',2700)}
const clock=new THREE.Clock();
function animate(){requestAnimationFrame(animate);let dt=Math.min(clock.getDelta(),.05);if(!started){renderer.render(scene,camera);return}
let throttle=keys['w']||keys['arrowup']; let brake=keys['s']||keys['arrowdown']||keys[' ']; let steer=(keys['a']||keys['arrowleft']?-1:0)+(keys['d']||keys['arrowright']?1:0);
if(throttle)speed=Math.min(speed+30*dt,58);else speed=Math.max(0,speed-10*dt);if(brake)speed=Math.max(0,speed-45*dt);
const steerPower=(.5+speed/70)*steer; heading+=steerPower*dt;
// Arcade movement
const forward=new THREE.Vector3(Math.sin(heading),0,Math.cos(heading)); carRoot.position.addScaledVector(forward,speed*dt);
// soft wall / track correction
const x=carRoot.position.x/RX,z=carRoot.position.z/RZ; const radial=Math.sqrt(x*x+z*z); if(radial<.78||radial>1.22){speed*=.86;}
// progress estimate from nearest angular parameter
let nt=Math.atan2(carRoot.position.z/RZ,carRoot.position.x/RX); if(nt<0)nt+=Math.PI*2; if(lastT>5.5 && nt<.5){lap++; if(lap>3){started=false;document.getElementById('msg').innerHTML='🏁 FINISH!<small>R을 눌러 다시 달리세요.</small>';speed=0}} lastT=nt;
// snap gently toward centerline when off-track
const ideal=trackPoint(nt); const dist=carRoot.position.distanceTo(ideal); if(dist>ROAD*.75)carRoot.position.lerp(ideal,.9*dt);
carRoot.rotation.y=heading;
const target=carRoot.position.clone().addScaledVector(forward,9).add(new THREE.Vector3(0,3,0)); camera.position.lerp(carRoot.position.clone().addScaledVector(forward,-11).add(new THREE.Vector3(0,6,0)),1-Math.pow(.001,dt)); camera.lookAt(target);
document.getElementById('speed').textContent=Math.round(speed*3.6);document.getElementById('lap').textContent=Math.min(lap,3);document.getElementById('time').textContent=((performance.now()-startTime)/1000).toFixed(1);document.querySelector('#bar i').style.transform='scaleX('+Math.min(1,speed/58)+')';
renderer.render(scene,camera);
}
addEventListener('resize',()=>{camera.aspect=innerWidth/innerHeight;camera.updateProjectionMatrix();renderer.setSize(innerWidth,innerHeight)});
animate();
</script>
</body></html>

Meta(구 Facebook)가 2026년 9월 24일 '메타 커넥트 2026' 에서 호라이즌 크리에이트(Horizon Create) 와 호라이즌 스튜디오(Horizon Studio)를 공개했습니다. 만들고 싶은 게임을 자기 말로 설명하면 AI에이전트가 플레이 가능한 2D, 3D게임을 만들어주는 도구입니다. 메타사는 과거서부터 AI를 활용하여 게임을 만들게

최근 모바일 하드웨어 시장이 엄청난 변곡점을 맞이하고 있습니다. 특히 차세대 플래그십으로 꼽히는 아이폰 18 출시 이슈와 더불어, 시장의 판도를 바꿀 폴더블폰의 대중화가 빠르게 진행되고 있죠. 하드웨어가 ' 접히고, PC급 성능으로 진화'하는 이 시점에서, 과거의 문법으로 게임을 기획하면 어떻게 될까요?

게임 개발자로 취업을 준비하다 보면 이런 고민을 하게 됩니다. 포트폴리오는 대체 뭘 만들어야 하지? Unity로 게임을 하나 만들어봤다. C도 어느 정도 공부했다. 강의를 따라 게임을 완성하기도 했다. 그런데 막상 게임회사 채용공고를 찾아보면 자신감이 떨어진다. 이 정도로 취업할 수 있을까? 포트폴리오는 단순히 게임을 하나 완성했다는 사실을 보여주는 자료가

Meta(구 Facebook)가 2026년 9월 24일 '메타 커넥트 2026' 에서 호라이즌 크리에이트(Horizon Create) 와 호라이즌 스튜디오(Horizon Studio)를 공개했습니다. 만들고 싶은 게임을 자기 말로 설명하면 AI에이전트가 플레이 가능한 2D, 3D게임을 만들어주는 도구입니다. 메타사는 과거서부터 AI를 활용하여 게임을 만들게

최근 모바일 하드웨어 시장이 엄청난 변곡점을 맞이하고 있습니다. 특히 차세대 플래그십으로 꼽히는 아이폰 18 출시 이슈와 더불어, 시장의 판도를 바꿀 폴더블폰의 대중화가 빠르게 진행되고 있죠. 하드웨어가 ' 접히고, PC급 성능으로 진화'하는 이 시점에서, 과거의 문법으로 게임을 기획하면 어떻게 될까요?


게임 개발자로 취업을 준비하다 보면 이런 고민을 하게 됩니다. 포트폴리오는 대체 뭘 만들어야 하지? Unity로 게임을 하나 만들어봤다. C도 어느 정도 공부했다. 강의를 따라 게임을 완성하기도 했다. 그런데 막상 게임회사 채용공고를 찾아보면 자신감이 떨어진다. 이 정도로 취업할 수 있을까? 포트폴리오는 단순히 게임을 하나 완성했다는 사실을 보여주는 자료가
