실시간 전세계에서 몰리는 경기 순위
순위 오즈
1 네덜란드 1.25
2 이집트 1.44
3 웨일즈 1.02
4 세네갈 1.40
5 알제리 1.50
종목별 팀순위
1 첼씨 8 6 1 1 19
1 첼씨 8 6 1 1 19
1 첼씨 8 6 1 1 19
1 첼씨 8 6 1 1 19

스압) 광고가 꼴받아 직접 만든 게임 일지 -1~10-

작성자 정보

  • 커뮤맨 작성
  • 작성일

컨텐츠 정보

본문


문제의 그 광고, 실제 게임과 연관도 없고, 심지어 멀티플레이 게임도 아님

하지만 평소 온라인 게임 개발에 관심을 갖던 본인이 직접 만들어 보기로 결심함



TCP 소켓 서버와 유니티로 프로토타입1 제작, 컨텐츠 부분에서 부족한거 같다.

멀티 게임을 혼자하는 것도 크겠지만 (다른 한명은 봇) 재미를 찾기가 어렵다.

여타 다른 뱀서라이크 장르 게임들 처럼 다른 무기, 스킬들을 마구잡이 식으로 넣어 보았다.



리소스들은 무료 에셋과 세일할때 건진 에셋들을 활용하였다.

UI는 확실히 개선이 필요한데 아직 고민중이다.


[게임 진행방식]

- 처음엔 회전하는 검하나로 시작하여, 몬스터 및 다른 플레이어를 잡아 경험치를 획득하고 레벨업 할때마다 장비를 선택해 강해지는 방식

- 사망시 다시 1레벨 부터 시작

- 몬스터 및 플레이어에게 충돌이 가능하여 포위될 시 대쉬를 통해 빠져나와야 함


[장비 목록]

- 검 (Sword) : 기본적으로 플레이어 주위를 회전하며 주변 적에게 데미지를 주는 무기, 업그레이드시 데미지 및 갯수 증가

- 단검 (Dagger) : 바라보는 방향으로 투사체를 던짐, 업그레이드시 데미지, 갯수 및 사거리 증가 (프로그래밍 단계에선 단검으로 했으나 사용중인 에셋은 화살이라 이름 변경 예정)

- 불(Fire) : 일정 주기로 플레이어를 중심으로 폭발하여 넉백 및 데미지를 줌, 업그레이드시 폭발 범위, 데미지 증가 및 폭발 주기 감소

- 얼음(Ice) : 일정 주기로 플레이어 주변 랜덤 구역에 얼음 지대를 만듬, 업그레이드시 데미지, 지속시간 갯수 증가 및 주기 감소

- 땅(Earth) : 랜덤 방향으로 투사체를 던짐, 업그레이드시 데미지 및 갯수 증가

- 번개(Lightning) : 플레이어 주위를 회전하며 일정 주기마다 데미지를 준다, 업그레이드시 데미지 및 갯수 증가

- 공기(Air) : 플레이어가 주위 4방향으로 토네이도를 날림, 업그레이드시 데미지 증가

- 빛(Light) : 주위 랜덤 적에게 데미지를 줌, 업그레이드시 데미지 및 갯수 증가

- 어둠(Dark) : 일정 주기마다 플레이어 주위를 빠르게 도는 구체 생성, 업그레이드시 데미지 및 갯수 증가

- 독(Poison) : 플레이어가 지나가는 길마다 독 지대를 생성, 업그레이드시 지속시간 및 데미지 증가

- 버섯(Mushroom) : 플레이어 공격력 증가

- 방패(Shield) : 플레이어 방어력 증가

- 하트(Heart) : 플레이어 최대체력 증가

- 목걸이(Necklace) : 경험치 획득량 증가

- 신발(Shoes) : 대쉬 쿨타임 감소

- 자석(Magnet) : 아이템, 경험치 획득 범위 증가

- 클로버(Clover) : 행운 증가, 행운에 따라 장비 선택 가지수 증가, 추후 크리티컬을 추가할지 고려중

