목차
게임메이커로 스페이스 록 게임 만들기 시작
최근 게임메이커(GameMaker)를 이용해서 스페이스 록 스타일의 우주 슈팅 게임을 제작해보기 시작했습니다.
플레이어 우주선이 움직이고 총알을 발사하며 운석을 부수는 구조의 가장 기본적인 게임이었습니다.
처음에는 영상만 따라 하면 금방 완성될 줄 알았습니다.
하지만 실제로 직접 제작을 시작해보니 생각보다 훨씬 많은 변수와 이벤트 연결 작업이 필요했습니다.
특히 GameMaker는 오브젝트 이름이나 변수 이름 하나만 달라도 오류가 발생하는 경우가 많았습니다.
초반에는 단순히 오타만 조심하면 될 줄 알았는데, 프로젝트가 조금씩 커질수록 어디서 문제가 발생했는지 찾는 것 자체가 어려워졌습니다.
이번 프로젝트에서는 플레이어가 총알을 발사하면 운석과 충돌하고, 충돌 시 점수가 올라가는 구조를 만들고 있었습니다.
그런데 테스트 도중 갑자기 게임이 멈추면서 오류 창이 출력되었습니다.
갑자기 발생한 오류 메시지
게임 실행 도중 아래와 같은 오류 메시지가 나타났습니다.

