Unity/온라인 RPG

MyPlayer 분리 클라이언트에서 플레이어를 실질적으로 만드는 부분을 만들어보자. 우리가 이전에 PlayerController에서 키 입력 받아 플레이어를 조종 했다. 그런데 문제는 모든 플레이어가 PlayerController를 가지고 있으면 아마 한명이 움직이면 나머지 모든 플레이어도 움직일 것이다. 그러기에 자신의 플레이어만 분리를 할 필요가 있다. 이럴 경우에는 내가 조정하는 Player를 알기 위해 새로운 컴포넌트를 만들어서 결정하는 편이다. MyPlayerController를 만들어서 작업한다. ObjectManager에서 자신의 플레이어 일 때는 MyplayerController 객체를 추가하고 아닐 경우는 Playercontroller를 추가해서 입력을 막게끔 설계하면 된다. using ..
멀티플레이 환경 구성 이제부터는 유니티를 멀티 플레이 환경에서 처리하기 위해 작업을 할 것이다. 이전 포스팅에서 작업했던 서버를 가져오는 과정에서 이미 goole protobuf를 이용해 어느정도 패킷을 손쉽게 처리 해놓은 상태임을 감안하자. 일단 패킷을 만들고 보내는 것을 자동화부터 한 후에 멀티플레이 환경을 작업하자. public void Send(IMessage packet) { string msgName = packet.Descriptor.Name.Replace("_", string.Empty); MsgId msgId = (MsgId)Enum.Parse(typeof(MsgId), msgName); ushort size = (ushort)packet.CalculateSize(); byte[] sen..
Patrol AI 기본적인 몬스터 AI를 만들어 볼텐데 AI 기능이 엄청 많아지는 경우에는 AI 클래스를 따로 설계해서 추가하는 것이 좋고 그게 아니라면 MonsterController에 추가하는 것이 좋다. 하지만 결국에는 서버에서 연산을 하고 클라는 통보만 받기때문에 나중에는 서버쪽으로 관련 코드를 옮겨야 할 것이다. using System.Collections; using System.Collections.Generic; using UnityEngine; using static Define; public class MonsterController : CreatureController { Coroutine _coPatrol; Vector3Int _destCellPos; public override C..
평타 간단히 컨텐츠를 준비하기 위해 평타를 구현해보자. 그렇다면 이것을 어디에 구현해야할지 또 고민이 된다. PlayerController에 넣는게 제일 좋은 생각이라는게 든다. 왜냐하면 모든 Creature가 공격을 하진 않을거기 때문이다. Skill이 수백개 처럼 엄청 많으면 전문적으로 스크립트를 만들어서 관리하는게 낫겠지만 지금처럼 평타하나만 만드는경우 클래스를 계속 만드는것보다 만들다가 분리하는게 좋다. 또 스킬을 쓸 때, 쿨타임이 있고 후딜이 있게끔 구현해야하기 때문에 Coroutine을 이용할 것이다. 피격은 지금 처리하지 않고 나중에 처리할 것인데 일단 Log만 찍어보자 using System; using System.Collections; using System.Collections.Gen..
MapManager 우리 그전에 지나갈 수 없는 맵을 서버랑 교환하기 위해 작업을 했다. 이제는 실제로 그 값을 가지고 코드를 추가해 충돌이 일어나게 해보자. 이것을 전역으로 Manager가 조절할 수 있으면 좋겠다고 생각이든다. MapManager는 실시간으로 맵을 로드하거나 저장하고 갈수 있는 영역과 아닌 영역을 구분하는 역할을 할 것이다. 먼저 일단은 맵을 맵 id에 따라 추가하는 것을 만들었다. 프리팹으로 저장된 Map_000 꼴의 맵들을 불러오는 것이다. 그리고 CanGo 함수를 통해 이 부분이 지나갈 수 있는 영역인지 아닌지를 확인하고 플레이어를 이동하게 하면된다. using System.Collections; using System.Collections.Generic; using System..
세팅 기존에 만들었던 C# 서버와 유니티 클라이언트 공부(블로그에 없음)를 위해 제작한 유니티파일을 하나로 합쳐서 진행할 것이다. 버전은 2019.3.15f1을 이용했고 파일 구조는 다음과 같다. 클라이언트와 서버 폴더를 각 이렇게 관리하지만 실제로 큰 작업을 할때는 서버랑 클라를 같이 두진 않긴하다. 사용할 에셋은 유니티 에셋스토어에서 무료로 사용가능한 Tiny RPG과 Tiny RPG Environment를 이용한다. Tiny RPG - Forest | 2D Characters | Unity Asset Store Tiny RPG - Forest | 2D 캐릭터 | Unity Asset Store Elevate your workflow with the Tiny RPG - Forest asset from..
북마크 룩업 Index Scan과 Index Seek에서 Scan을 사용하면 일반적으로 나쁜것이지만 항상 나쁜것은 아니다.(찾으려는 데이터를 order by했을 경우) 또, Seek를 사용하면 일반적으로 좋지만 항상 좋은것은 아니다. 그런데 의문은 빨리 찾기 위해 인덱스를 활용하는데 어떻게 느릴 수가 있을까?? Clustered와 NonClustered는 큰 차이점이 Leaf Page에 실질적인 데이터가 있고 없고의 차이가 있다. 그렇기 때문에 Clustered의 경우 Index Seek가 느릴 수가 없다. 하지만 NonClustered의 경우 데이터가 Leaf Page에 없으므로 한번더 타고 가야한다. 1. RID -> Heap Table을 찾아가는 것 2. Key -> Clustered를 찾아가는 것..
지금까지 포스팅을 통해 SQL의 기초를 다뤄봤다. SQL을 사용하여 데이터베이스를 설계할 때 문제는 바로 성능이다. 수천명 수만명의 유저들이 사용하기 때문에 이 성능이 절대적으로 좋아야만 한다. 그래서 SQL의 성능을 분석하고 개선하는 튜닝에 대해 알아보자. 인덱스 분석 시작하기 앞서 구글에 northwind database를 검색해 깃헙에서 다운받아주자. sql을 처음할때 사용하는 아주 대표적인 데이터베이스이다. 여기에 나오는 명령어는 정말 몰라도 된다. 단순히 분석히가 위한 코드로 매우 비효율적이게 바꾸는 부분도 있다. USE Northwind; -- DB 정보 살펴보기 EXEC sp_helpdb 'Northwind'; -- 임시 테이블 만들자 (인덱스 테스트용) CREATE TABLE test ( ..
정규화 정규화는 데이터베이스를 설계하는데 매우 중요한 개념이다. 1,2,3,4 정규화가 있지만 그 것을 알기보다는 그것을 이해하기 보단 정규화를 통 틀어서 정규화가 무엇인지 아는것이 더 중요하다. 또한 자연스럽게 설계하다보면 정규화가 되어있는 경우도 있다. 정규화를 한마디로 나타내면 테이블을 올바르게 변경하고 분할하는 것 이라고 할 수 있다. 직관적으로 이해가 되지 않을 수 있으니 예를 들어보자. RPG를 설계한다고 해보자. 데이터베이스를 처음 만드는 사람의 공통된 문제는 데이터를 한 곳에 다 넣는 경우가 가장 많다. 위의 사진에서 문제점은 일단 인벤토리를 문자열로 저장하는 것이 문제점이다. 그래서 이것을 해결하려면 아이템 마다 고유의 아이템코드를 정한 뒤 그것을 저장하는 식으로 간다. 즉 반복되는 데이..
GROUP BY 그룹을 묶어서 처리를 하면 더 편할 것을 우리는 당연히 알고 있다. 만약 2004년에 가장 많은 홈런을 날린 팀은?? 이라는 질문에 어떤 Qurey를 날려야할까. 지금까지 배운 지식으로는 해결할 수 없다. 그렇다면 그룹을 묶는 Group By에 대해 알아보자. SELECT * FROM batting WHERE yearID = 2004 GROUP BY teamID; 이렇게 하면 팀 소속별로 데이터가 묶일 수 있을까?? 안된다. 그 이유는 * 때문이다. teamID를 기준으로 하나로 묶는것까진 괜찮은데 그 중 playerID 등 어떤 값을 출력해야하는지 모르기 때문에 에러가 난다. 그룹을 묶었을 때는 집계함수 등 만 사용가능하다. 또한 Group By 절이 없기 때문에 사용할 수 없다. SE..
Mintriever
'Unity/온라인 RPG' 카테고리의 글 목록 (4 Page)