- 책(Book) : 장비의 공격 주기 감소

- 장갑(Glove) : 장비의 공격 속도 증가, 현재는 미구현

- 반지(Ring) : 장비의 갯수


아직 갈길이 멀고 테스트 해볼것도 많지만 슬슬 정리가 필요할거 같아 일지를 작성해 봅니다.

부족한 실력이지만 언젠가 완성시켜 보겠습니다. 감사합니다.

피드백, 훈수, 아이디어, 질문 언제나 환영


광고가 꼴받아 직접 만든 게임 일지 -2-



지난번까지 한 것

- 기본 TCP 소켓 서버 및 게임 기능 구현

- 뱀서 라이크 장르를 위한 여러 장비 및 스킬 구현


이번엔 마구잡이로 넣은 코드들이 서버에 얼마나 무리를 주는지 확인해 봤다.


(서버로그도 개선을 해야할 필요가 있다..)


100명의 플레이어 약 1000마리의 몬스터 기준으로 서버렉이 심하게 걸리고있다

원인은 볼 것도 없이 몬스터의 길찾기 AI에 사용된 A*알고리즘일 것이 분명하다.



플레이어 업데이트문이 CPU사용량이 0.09% 검이 0.47%인데 비해 A*를 이용한 FindPath함수가 사용량이 8.21%나 된다.

A*알고리즘은 폐기하고, 다른 간단한 방법을 이용하기로 했다.

오른손으로 한쪽벽을 잡고 미로를 탐사한다면 언젠가는 출구에 도달한다는 오른손 법칙을 이용하기로 했다.(정식명칭이 이게 아닐수도있다...)

구현은 간단했다 플레이어한테 가는 방향이 막혀있다면 오른쪽으로 회전하고 다시 전진하는 방식이다.



서버렉은 확실히 줄어들었다. (슬라임이 플레이어 주위를 빙빙 도는게 거슬리긴하다...)

그래도 반응속도가 약간 느린게 패킷이 조금 밀리고 있는거 같다.

원인은 방금 A*의 부하를 확인하면서 찾아버렸다.




CPU 전체 사용량의 33%가 네트워크 태스크, 다른 33%가 룸 태스크(플레이어, 몬스터, 무기 등 게임 로직 관련), 남은 33% 메인함수인데



메인함수는 초기에 데이터 불러들이고, 서버 리스닝하고, 저 위에 코드로 태스크 만드는게 끝이다.

아무것도 없는 while문이 33%를 잡아먹고있는 것이다...

처음에 나중에 추가될 다른 태스크를 위해 비워둔 것으로 기억하는데 아마 데이터베이스 태스크를 위한 자리일 것이다.

멍청하게 까먹고 있었고, 매일 코딩하면서 보는 메인함수인데 이상함을 전혀 못느끼고 있었던거다.

저 while문에 네트워크 태스크를 넣어두고 다시 서버를 가동했다.



메인과 룸이 50%씩 나눠 돌아가기 시작했고 서버의 잔렉들이 없어졌다.



(검이 추가로 더 생길시 시야 전체에 데미지가 들어가는 버그가 있다...)

단판전인 뱀서라이크 특성상 DB는 필요 없을 것이다.

혹시나 해서 이상태로 A*알고리즘을 살려봐서 한번더 사용량을 확인했다



몬스터 업데이트문 안에있는 A*알고리즘 사용량 10.92%




A*가 없어진 몬스터 업데이트문 전체가 0.92%

너어는 없어져야하는게 맞다.

서버도 어느정도 안정화 했으니

음엔 UI, 인벤토리, 스킬쿨타임 같은 시스템 위주를 구현할 예정이다.


피드백, 훈수, 아이디어, 질문 언제나 환영


광고가 꼴받아 직접 만든 게임 일지 -3-



지난번에 한 것

- CPU부하를 심하게 잡아먹던 A*알고리즘 삭제 및 단순한 AI로 교체

- 서버 부하량 감소 작업 / 서버렉 최소화


이번엔 서버가 아닌 클라를 만져봤다.



