초오오오오오짜개발자의낙서장
게임-토이프로젝트, auto defence 본문
게임 프로젝트 중 하나인 auto defense
게임 제목
- 오토 디펜스
기획 의도
- 간단한 게임을 만들어보고자 애니매이션 하는 친구와 협업해 게임을 기획.
- 모바일에서 서비스중인 ‘땡땡마법사’라는 게임을 모티브로 게임을 기획.
- 개발 여건을 생각해 여러 부분을 생략하고 간소화해서 핵심 구조만을 정리해 기획
컨셉
- 중세시대 마법사가 공격해오는 적(몬스터)를 막기위해 성벽위에 위치해 적을 섬멸
- 마법사는 물, 불, 바람, 땅 4가지의 속성을 사용
- 마법사는 기본 공격으로 매직 미사일(투사체)을 사용
- 몬스터가 접근해 마법사가 위치한 성벽을 공격하고 성벽의 내구도가 다되면 게임 종료
주요 플랫폼(지금은 생각 x)
- 1순위 PC
- 모바일(가능하면)
- 전체적인 사양은 크게 필요하지 않을 것으로 판단.
- 최우선 목표는 PC로 구현하기
게임의 특징
- 방치형 게임을 모티브로 했지만 사용자의 개입이 필요하도록 난이도를 설계
- 기본 공격을 제외한 4가지 속성을 사용자가 직접 사용하거나, 오토 모드를 선택하면 자동으로 사용하도록 설정
게임의 기본 구성
- 사용자 쪽으로 45’ 기울어진 탑뷰 형식
- 성벽 위 가운데에 마법사 배치
- 마법사가 가장 가까운 적에게 매직 미사일 시전
- 몬스터를 처치하고 얻은 재화(골드)로 스킬을 업그레이드
- 스킬은 물, 불, 바람, 땅이 있음
- 물 – 시전한 범위의 적에게 디버프(슬로우) 적용 + 일정량의 데미지 (LOL 애니비아 궁 모티브)
- 불 – 시전한 범위의 적에게 큰 데미지를 적용 + 도트딜( 폭발 후 화염 장판)
- 바람 – 시전한 범위의 적에게 일정량의 데미지 + 넉백 ( LOL의 나미 궁 모티브)
- 땅 – 시전한 범위에 벽을 설치해 적을 오지 못하게 만듬 (LOL의 애니비아 빙벽 모티브)
- 초기 버전은 10스테이지까지
- 몬스터 타입 : 근거리(고블린, 오크?), 원거리(고블린 투석병, 오크 투석병) (모델링 에셋이나 애니메이션있으면 적용 없으면.. 적당한 오브젝트 찾기)
테크 to do list
- Must to do
- 씬 생성
- 게임 준비 화면
- play 버튼 배치, 버튼을 누르면 게임 플레이 화면으로 전환.
- 게임 플레이 화면
- 맵 구현
- 현재 스킬렙 상태, 스킬의 쿨타임 시간 표현
- 레벨업 시 어떤 스킬을 강화할지 선택하는 화면
- 스킬 버튼4개중 하나를 누르를 방식으로 구성
- 게임 종료 화면
- 몬스터
- 화면 위 사용자가 보이지 않는 영역에 몬스터를 무작위 위치로 스폰 (monster generation)
- 성벽쪽으로 이동하는 기능 구현
- 성벽에 가까이 갔을때 성벽을 공격하는 기능 구현
- 공격했을때 성벽 체력 감소(성벽의 체력이 0 이하가 되는지 확인하는 부분은 어디에 붙혀야 최적화가 될까..?)(성벽이 가지고 있는게 맞다)
- 플레이어
- 몬스터가 플레이어가 인지할수 있는 범위 내로 들어오면 공격 대기 큐에 등록
- 공격 대기 큐 중에서 성벽과 가장 가까운 몬스터 위치를 최선으로 갱신 (갱신 주기는 공격(스킬사용 시) 마다)
- 공격 시퀀스 쿨타임이 찰때마다 공격 대기 큐에 최상단에 있는 적을 대상으로 공격을 시작
- 스킬들과 기본 공격들의 쿨타임은 별개
- 스킬 레벨업시 데미지 증가 쿨타임 감소(제한을 둬야 게임 안터질거 같음. 아마?), 시전 영역 증가(점진적으로 증가)
- 불스킬 : 마우스 커서를 중심으로 (반지름 : skill_fire_Radius) 크기의 원형 지역에 폭발 데미지 , 불 장판(시간 : skill_fire_floor_time , 도트 딜 : skill_fire_floor_dot_deal) 시전 스킬 레벨에 따라 시전 영역 증가, 데미지 증가.
- 물 스킬 : 마우스 커서를 중심으로 (반지름 : skill_water_Radius) 크기의 원형 지역에 물벼락 데미지, 물 장판 (시간 : skill_water_floor_time, 슬로우( skill_water_floor_slow_percent)) 시전. 스킬 레벨에 따라 시전영역 증가 슬로우 정도 증가
- 바람 스킬 : 마우스 커서를 중심으로 (길이: skill_wind_width) 크기의 직사각형 영역이 천천히 위로 이동하면서 몬스터를 밀어내고 데미지를 준다. 넉백은 중복이 되지 않음. 스킬 레벨에 따라 밀어내는 거리, 스킬 시전 영역이 달라짐.
- 땅 스킬 : 마수그 커서를 중심으로 (길이 : skill_ground_width) 크기의 직사각형 영역이 생성되어 몬스터의 진로를 가로막음. 가로막힌 몬스터는 움직이지 않고 멈춰있음. 몬스터의 몸체가 벽에 충돌시 멈춤. 스킬 레벨에 따라 벽의 길이가 증가.
- Nice To do
- 씬 생성
- 게임 플레이 화면
- 맵구성에 디자인적 요소를 추가해 디테일적으로 있어보이게 구현
- 몬스터
- 몬스터 어셋을 찾아서 모델링과 텍스처 이동모션, 공격모션 적용
- 플레이어
- 스킬 이펙트 어셋 찾아서 적용해보기
- 플레이어 어셋 찾아서 모델링 적용
* 피드백
- 10/16
- 구현에 대한 디테일이 필요하다.
- 미리 정할수 있는 부분이 있으면 정하자
- 시각적으로 표시해놓은 그림 같은걸로 표시
- 키 바인딩 작업
- 스킬 단축키 설정(Q,W,E,R)
- 불 : Q
- 바람 : W
- 물 : E
- 땅 : R
- 게임 루프 구현(시작과 끝)
- 시작화면
- 시작 버튼 배치
- 종료 버튼 배치
- 게임 씬
- 준비단계
- 스테이지 정보 표시 (단계 표시, 몬스터가 총 몇마리 나올지 표시)
- 웨이브 단계
- 시작
- 스테이지 시작이라고 표시
- 끝
- 스테이지 끝이라고 표시
- 맵 제작
- 스폰 위치
- 플레이어의 화면 기준으로 상단에 구현해 보이지 않는 곳에서 스폰 한다음 이동하는식으로 자연스럽게 보이게
- 공격 위치
- 사용자가 볼수있는 모든곳은 공격이 가능한 위치
- 몬스터 제작
- 몬스터 스폰 시스템(스포너)
- 스폰위치 영역에서 무작위 위치로 몬스터를 스폰
- 몬스터를 스폰하는 시간 간격 설정 (monster_spone_cooltime)
- 어떤 종류의 몬스터(근거리, 원거리)가 스폰될지 정하기 (랜덤하게? 아니면 사전에 정의?)
- 몬스터
- 근거리 공격 몬스터
- 공격
- 몬스터가 성벽과 접촉할때 공격을 시작 -> 성벽 체력 감소
- 공격 쿨타임
- 피격
- 몬스터가 플레이어로 부터 데미지를 받았을때
- 체력 감소
- 원거리 공격 몬스터
- 공격
- 몬스터와 성벽간의 거리가 일정간격(맵 크기를 보고 정하기)일때 멈춰서 공격 -> 성벽 체력 감소
- 공격 쿨타임
- 피격
- 몬스터가 플레이어로 부터 데미지를 받았을때
- 체력 감소
- 이동
- 목적지
- 성벽으로 이동
- 캐릭터로 묶을수도 있다
- 플레이어
- 공격
- 자동 공격(passive)
- 매직미사일
- 프로젝타일
- 원통형의 오브젝트가 지정한 대상에게 나아간다
- 실시간(?) 루프 돌때마다(?) 적 위치 변경에 따른 목적지가 변경되어 이동한다
- 속도
- passive_attack_object_speed
- 대상 지정
- 지정 조건
- 범위 내 접근
- 성벽과 가장 가까운 적을 우선 타겟팅
- 공격 주기
- 공격 쿨타임 설정
- 스킬사용(active)
- 스킬의 형태 잡기
- 오브젝트의 설치 형태
- 불 : 원형 오브젝트 설치
- 물 : 정사각형 오브젝트 설치
- 바람 : 직사각형 오브젝트 설치 후 오브젝트가 일정거리 위로 이동
- 땅 : 직사각형 오브젝트 설치
- 스킬 스탯
- 대미지
- 불 : 최초 폭발시 (100 * skill_level), 불바닥 위에 있을때 대미지 (5 * skill_level)
- 물 : 최초 시전시 (50 * skill_level)
- 바람 : 설치 후 몬스터에게 넉백을 할때마다 데미지 (10 * skill_level, 몬스터 넉백시)
- 땅 : 데미지 존재하지 않음
- 쿨타임
- 불 : 10초 - (0.5초 * skill_level)
- 물 : 10초 - (0.5초 * skill_level)
- 바람 : 10초 - (0.5초 * skill_level)
- 땅 : 10초 - (0.5초 * skill_level)
- 영역
- 불 : 원형(크기는 맵 정하고 설정, 맵 사이즈에대한 감이 없음), 스킬 레벨에 따라 반지름 (1+0.N)배 증가
- 물 : 원형(크기는 맵 정하고 설정, 맵 사이즈에대한 감이 없음), 스킬 레벨에 따라 반지름 (1+0.N)배 증가
- 바람 : 직사각형 (크기는 맵 정하고 설정, 맵 사이즈에대한 감이 없음), 스킬 레벨에 따라 장변 (1+0.N)배 증가
- 땅 : 직사각형 (크기는 맵 정하고 설정, 맵 사이즈에대한 감이 없음), 스킬 레벨에 따라 장변 (1+0.N)배 증가
- 공격 지속 타입(Tag)
- 일회성(one_time)
- 한번의 오브젝트 충돌로 사라지고 효과를 줌.
- 지속성(persistence)
- 오브젝트가 일정 시간 동안 유지, 지속 되는것
- 공격주기
- 스킬 모양
- 밀어내기
- 적용 방식(스킬을 모듈화)
- 단일(기본공격)
- 프로젝타일
- 몬스터에 닿는 순간 사라짐
- 사라짐과 동시에 몬스터의 체력을 감소
- 도트 딜
- 프로젝 타일(투사체?)
- 일회성
-
- 지속성
- 도트딜
- 데미지를 주는 오브젝트와 닿아있으면 몬스터에게 데미지를 줌
- 데미지를 주는 오브젝트에게 몬스터 오브젝트의 정보가 저장이 되며 충돌 쿨타임 시작
- 쿨타임이 0 이하가 되면 몬스터 오브젝트와 데미지를 주는 오브젝트의 충돌을 검사 다시 몬스터에게 데미지를 줌
- 쿨타임이 지나도 몬스터가 없으면 데미지를 주는 오브젝트에서 몬스터 오브젝트의 정보 삭제
- 레벨에 따른 수치 증가
- 수치
- 방식
- 종류
- 일반공격
- 프로젝타일을 생성하고 목적지 or 목적 object
- 불
- 효과
- 물
- 효과
- 바람
- 효과
- 땅
- 효과
- 스킬 관련 스텟
- 기타
- 스킬에 사용되는 오브젝트
- 생성되어있는 시간
- 이동하는 방향
- 이동하는 속도
-
- UI 따로
- 시작화면
- 준비화면
- 웨이브 화면
- 맵