분류 전체보기 266

유니티 입력 처리 심화 - (13) Action Asset에서의 Index와 Composite

이번 포스트에서는 Action Asset의 요소 중에서 Index와 Composite에 대해 알아보겠습니다.우선, 예제로 사용하는 Action Asset의 구성을 간단하게 훑어보겠습니다.  위와 같은 구성으로 이뤄져 있습니다.여기서 Input Action은 총 5개로,Jump / MoveHorizontal / MoveVertical / Attack / SpecialAttack으로 구성되어 있습니다. 1) Action Asset에서의 IndexIndex는 Action Asset에 속해 있는 각기 다른 Input Action마다 배정되는데처음 들었을 때 상당히 이해하기 힘든 구조로 되어 있습니다.위의 Action Asset에서의 Index를 그림으로 표현하면 다음과 같습니다.  즉, 하나의 Input Act..

JobQueue #2

이번에는 이전의 포스트에서 사용한 람다식을 이용하여 Action을 자동으로 수행하는 방식이 아닌새로운 Task 단위를 만들어 이를 수동으로 수행하는 방식으로 JobQueue를 구현해보겠습니다. 1) TaskQueueinterface ITask{ void Execute();}// Task 중에서 Broadcast를 수행하는 Taskclass BroadcastTask : ITask{ GameRoom _room; ClientSession _clientSession; string _chat; // 생성자에서 GameRoom, ClientSession, Chat을 초기화함 BroadcastTask(GameRoom room, ClientSession clientSession, str..

C# 2025.01.22

JobQueue #1

Command 패턴을 구현하면서 최대한 C# 문법을 사용하겠습니다.또한 Command 패턴을 사용하므로 이전처럼 직접적인 Action을 수행하지 않고 최대한 JobQueue에 기록하도록 기존의 코드를 수정할 필요가 있습니다. 1) JobQueuepublic interface IJobQueue{ void Push(Action job);}public class JobQueue : IJobQueue{ Queue _jobQueue = new Queue(); object _lock = new object(); bool _flush = false; public void Push(Action job) { bool flush = false; // 락을 걸어 비동..

C# 2025.01.22

Command 패턴

이전 포스트에서 스레드의 양이 늘어나면 막대한 부하가 발생하여결국 싱글 스레드를 사용하는 것보다 못한 작업효율이 나타난다 하였습니다.그 이유를 정리하면 다음과 같습니다. 1) 발생하고 있는 문제 이와 같은 문제가 발생하는 이유은 스레드가 작업을 받음과 동시에 이를 처리까지 수행하기에 발생합니다.이런 상황에 추가적으로 lock을 통해 다른 스레드의 자원 점유를 막아 하나의 스레드만을 이용하여 작업을 수행하므로 대기하는 스레드들이 쌓이게 되어 결국 대기가 길어지는 비효율적인 상황이 발생하게 됩니다. 2) 해결 방법 따라서 이를 해결하기 위해 다른 스레드들은 작업을 받게 되면 Job Queue에 작업을 기록하고, 기록된 작업을 전문적으로 처리하는 스레드를 만들어 해당 작업을 처리하게끔 수정하겠습니다. 3) C..

C# 2025.01.22

채팅 테스트 #2

이번 포스트에서는 지난 포스트에 이어 클라이언트 단계에서 채팅 프로그램을 만들겠습니다. 1) Connectorpublic class Connector{ . . . // 연결을 수행하는 함수 public void Connect(IPEndPoint endPoint, Func sessionFactory, int connectCount = 1) { for (int i = 0; i  우선, 기존의 Connector의 Connect 함수를 수정하여Connect를 connectCount만큼 수행하도록 변경하였습니다.  2) PacketFormat class PacketFormat { // {0} 패킷 등록 public static string m..

C# 2025.01.21

Packet Generator #6

이번 포스트에서는 이전의 PacketManager를 일일이 만들어주던 부분을 자동화하도록 수정하겠습니다.또 클라이언트와 서버의 패킷의 역할을 분리하여 동일한 패킷이 아닌각기 다른 패킷을 사용하도록 수정하겠습니다. 또한 패킷에 차이점을 두어클라이언트에서 서버로 전송하는 패킷의 경우 앞에 C_ 를 수식서버에서 클라이언트로 전송하는 경우 앞에 S_ 를 수식위와 같이 구성하여 최종적으로 각 진영의 PackManager에서 Register를 진행(=등록)하도록 하겠습니다. 1) 패킷 구조 xml  기존의 패킷 구조를 위와 같이 변경하였습니다.이전의 예제에서도 클라이언트가 서버로 전달하는 패킷의 경우에 데이터가 많이 포함되었으므로비교적 덜 사용하는 Te..

C# 2025.01.20

Packet Generator #5

이번 포스트에서는 기존의 패킷을 조금 더 개량하여인터페이스를 상속받아 패킷을 더 유동적으로 사용할 수 있게 개선해보겠습니다. 현재 패킷은 자동생성되고 있으므로 자동생성하기위한 양식에 조금만 변형을 가하면 패킷을 쉽게 변경할 수 있습니다. 1) PacketFormat class PacketFormat { . . .interface IPacket{{ ushort Protocol {{ get; }} void Read(ArraySegment segment); ArraySegment Write();}}{1}"; . . . // {0} 패킷 이름 // {1} 패킷 멤버 // {2} 멤버 변수 Read // {3} 멤버 변수 Wr..

C# 2025.01.20