먼저 인벤토리를 간단하게 구현했다.

Grid Layout Group을 이용해 1~5번 슬롯은 무기,스킬 6~10번 슬롯은 스텟 상승 패시브 장비를 할당해 줄 것이다.

해당 위치에 할당된 장비와 레벨에 맞는 이미지를 띄워 보여주는 간단간단한 인벤토리다. (정렬 및 순서가 필요없다!)

Dictionary에 장비를 Key로 레벨을 Value로 저장하고, 순회하면서 맞는 이미지(지금은 이미지가 없어서 텍스트로 대체됐다)를 찾아오는 방식으로 구현했다.



처음엔 비워져있고 장비를 획득할때마다 오른쪽부터 채워지며, 공격형은 윗줄 스텟형은 아래줄에 채워진다.

위치 조정은 아이콘을 그린후에 조정해야 할 것이다.




다음은 플레이어 랭킹을 나타내는 UI다. 1~3등 플레이어와 본인의 랭킹을 보여줄 예정이다.



플레이어가 3명이하일 때



실시간으로 업데이트 되는 랭킹, 현재 플레이어 이름을 정해주지 않아 서버에서 식별하기 위해 만든 아이디로 대체하였다.

레벨도 같이 보이면 좋을 것 같긴하다...

디자인과 배치는 미래의 디자인을 담당할 내가 할테니 지금 프로그래밍 하는 내가 신경 쓸 건 아니다.



다음은 맵이다.

기존엔 100*100 작은 Terrain 하나에서 플레이하고 테스트 했지만, 이번에 100*100 Terrain이 총 9개 즉 300*300의 맵을 제작했다.

나무와 물 같은 장애물도 배치 하였고, 이 맵 정보를 저장해서 서버로 가져가야한다.

장애물은 1 아닌것은 0으로 300행 300열의 txt 파일을 만들 생각이다.



일단 foreach문으로 9개의 Terrain과 그 안에 있는 Tree들을 순회 하면서, 해당 Tree의 Local좌표를 WorldSpace좌표로 변화하여

int[300,300] 배열에 해당 좌표의 값을 1로 바꿔주는 방식이다.

나무는 해결했지만 문제는 물이다. 원래는 SampleHeight를 사용해 일정 수준보다 높이가 낮으면 1로 바꿔줄려 했다...

근데 SampleHeight로 뽑아오는 높이 값이 이상하다...분명 WorldSpace좌표를 인자로 해당 위치의 Terrain 높이를 return하는 것으로 이해했는데

잘못 이해한거같다. 하지만 관련 자료도 많이없고, 그냥 맵을 데이터화하는건데 너무 많은 수고를 들이긴 귀찮아서

단순하게 물이 지나는 구역에 안보이는 나무들을 배치해서 해결했다.


이렇게 0과 1로 이루어진 텍스트들을 쭉 보다보면 왠지 내가 프로그래밍 고수 같아 보인다.(착각)


다음엔 새로운 몬스터들과 레벨 디자인에 대해 고민을 해야한다.

간단하게 플레이어는 맵에 왼쪽 아래에 스폰이 되고, 스폰장소에서 멀어질수록 강력한 몬스터가 나오는 디자인을 구상중이고

가장 큰 문제는 플레이어 끼리의 밸런스다.

레벨이 높아 만렙 장비를 둘둘해버린 플레이어의 독주를 막을 어떤 무언가가 필요하다.


[확인된 버그]

- 검이 생성되는 순간 시야 전체에 데미지를 주는 버그

- 종종 대쉬가 사용되지 않는 버그

- 레벨업 선택지가 더이상 없을때 서버가 멈추는 버그


피드백, 훈수, 아이디어, 질문 언제나 환영







광고가 꼴받아 직접 만든 게임 일지 -4-



지난번까지 한것

- 실시간 랭킹 UI (레벨 및 플레이어 이름 추가)

- 획득 장비 인벤토리

- 맵 확장 


영상을 찍다보니 여러 문제점들을 발견했다.

1. 시간이 경과 할수록 느려지는 서버 반응

