분류 전체보기 267

Packet Generator #4

이번 포스트에서는 자동으로 생성된 패킷을 세션에 일일이 복사 + 붙여넣기 하는 방식을 수정하겠습니다.이전까지 PacketGenerator를 빌드하게 되면,아래와 같이 실행파일이 생성 + 동작하여 패킷을 생성하였습니다. 이제 새로 bat 실행 파일을 만들어 bat 파일을 실행하면 Client와 Server의 폴더 안에 패킷을 만들어주는 작업을 수행하겠습니다. 1) PacketGenerator...class PacketGenerator{ static string genPackets; static ushort packetID; static string packetEnums; static void Main(string[] args) { string pdlPath = "....

C# 2025.01.08

Packet Generator #3

이번 포스트에서는 Packet의 포맷이 아닌Packet을 담고 있는 파일 그 자체의 포맷을 만들도록 하겠습니다.추가적으로 byte 자료형에 대한 처리와 자료구조 안에 자료구조가 있는 경우도 어떻게 처리되는지 확인해보도록 하겠습니다. 1) PacketFormat class PacketFormat { public static string fileFormat =@"using System;using System.Collections.Generic;using System.Net;using System.Text;using ServerCore;public enum PacketID{{ {0}}}{1}"; // {0} 패킷 이름 // {1} 패킷 번호 p..

C# 2025.01.08

2D RPG - (14) 분신술 스킬 구현

이번 포스트에서는 첫번째 스킬 중 분신술을 구현해보겠습니다.분신술을 위한 키를 따로 설정하지 않아 대쉬에 연동하여 발동하는 스킬로서,분신은 적을 발견하면 적을 공격하게 됩니다. 분신술은 다음의절차에 의해 수행됩니다.플레이어가 입력하면 SkillManager에 의해 분신술을 수행수행된 분신술에서 이전에 만들고 설정해놓은 분신 Prefab을 생성분신 Prefab에 설정된 컴포넌트에 의해 로직을 수행위의 절차에 맞춰 코드를 알아보겠습니다. 1) SkillCloningpublic class SkillCloning : SkillTemplate{ [Header("Clone Info")] [SerializeField] private GameObject _clonePrefab; [Serialize..

Packet Generator #2

이번 포스트에서는 패킷을 자동으로 생성하는 과정에서 패킷에 포함되어 있던구조체와, 구조체를 담은 자료구조까지 패킷에 포함시켜 생성해보도록 하겠습니다.기존의 코드에서 일부 변경사항이 추가되었고,마지막에는 기존의 세션에서 사용하던 패킷 코드를 자동 생성된 패킷으로 교체헤보도록 하겠습니다.염두할 변경사항으로는 기존의 StatInfo로 사용하던 구초제 이름을 Stat으로 변경한 것입니다. 1) PacketGeneratorclass Program{ static string genPackets; static void Main(string[] args) { XmlReaderSettings settings = new XmlReaderSettings() { I..

C# 2025.01.07

Packet Generator #1

이번 포스트부터 패킷 자동화를 수행하도록 하겠습니다.이때 패킷의 구조에 관한 서술은 xml과 같은 외부 파일에 정의하도록 하겠습니다. 1) 패킷 구조 XML  2) 패킷을 자동으로 생성하는 PacketGeneratorclass PacketGenerator{ void Main(string[] args) { XmlReaderSettings settings = new XmlReaderSettings() { IgnoreComments = true, IgnoreWhitespace = true, }; using (XmlReader reader = XmlReader.Create("PD..

C# 2025.01.07

2D RPG - (13) 스킬 시스템 구현을 위한 사전설정

이번 포스트부터는 RPG에서 사용가능한 스킬 시스템을 만들어보겠습니다.스킬 시스템은 크게 2가지로 동작하는데,스킬에 필요한 애니메이션과 각 스킬의 스크립트의 2가지로 구성되어 동작하게 됩니다.이때 스킬 시스템은 캐릭터에 종속적이지 않고싱글톤으로 동작하는 SkillSystemManager에 의해 동작할 예정입니다. 1) 기존의 문제를 수정기존에 사용하던 몬스터가 전투를 수행하기 위한 전투 상태 돌입의 코드에서FindObject 함수를 통해 플레이어를 탐색하고 있었습니다. 유니티의 FindObject는 언리얼 엔진과는 다르게 매우 비효율적이므로Player를 담당하는 PlayerManager를 생성해 이를 해결하도록 하겠습니다. 1 - 1) PlayerManagerpublic class PlayerManage..

직렬화(Serialization) 4

이번에는 패킷안에 스탯과 같은 구조체가 존재하고이 구조체의 인스턴스를 저장하는 자료구조가 있는 경우에Read와 Write를 수행할 수 있도록 코드를 수정해보겠습니다. 1) 패킷의 소스코드// 패킷의 인자를 설정하는 경우, 최대한 용량을 줄여주는 것이 좋음public abstract class Packet{ // 패킷의 용량 public ushort _packetSize; // 패킷의 아이디 public ushort _packetID; // 패킷을 읽고, 패킷에 쓰기 위한 함수 public abstract void Read(ArraySegment segment); public abstract ArraySegment Write();}class PlayerInfoRequi..

C# 2025.01.06

직렬화(Serialization) 3

이번 포스트에서는 기존의 Packet에서 Write와 Read에서 패킷을 채워주는 경우에매번 Span을 새로 생성하였는데, 이 부분을 개선하도록 하겠습니다.추가적으로 패킷에서 string 타입의 프로퍼티를 사용하고이를 인코딩하는 부분도 추가하도록 하겠습니다. 이때 string 프로퍼티를 쓰고 읽는 경우에문자열을 그대로 보내서 그때그때 필요한 배열을 할당하는 것이 아니라 우선 2바이트짜리 배열의 크기를 보내고 배열의 크기만큼 문자열을 저장할 배열을 만들어주도록 하겠습니다. 1) 서버와 클라이언트가 공통적으로 사용하는 패킷// 패킷의 인자를 설정하는 경우, 최대한 용량을 줄여주는 것이 좋음public abstract class Packet{ // 패킷의 용량 public ushort _packet..

C# 2025.01.06

UTF-8과 UTF-16

이번 포스트에서는 컴퓨터에서 언어를 다루는 방식을 알아보도록 하겠습니다. 1) ASCII 코드오직 영어만을 위해 사용가능한 방식인 ASCII 코드입니다.문자 하나를 255 크기의 1바이트(=8비트)로 표현합니다.예를 들어 대문자 A는 10진수로는 65, 16진수로는 0x41로 표현합니다. 2) UNICODEASCII 코드는 영어만을 표현할 수 있으므로 이를 위해 만들어진 UNICODE 입니다.영어 외의 다른 언어를 표현하기 위해 3바이트(=24비트)로 표현합니다.하지만 유니코드의 경우, 치명적인 단점이 존재하는데 바로 모든 문자들에 대해 3바이트라는 무시하지 못할 크기의 용량을 사용한다는 것입니다.따라서 이를 개선하고자 등장한 것이 바로 UTF-8과 UTF-16입니다. 3) UTF-8UTF-8의 경우 영..

C# 2025.01.06

유니티 입력 처리 심화 - (11) Player Input 컴포넌트 - Invoke C# Events

이번 포스트에서는 Unity의 PlayerInput 컴포넌트를 사용하여Input System을 사용하는 4가지 방법 중에서 4번째인 Invoke C# Events를 알아보겠습니다. 이전의 포스트와 동일하게 옵션을 Invoke C# Events로 변경하도록 하겠습니다.변경하면 설정 창이 다음과 같이 변경되는 것을 볼 수 있습니다. Invoke C# Event와 Invoke Unity Event 방식의 가장 큰 차이점은 입력을 통해 호출하는 콜백 함수를 C# 스크립트에서 연결하느냐 유니티 에디터에서 연결하느냐입니다. 이제 Invoke C# Event의 사용 방법을 예제를 통해 알아보겠습니다.1) Invoke C# Events 사용예제public class InvokeCSharpEvents : MonoBeha..