ERROR in action number 1
of Step Eventobj_bullet for object Obj_rock:
Variable Obj_rock.obj_game(100008, -2147483648) not set before reading it.
at gml_Object_Obj_rock_Collision_obj_bullet (line 7) – obj_game.point += 50;
############################################################################################
gml_Object_Obj_rock_Collision_obj_bullet (line 7)
처음에는 무슨 뜻인지 전혀 이해하지 못했습니다.
특히 not set before reading it 라는 문장이 가장 핵심이었는데, 변수값이 생성되기 전에 먼저 읽으려고 했다는 의미였습니다.
즉, obj_game.point 값을 사용하려고 했지만 실제로는 아직 변수 생성이 완료되지 않았거나, obj_game 오브젝트 자체가 정상적으로 존재하지 않는 상황으로 보였습니다.
GameMaker를 처음 배우는 분들이 가장 자주 겪는 오류 중 하나가 바로 변수 초기화 문제입니다.
특히 Create 이벤트보다 Collision 이벤트가 먼저 실행될 경우 이런 문제가 자주 발생한다고 합니다.
Obj_rock과 obj_rock 문제
오류 메시지를 계속 살펴보다가 가장 먼저 눈에 들어온 부분은 Obj_rock 이라는 이름이었습니다.
원래 제가 만든 오브젝트 이름은 소문자인 obj_rock 이었습니다.
그런데 오류 로그에는 대문자 O가 들어간 Obj_rock 으로 표시되고 있었습니다.
혹시 대소문자 문제인가 싶어서 직접 Obj_rock의 O를 소문자 o로 수정해봤습니다.
하지만 수정 이후에도 오류 메시지는 그대로 유지되었습니다.
이 부분이 가장 혼란스러웠습니다.
분명 프로젝트 내부에서는 obj_rock으로 수정되어 있었는데 오류 로그에서는 계속 Obj_rock으로 출력되고 있었기 때문입니다.
| 확인한 부분 | 결과 |
|---|---|
| Obj_rock → obj_rock 변경 | 오류 메시지는 그대로 출력되었습니다 |
| 오브젝트 이름 재확인 | 프로젝트 내부에서는 소문자로 표시되었습니다 |
| 충돌 이벤트 확인 | obj_bullet 충돌 코드가 존재했습니다 |
| point 변수 확인 | obj_game 내부 변수 생성 여부가 의심되었습니다 |
변수 오류가 발생한 이유
현재 가장 의심되는 부분은 obj_game 오브젝트가 Room 안에 배치되지 않았거나, point 변수가 생성되기 전에 접근했다는 점이었습니다.
GameMaker에서는 보통 Create 이벤트에서 변수를 먼저 선언합니다.
예를 들어 아래처럼 점수 변수를 초기화하는 방식입니다.
그런데 obj_game 오브젝트가 Room에 존재하지 않거나, Create 이벤트가 실행되기 전에 총알 충돌 이벤트가 먼저 실행되면 현재와 같은 오류가 발생할 수 있다고 합니다.
또 다른 가능성은 오브젝트 이름 변경 과정에서 내부 참조가 꼬였을 가능성이었습니다.
GameMaker는 이름을 수정해도 이전 정보가 내부적으로 남아있는 경우가 있다는 이야기도 보게 되었습니다.
직접 확인해본 부분들
오류를 해결하기 위해 여러 부분을 직접 하나씩 확인해봤습니다.
- obj_game 오브젝트가 Room에 배치되어 있는지 확인했습니다
- point 변수가 Create 이벤트에서 생성되는지 확인했습니다
- 충돌 이벤트 코드 순서를 다시 확인했습니다
- Obj_rock 관련 이름 충돌 여부를 찾아봤습니다
- 프로젝트 전체 검색 기능으로 대문자 사용 부분을 찾아봤습니다
하지만 가장 어려웠던 부분은 어디가 실제로 대문자로 남아있는지 찾는 작업이었습니다.
프로젝트 내부에서는 이미 소문자로 수정되어 있었는데도 오류 로그에는 계속 Obj_rock으로 표시되고 있었습니다.
제 개인적 생각으론 이런 상황에서는 꼬인 프로젝트를 억지로 계속 수정하는 것보다, 차라리 가이드 영상을 다시 보면서 처음부터 천천히 따라 만드는 편이 더 빠를 수도 있겠다는 생각이 들었습니다.
특히 초보 단계에서는 잘못 연결된 구조를 계속 붙잡고 있기보다, 다시 처음부터 만들면서 구조 자체를 이해하는 과정이 오히려 더 도움이 되는 것 같았습니다.
초보자가 흔히 겪는 실수
이번 오류를 겪으면서 초보 개발자들이 자주 하는 실수가 무엇인지 조금 체감하게 되었습니다.
| 실수 유형 | 설명 |
|---|---|
| 변수 초기화 누락 | 변수를 만들기 전에 먼저 사용하는 경우입니다 |
| 오브젝트 이름 충돌 | 대소문자 변경 과정에서 내부 참조가 꼬이는 경우입니다 |
| 이벤트 순서 문제 | Create보다 Collision 이벤트가 먼저 실행되는 경우입니다 |
| Room 배치 누락 | 필요한 오브젝트를 Room에 넣지 않은 경우입니다 |
특히 GameMaker는 이벤트 기반 구조라서 실행 순서를 제대로 이해하지 못하면 비슷한 오류가 반복되는 것 같았습니다.
결국 처음부터 다시 해보기로 했습니다
현재 상황에서는 꼬인 부분을 계속 추적하기보다, 차라리 다시 가이드 영상을 보면서 처음부터 다시 만들어보는 방향을 생각하고 있습니다.
처음에는 시간이 아깝다는 생각도 들었습니다.
하지만 오히려 처음부터 다시 제작하는 과정에서 오브젝트 구조와 변수 생성 순서를 더 명확하게 이해할 수 있을 것 같았습니다.
특히 obj_game 생성 시점이나 point 변수 선언 위치를 다시 확인하면서 제작하면 이후에는 비슷한 오류를 더 빠르게 해결할 수 있을 것 같습니다.
실제로 게임 개발은 단순히 코드만 따라 적는다고 끝나는 작업이 아니라, 왜 그렇게 연결되는지를 이해하는 과정이 중요하다는 걸 이번에 많이 느끼게 되었습니다.
이번 실패 후기에서 느낀 점
이번 오류는 단순한 오타 수준이라고 생각했지만 실제로는 GameMaker 내부 구조와 변수 초기화 개념이 연결된 문제에 가까웠습니다.
특히 Obj_rock에서 obj_rock으로 이름을 수정했는데도 오류 메시지가 그대로 출력되는 부분은 상당히 헷갈렸습니다.
이번 일을 겪으면서 게임 개발은 생각보다 디버깅 시간이 훨씬 길다는 말을 체감하게 되었습니다.
단순히 게임을 만드는 것보다 오류 원인을 찾는 시간이 더 오래 걸리는 경우도 많다는 걸 느끼게 되었습니다.
하지만 이런 실패 과정 자체가 결국은 실력으로 이어진다고 생각합니다.
실제로 직접 오류를 겪어보니 Create 이벤트와 Collision 이벤트의 차이도 이전보다 훨씬 이해가 잘 되기 시작했습니다.
마무리
이번 GameMaker 스페이스 록 제작은 완벽하게 성공한 프로젝트는 아니었습니다.
오히려 오류를 해결하지 못하고 중간에 다시 처음부터 만들어야 하는 실패 후기에 가까운 경험이었습니다.
하지만 직접 부딪혀보면서 변수 초기화, 오브젝트 생성 순서, 충돌 이벤트 구조 같은 개념을 조금씩 이해하게 되었습니다.
현재는 다시 가이드 영상을 보면서 처음부터 천천히 제작해볼 생각입니다.
다음에는 obj_game 변수 구조나 Room 배치 부분까지 더 꼼꼼하게 확인하면서 진행해보려고 합니다.
혹시 저처럼 GameMaker로 처음 게임 제작을 시작하신 분들이라면, 오류가 발생하더라도 너무 조급하게 생각하지 않으셨으면 좋겠습니다.
생각보다 많은 초보 개발자들이 비슷한 문제를 겪고 있다고 합니다.