2. 종종 씹히는 대쉬 스킬

3. 검이 추가되는 순간 시야내에 모든 범위를 공격


2번은 1번때문에 파생된 문제인거 같고, 시간이 지날 수록 서버 부하가 늘어난다는건

어떤 오브젝트가 사라질때 반환이 제대로 안되어 계속해서 업데이트문이 중복으로 실행중인거 같다. 

다시 CPU점유율을 체크 했고 범인은 금방 찾아냈다.


10분 시간 경과후 VisionCube의 점유율

초기 VisionCube 점유율


VisionCube는 플레이어 주위 일정 범위의 모든 오브젝트 정보를 갖고있어 해당 플레이어에게 오브젝트 정보가 담긴 패킷을 쏘아줄때 사용된다.

상시 필요한 녀석이기 때문에 플레이어가 죽어도 사라지지 않도록 냅뒀으나

플레이어가 부활할때마다 한번더 생성되어 똑같은 작업을 여러번 하고 있던 것이다.

1번이 해결되니 2번 현상이 거의 없어졌다.


3번은 공격 판정 알고리즘은 문제다.

현재 플레이어를 A, 검의 끝부분을 B, 다음 프레임에 위치할 검의 끝부분을 C, 상대방을 P라 했을때

삼각형 ABC에 P가 내부에 존재할 경우 공격 판정을 내렸다.

이 내부 존재 여부를 판별하는 알고리즘에 문제가 있었다.

원래는 벡터의 외적을 이용했다. 



먼저 선분 ab를 기준으로 점 p,q가 같은 영역에 있는지 판별하는 코드다.

외적값이 음수면 시계방향에, 양수면 반시계방향에 존재한다는 성질을 이용해

두 외적값의 곱이 양수가 나오면 같은 위치에 존재한다고 판단하여 True를 반환한다.

그리고 겹치는 것도 공격으로 판정하기위해 0도 포함시켰다. (여기가 문제다)



이를 이용하여 앞서 언급한 삼각형 abc와 점 p를 판별하는 코드다.

삼각형의 각 선분을 기준으로 점 p와 남은 삼각형 한 꼭짓점이 같은 영역에 있는지 판단하여 모두 true라면 공격판정을 했다.

킹론상 완벽 했지만, 검이 나타나는 순간 초기값...b와 c의 좌표가 (0,0) 으로 할당 되었을때가 문제다.(a는 플레이어의 위치라 상관없다)

0도 포함하여 판정했기때문에 b와 c가 0인 순간 p의 위치와 상관없이 모두 true를 반환해 모든 적에게 데미지를 주게되었다.

이는 b,c 좌표가 같을 경우 충돌 판정 안하도록 처리했다.


 


광고가 꼴받아 직접 만든 게임 일지 -5-


지난번에 한 것

- 서버 누수 문제 해결

- 검 초기 생성 버그 해결


이번엔 캐릭터 커마 기능을 구현하고자 한다.


세일해서 25달러 주고 산 에셋인데 기본 프리펩만 사용하긴 아깝지않은가

다행이 한 프리펩에 각 부위별 모델이 들어있긴해서 이것들의 SetActivate를 조정하는식으로 구현하고자 한다.

먼저 머리 16개, 몸 16개, 등 6개, 눈 16개, 입 16개로 나누어 총 5부위를 나누었다.

에셋내에 장신구 무기 등 더 많은게 있긴하지만 추후에 필요할시 추가하도록하고 일단 주요 부위만 구현하겠다.


닉네임 입력까지 포함하여 만든 임시 UI (구리다)

이제 이 커스터마이징 정보를 서버에 보내고 다른 플레이어도 알 수 있게 데이터화 해야한다.

단순하게 각 부위별 번호를 패킷 각각에 담아 보낼 수도 있지만

부위별로 16개 정도 되는데 int32에 각각 담아 보내는건 비효율적이다.

그리고 그에 맞는 패킷 포맷을 또 짜기가 번거롭다. (귀찮다...이게 중요하다...)


