Jasontreks Blog

DM 보내기

메세지는 텔레그램 챗봇에 의해 익명으로 전달됩니다. 답장을 받으려면 이메일을 입력하세요.
Send

스팀 출시

축제가 끝난 후 시험과 다른 연구과제로 인해 게임 프로젝트는 몇 달간 묻혀있었다. 하지만 1학년이 끝나고 겨울방학에 접어들면서 다시 꺼내볼 기회가 생겼다.

이번에 만든 게임은 지난 게임과 달리, 포트폴리오로 면접관에게만 보여줄 만한 것이 아니라 실제 사람들이 한 번씩을 플레이해볼 만한, 제품으로서의 퀄리티가 나왔다고 생각이 들었다. 자화자찬이긴 하지만 이대로 스토어에 나와도 다른 아마추어 인디 개발자들이 만든 다른 게임들에 비해 부족할 게 없을 거라 생각이 들었다.

출시 준비

우선 튜토리얼을 포함한 게임 내 모든 UI의 문장들을 영어로 바꾸는 작업부터 하였다. 글로벌 게임 시장인 스팀 스토어가 미국에 기반을 두고 있기도 하고 전 세계 사람들이 타깃이므로 공용어인 영어로 맞추는 것이 바람직하다.

그 다음엔 모르는 사람들끼리도 매치가 이루어질 수 있도록 공개 로비 시스템을 만들었다. Steam API에서 제공되는 기능인데, 개발자가 별도로 서버와 DB를 구축해 매칭 서버를 운영하지 않아도 Steam이 대신 운영해주기 때문에 Steam의 서버에 공개 로비로 등록해 친구 초대 없이도 모르는 사람끼리 매치가 이루어지도록 할 수 있다.

## 공개 매치 목록 가져오기
# 스팀에 등록된 공개 로비 리스트를 요청한다.
func refresh_public_list():
	if ui.vbcPublicList.get_child_count() > 0:
		for n: Node in ui.vbcPublicList.get_children():
			n.free()

	Steam.addRequestLobbyListDistanceFilter(Steam.LOBBY_DISTANCE_FILTER_DEFAULT)
	Steam.addRequestLobbyListFilterSlotsAvailable(1)
	Steam.requestLobbyList()

## 공개 목록 구성 이벤트
# Steam.requestLobbyList()의 응답으로 리스트 목록을 가져왔을 때 호출할 이벤트 등록.
# 로비 이름으로 참가 버튼 목록을 만든다. 
Steam.lobby_match_list.connect(
func(lobbies: Array):
    print(lobbies)

    for id: int in lobbies:
        var game_name = Steam.getLobbyData(id, "game")
        if game_name != "cannonball":
            continue

        var lobby_name = Steam.getLobbyData(id, "lobby_name")

        var btPublic := Button.new()
        btPublic.size.y = 50
        btPublic.text = lobby_name if lobby_name else str(id)
        btPublic.set_meta('lobby_id', id)

        btPublic.pressed.connect(_on_pressed_lb.bind(btPublic))

        ui.vbcPublicList.add_child(btPublic)
	)

## 원하는 로비 버튼을 누르면 그 Lobby ID로 참가할 로비를 설정한다.
## Join 버튼을 누르면 로비 참가가 이루어지고 게임이 시작된다.
func _on_pressed_lb(lb: Button):
	selected_public_lobby_id = lb.get_meta('lobby_id')
	ui.btFindPublic.text = lb.text
	ui.scPublicList.visible = false
	ui.btJoinPublic.disabled = false

Steamworks 파트너 등록

이제 본격적으로 Steam 측에 내가 게임을 출시할 것임을 알리기 위해 나의 신상 정보를 Steam에 등록해야 한다. Steamworks 가입이 그 과정이다.

  1. 앱 크레딧 결제

    앱 등록 비용으로 100달러를 결제해야 한다.
    Abstract art
  2. 신상 정보 등록

    나의 이름, 주소, 계좌, 신분증 등 여러 정보를 제출해야 한다.
  3. W-8BEN 발급 및 승인 대기

    W-8BEN은 외국인이 미국에 제출하는 세금 신고서 같은 것인데, 기입한 정보들로 양식이 자동으로 채워진다. 이 문서를 제출하면 최대 2주의 심사 기간을 기다려야 한다. 이 기간 동안 자신의 신분을 증명할 수 있는 문서와 그 문서를 들고 있는 셀카를 업로드하라는 추가 요청이 오므로 반드시 대시보드를 확인해야 한다.
    Abstract art
  4. 최종 승인

    스팀 측에서 최종적으로 Steamworks 파트너에 가입되었음을 알려준다.
    Abstract art

상점 등록 및 꾸미기

이제 스팀 스토어에서 보여질 내 게임의 페이지를 구성해야 한다. 기본적인 정보들로부터 시작해 게임 설명, 등급, 장르, 성인 또는 자극적인 콘텐츠 여부 등 매우 엄격한 기준들로 분류되는 게임 정보를 구성하고 나면 포스터나 로고, 아이콘같은 그래픽 에셋, 동영상 트레일러까지 완료해야 한다.

내 게임의 첫인상을 제공해주는 중요한 이미지들이기 때문에 좀 더 정성을 기울이는 것이 좋다.

스토어 페이지 구성이 완료되면 심사를 요청할 수 있다. 스토어 페이지는 그래픽 에셋이 기준에 맞는지, 설문 내용과 게임이 다른 부분은 없는지, 설명이 충분한지 등을 검토한다.

빌드 파일 업로드

Steam CMD라는 프로그램을 설치해 빌드 파일을 업로드할 수 있다. 실행파일(.exe)를 포함하는 필요한 모든 콘텐츠를 Steam 측 저장소에 업로드하는 과정이다.

먼저 두 개의 .vdf 파일이 필요하다. 각각의 파일에 앱 빌드에 대한 설정과 디팟 빌드에 대한 설정을 명시하고 Steam CMD에서 run_app_build app_build_4442940.vdf 명령어를 실행하면 빌드 파일이 업로드된다. 이때 Steam의 빌드 시스템도 마치 깃처럼 바이너리 파일에서 수정된 부분만 찾아내 변경사항을 적용하는 식으로 작동하기 때문에 새 버전을 업로드해도 필요한 만큼만 효율적으로 처리한다.

// app_build_4442940.vdf
"appbuild"
{
	"appid" "4442940"
	"desc" "fixed 26.03.10"
	"buildoutput" "C:\Users\Jason\Projects\CannonBall\output\"
	"contentroot" "C:\Users\Jason\Projects\CannonBall\content\"
	"setlive" ""

	"depots"
	{
		"4442941" "depot_build_4442941.vdf"
	}
}
// depot_build_4442941.vdf
"DepotBuildConfig"
{
	"DepotID" "4442941"
	"ContentRoot" "."
	"FileMapping"
	{
		"LocalPath" "*"
		"DepotPath" "."
		"recursive" "1"
	}
}

최종 승인 및 출시 확정

스토어와 빌드가 모두 승인되고 나면 최종 출시 버튼이 활성화된다. 이로써 스토어 페이지와 다운로드 링크가 공개적으로 표시되고 내 게임을 전 세계 모두가 다운받고 즐길 수 있게 된다.

Cannon Ball이 Steam에 출시된 순간

Cannon Ball 상점 페이지의 모습

Cannon Ball 스팀 상점 페이지 링크