전체 글

성장 과정 일기, 누군가에게 정보를 제공하기 위해서가 아닌 스스로 배운 내용을 정리하기 위해 작성하는 블로그 입니다. 잘못된 정보가 있으면 댓글로 적어주세요.
구조 정리 이전 포스팅까지는 Unity 2D 프로젝트를 다뤄봤다. 현재 프로젝트에서는 거기서 작업하던 서버를 수정하고 3D에 맞게(이동 동기화 등) 변화를 주어 사용할 것이다. 또한 서버의 코드는 직접적으로 오픈하진 않고 대략적으로 서술할 것이다. 서버의 구조는 총 3개와 같다. AccountServer SharedDB GameServer AccountServer는 웹 서버로 초기에 로그인과 회원가입, 그리고 서버 목록들을 출력하기 위한 용도이다. 게임서버에서도 이를 한번에 관리하면 쉽겠지만 Account 자체가 실시간, 주기적으로 소통을 해야하는 구조는 아니기 때문에 게임서버의 부담을 줄이고 DB를 나누기 위함이다. 그리고 AccountServer에서 사용하는 계정에 대한 정보를 GameServer에서..
대형 구조 관리 우리가 지금까지 만든 GameRoom 형태는 말 그대로 하나의 쓰레드가 Gamroom을 담당해 모든 연산, Job 방식으로 처리하고 있었다. 이를 더 넓은 영역에 대한 관리를 어떻게 해야할지 고민해보자. 심리스 MMO의 경우는 하나의 큰 GameRoom으로 관리할 수 있을지 의문이다. 왜냐하면 동접자 수가 수만명이 넘어가면 필히 렉이 발생하고 말것이다. 그렇다면 맵을 쪼개서 각각의 GameRoom으로 만드는건 괜찮을까? 이전보다 훨씬 나아질테지만 하나의 GameRoom안에 모든 유저가 모인다면 이 역시 문제가 발생할 것이다. 또한 서로의 GameRoom 경계에서 일어나는 일들을 관리해 주어야한다. A의 영역 B의 영역 사이에서 스킬을 사용하거나 플레이어끼리 데미지를 준다거나 등 의 브로드..
Reward 우리가 지금까진 한 방법은 테스트 하기 위해 프로그램이 시작 될 때 아이템을 강제적으로 플레이어에게 넣어두는 형식으로 했다. 이런 방법말고 이제 몬스터를 죽이면 아이템을 획득하게 해보자. 그렇다면 어떤 것이 추가되어야할까 일단 서버에서 OnDead를 몬스터에 추가해서 작업을 해야할 것이다. 또한 몬스터에서 드랍되는 아이템 등을 관리하기 위해서는 데이터 시트까지 추가적으로 관리를 해야만 한다. 그러기 위해 Data.Content에 Monster를 추가해보자. #region Monster [Serializable] public class RewardData { public int probability; // 100분율 public int itemId; public int count; } [Ser..
Item 아이템를 만드는 것은 쉽지 않다. 여러 과정이 필요한데 그 중 데이터 베이스 테이블 설계부터 해보자. [Table("Item")] public class ItemDb { public int ItemDbId { get; set; } public int TemplateId { get; set; } public int Count { get; set; } public int Slot { get; set; } [ForeignKey("Owner")] public int? OwnerDbId { get; set; } public PlayerDb Owner { get; set; } } add-migration을 통해 데이터베이스를 업데이트 해준다. 게임에 접속 했을 때 보유한 아이템들을 불러온다고 한다면 usi..
DB 연동 기존에 만들어 뒀던 서버 코드를 DB랑 연동해주자. C# ORM을 이용해서 DB 사용할 것이다. ORM 사용법은 구글링을 통해 알아두면 좋다. AppDbContext와 ModelData 클래스를 추가해준다. ModelData Class 안에 우리가 사용할 테이블들을 넣어준다. using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; using System.Text; namespace Server.DB { [Table("Account")] public class AccountDb { public int AccountDbId { get; set; } public string A..
Command 패턴과 Job 서버 게임룸에서 우리가 lock을 덕지덕지 사용해서 어마어마한 딜레이를 발생시킬 수도 있다. 그 문제를 우리가 해결해야하는데 그 방안으로 Command 패턴을 적용해보자. 즉 한마디로 게임 룸에게 일감을 던져주고 다른 쓰레드는 다시 원래 본업을 하러 가는 것이 핵심이다. 그렇기에 일감을 던져줘야하는데 그 일감들의 데이터, 실행할 함수를 저정할 클래스인 Job을 만들어준다. using System; using System.Collections.Generic; using System.Text; namespace Server.Game.Job { public interface IJob { void Execute(); } public class Job : IJob { Action _a..
Hp Bar 특별한 에셋을 사용하지 않을 것이고 Ui를 이용한 것이 아닌 그냥 2D sprite를 이용할 것이다. 하이어라키 창은 다음과 같다. 여기서 Bar의 X 스케일을 조절하면 hp가 줄어든 것처럼 보이게할 수 있다. 이는 실제 체력과 연동해야하기 때문에 스크립트를 작성해보자. using System.Collections; using System.Collections.Generic; using UnityEngine; public class HpBar : MonoBehaviour { [SerializeField] Transform _hpBar = null; public void SetHpBar(float ratio) { ratio = Mathf.Clamp(ratio, 0, 1); _hpBar.loca..
지금 시작하기 앞서 화살을 쏠 때 애니메이션과 연속적인 화살이 나가지 않는 버그가 있으니 그 부분만 수정하고 진행하겠다. public void UseSkill(int skillId) { if (skillId == 1) { _coSkill = StartCoroutine("CoStartPunch"); } else if(skillId == 2) { _coSkill = StartCoroutine("CoStartShootArrow"); } } 요 부분을 빼먹었기 때문이다. Data & Config 이번에 해볼거는 화살이 소멸될 때 플레이어나 몬스터에게 맞추면 데미지를 들어가게 할 것이다. 그런데 지금 서버나 클라에서도 하드 코딩 되어 있는 부분이 많다. 예를 들어 스킬id나 플레이어 처리 등 데이터를 하드 코딩 ..
스킬 동기화 저번 포스팅에서는 플레이어의 움직임을 방향, 또는 좌표가 변했을 경우 패킷을 만들어 서버에 보냈고 서버는 그 값을 모든 방에 있는 플레이어에게 브로드캐스팅을 해주었다. 이번에는 우리가 저번에 만들었던 플레이어 스킬들을 공기화 해보자. 우리가 움직임을 동기화 할때는 상황에 따라 두가지 경우, 클라 선처리와 클라 후처리 방식이 있었다. 지금 우리의 방식은 클라 선처리에 해당되는데 움직이는 경우가 빈번하게 발생하기 때문에 서버가 연산 속도를 따라 오지 못할 수 있으니(MMO RPG의 경우) 클라이언트에서 움직임을 처리하고 그 결과를 서버에 통보하고 검증하는 과정을 거쳤다. 그렇다면 스킬도 클라에서 관리하고 서버에 통보하는 식으로 해도 괜찮을까?? 해도 괜찮긴 하다만 움직임보다는 스킬 사용이 빈번하..
MyPlayer 분리 클라이언트에서 플레이어를 실질적으로 만드는 부분을 만들어보자. 우리가 이전에 PlayerController에서 키 입력 받아 플레이어를 조종 했다. 그런데 문제는 모든 플레이어가 PlayerController를 가지고 있으면 아마 한명이 움직이면 나머지 모든 플레이어도 움직일 것이다. 그러기에 자신의 플레이어만 분리를 할 필요가 있다. 이럴 경우에는 내가 조정하는 Player를 알기 위해 새로운 컴포넌트를 만들어서 결정하는 편이다. MyPlayerController를 만들어서 작업한다. ObjectManager에서 자신의 플레이어 일 때는 MyplayerController 객체를 추가하고 아닐 경우는 Playercontroller를 추가해서 입력을 막게끔 설계하면 된다. using ..
Mintriever
어제보다 성장한 나