기존에 단순히 스텟만 다르고 역할은 똑같은 몬스터, 무기 등의 프리팹을 구분하기 위해 오브젝트 정보에 int32를 하나 만들었다.

플레이어는 다 같은 프리팹을 써서 딱히 안 썼는데 이걸 이용할 생각이다.



32비트의 int에 4비트씩 각 번호를 넣어주도록 했다. (부위별 커마 개수를 16개로 맞춘것이 그 이유다)



해독할때는 반대로 시프트 연산 후에 1111과 and 연산해줬다.

잘 되는지 테스트 해보자



잘 되는거 같다. 이제 게임에 접속할때 여기서 입력한 닉네임과 커마 코드를 서버에 전송하면 된다.



정확한 테스트를 위해 기존 봇들에게도 커마 코드를 랜덤으로 생성해줬다.



지난번과 달리 이제 다양한 룩의 봇들을 만날 수가 있다.

본인의 커마도 잘 적용되었다.


피드백, 훈수, 아이디어, 질문 언제나 환영






광고가 꼴받아 직접 만든 게임 일지 -6-


지난번에 한 것

- 캐릭터 커스터마이징


서버와 어느정도 기능 구현을 끝마쳐서 이제는 한번 빌드해서 초기 테스트를 진행하고자 한다.

빌드는 IOS, android, window 모두 준비해볼 예정이고, 서버는 포트포워딩해서 직접 연다.

테스트하기전 사전 준비를 해야한다.



먼저 UI를 개선을 했다. 모바일 환경에 사용가능한 게임 패드도 구현하고 기존 (구) InputSystem을 갈아 엎었다.



좌측 상단에 캐릭터 정면이 보이도록 구현했고, 몇개 임시 아이콘을 구해 인벤토리 시스템에 넣었다.

체력바가 감소할때 연한 색으로 서서히 감소하는 서브 체력바도 구현했다.(이것의 정확한 명칭을 모르겠다.)

이번주 지인들에게 배포해 테스트를 진행하고있다. 

모든 플랫폼에서 문제없이 동작이 확인된다면

밸런스, 컨텐츠 기획, 아트, 사운드 등 코딩이 아닌 다른 부가적인 것에 신경을 쓸때가 된다.




 


광고가 꼴받아 직접 만든 게임 일지 -7-


지난번에 한 것
- InputSystem 재구성 (모바일 대비)- 모바일 환경 UI 재구성- 알파 테스트 준비
테스트 실시 날짜가 다가왔다.window, IOS, Android, MacOs 플랫폼으로 빌드를 성공했고미리 섭외한 지인들에게 배포했고, 주말 동안 테스트를 해볼 예정이다.
https://youtu.be/fMYD8q-ClhE

 

온라인 뱀서라이크 개발 3

IOS, Android 연동 테스트

youtu.be

IOS : 아이폰14pro / Android S22 Ultra

둘다 구동에 문제없다. 연결도 문제없다.

그러나 안드로이드쪽의 핑이 종종 70이 넘어간다. 기기 문제인지 최적화로 해결 가능한지 알아봐야한다.





광고가 꼴받아 직접 만든 게임 일지 -8-


지난번에 한 것

- 초기 알파 테스트 : IOS, Android, MacOs, Window 빌드 확인 / 기기별 멀티 접속 및 핑 확인

ㄴ 기기별로 핑이 심하게 튀는 경우가 많았다. 

ㄴ 주로 오래된 모델일 수록 핑이 많이 튀는 경향이 있는걸로 봐선, 최적화가 더 필요해 보인다.


또다시 오랜만에 적어내는 일지다.

이번엔 클라와 웹, DB 통신을 구현하기위해 Firebase를 구축했다.

클라이언트가 firebase의 DB에 추가한 데이터를 TCP서버가 Rest API로 읽는 방식으로 구현했다. 


먼저 실시간 DB를 이용해 무기들의 커스터마이징을 구현했다.

방식은 간단하다. 각 무기(현재는 sword)에 보석을 박아 스텟을 강화하는 형태다.

보석 별로 올라가는 스텟과 내려가는 스텟을 구현했다.


아무것도 넣지 않은 순수 sword


속도를 낮추고 사거리를 늘린 sword


사거리를 낮추고 속도를 늘린 sword


장착 방식은 드래그 앤 드롭 방식으로 흔한 인벤토리 시스템이다.

보석 이미지는 현재 텍스트(아이템 코드)로 대체되어있다. 

지금 변경이 가능한 무기스텟은 공격력, 속도, 사거리, 쿨타임, 지속시간이다.

물론 무기마다 변경가능한 스텟은 조금씩 차이가 있고

추후엔 특수 기능을 추가할 수 있는 보석을 개발할 예정이다. (상태이상을 일으킨다거나, 타겟을 추적 한다거나)






광고가 꼴받아 직접 만든 게임 일지 -9-


지난번에 한 것

- Firebase 실시간 데이터베이스 연결

- 무기별 스텟 강화 기능 구현


이번엔 인게임 UI 디자인을 변경하였다.



디자인 초안은 이러하다.

대충 이런 느낌으로 이미지들을 만들어 유니티 내에 적용할 것이다.


- 변경된 대쉬 쿨타임



- 변경된 2개 선택지의 애니메이션 및 디자인


- 변경된 3개 선택지의 애니메이션 및 디자인


- 변경된 4개 선택지의 애니메이션 및 디자인


- 변경된 5개 선택지의 애니메이션 및 디자인


- 전체 인게임 플레이


추가적으로 자잘하게 구현하고 변경한것이 있다.

- 데미지 숫자 표기 추가

-  라이트닝 이펙트 조정 및 색상 변경 / 구체는 계속 남아있도록 변경

- 어둠 구체 크기 감소 및 생성 거리 증가

- 무기 및 악세사리 획득시 UI에 새로 생성됨 / 기존엔 10칸이 미리 나타나있고 이미지를 교체 했던 방식 



광고가 꼴받아 직접 만든 게임 일지 -10-


이번엔 메인 화면의 UI/UX를 수정하였다.


먼저 메인화면이다.

플레이어 닉네임, 보유 골드를 보여주며

상점, 무기, 아바타, 설정, 게임시작, 닉네임 수정으로 구성을 나눴다.



상점 화면이다. 인게임 결제 시스템은 구현하지 않았으며, 아직은 조촐한 모습이다.


임시 상자 애니메이션, 현재 더 나은 애니메이션으로 교체하기위한 작업중이다.



무기 화면이다. 젬으로 일정 수치를 조정 가능하다.


아바타 화면이다.

부위별로 보유하고있는 아바타로 변경 가능하다.

변경창이 나오는 애니메이션은 바꿔야할지 고민중이다.


이외에도

설정, 인게임 설정, 인게임 데스화면, 로그인, 회원가입, 애플 로그인, 구글 로그인 등이 구현 됐으며,

플레이스토어는 통과 됐지만, 앱스토어는 거부 당해서 검토중에 있다.







관련자료

댓글 0
등록된 댓글이 없습니다.
전체 33,007 / 1 페이지
번호
제목
이름
    • 1
      다아라
      267,792 P
    • 2
      GodGhs
      213,524 P
    • 3
      돈뱅석
      186,762 P
    • 4
      jym0405
      146,387 P
    • 5
      곽두철이다
      143,223 P
    • 6
      사탕
      131,900 P
    • 7
      성민
      120,950 P
    • 8
      오늘만사는사람
      120,893 P
    • 9
      이재림
      115,653 P
    • 10
      엄지
      105,000 P
    • 1
      이재림
      LV. 44
    • 2
      GodGhs
      LV. 41
    • 3
      돈뱅석
      LV. 41
    • 4
      다아라
      LV. 32
    • 5
      역삼동
      LV. 32
    • 6
      robin
      LV. 32
    • 7
      럭키비키데이
      LV. 32
    • 8
      minmin
      LV. 31
    • 9
      눈보라
      LV. 31
    • 10
      소년소녀백성
      LV. 31
알림 0