전체 글 581

플레이어 입장, 퇴장

실시간 멀티플레이 게임은 서로의 모습이 보이는것이 기본이다.하지만 이 기본부터가 쉽지가 않다.서버와 클라의 오브젝트 정보들을 동기화하기 위해서 서로 오브젝트들의 정보를 관리하는 클래스가 필요하고, 클라에서는 씬마다 존재하는 오브젝트들이 다르기 때문에 서버에서는 이것을 GameRoom이라는 클래스로 클라의 씬에 대응되도록 관리하였다.또 자신의 컨트롤러와 다른 플레이어의 컨트롤러를 분리하는 등 필요한 작업이 많았다. 저번에 이어서 클라에서 씬 전환 완료 패킷을 서버로 보내면 서버에서는 해당 씬에 대응하는 Room에 플레이어를 입장시키고, 입장시키면 Room에서는 클라에 본인에게 자신의 정보(Enter 패킷)를 보낸다.그리고 이미 해당 Room에 있는 플레이어들의 정보를 보내준다(Spawn패킷). 그리고 이미..

C# 서버 2024.05.05

게임 입장

처음 LobbyScene에 입장하면 서버와 연결을 시도한다.연결된 상태에서 이름을 입력하고 Enter Game을 누르면 서버에 접속 요청 패킷을 보낸다.서버에서는 해당 패킷을 받으면 전달된 이름을 받아서 플레이어 정보를 만들어 저장해놓고, 입장하라는 패킷을 클라이언트에 보내준다. 클라이언트는 접속 허락 패킷을 받으면 씬 전환을 하고, 씬 전환이 완료되면 완료되었다는 패킷을 보낸다. 여기까지가 오늘 구현한 내용이고앞으로 할 작업은 서버에서 씬 전환 완료 패킷을 받으면 위에서 저장해놓은 플레이어 정보와 해당 씬에 있는 오브젝트들의 정보를 클라이언트에 보내주고, 클라이언트에서는 해당 정보를 받아서 오브젝트들을 생성하는 것 이다.  서버를 켜지 않았을 경우   서버를 켰을 경우

C# 서버 2024.05.04

서버 - Unity클라 통신 테스트

클라이언트가 서버에 접속하면 클라이언트에는 서버 세션이 생성되고, 서버에는 클라이언트 세션이 생성된다.접속과 동시에 서버에서 Protobuf로 만든 S_Test 패킷을 클라이언트 세션을 통해 클라이언트에 전송하고 클라이언트에서는 서버 세션을 통해 해당 패킷을 받아 S_Test로 전달된 메세지를 로그로 출력하여 클라와 서버가 통신이 되는지 테스트한 영상이다.

C# 서버 2024.05.03

Lock

Critical Section (임계 영역)Critical Section이란 두개 이상의 쓰레드가 동시에 공유 자원을 접근할 수 있는 코드의 부분을 말한다. 멀티쓰레드 프로그래밍에서는이 Critical Section에 한번에 하나의 쓰레드만 접근이 가능하도록 설계를 해야 한다.그래서 Lock 등의 방법을 사용하여 Critical Section에는 한번에 하나의 쓰레드만 접근하도록 할 수 있고, 이렇게 한번에 하나의 쓰레드만 접근하도록 하여 공유 자원의 동시 사용을 막는 것을 Mutual Exclusion(상호 배제)라고 한다. DeadLock (데드락, 교착상태)경우에 따라서 Lock 안에서 또 Lock을 잡아야 하는 경우가 있을 수 있다.1번 쓰레드에서 1번 Lock을 잡고 그 안에서 2번 Lock을 ..

C# 서버 2024.04.29

Race Condition(경합 조건), Atomic(원자성)

class Program{ static int number = 0; static void Thread_1() { for (int i = 0; i 위의 코드를 실행하면 어떤 결과가 나올까? 예상할 수 있는 결과는 0이다.하지만 상대는 멀티쓰레드... 항상 예상하지 못한 결과가 나온다. 역시나 예상했던 0이 나오지 않고 실행할때마다 다른 결과가 나온다.이것은 프로세서 2개가 동시에 공유 자원을 접근하기 때문에 예상하지 못한 결과가 나오는 것이고, 이것을 Race Condition(경합 조건)이라고 한다. 아니 그런데 number를 수정하는 코드는 단 한줄이고 한번에 일어나는 것인데 동시에 실행한다고 해도 상관없는 것 아닌가? 라는 의문이 들 수 있다.하지만 어셈블리어로 분석해보면..

C# 서버 2024.04.29

캐시

캐시 CPU의 코어에는 ALU라고 하는 연산을 하는 장치와 데이터를 기억하는 장치인 캐시가 있다.RAM과 CPU는 물리적으로 거리가 있기 때문에 매번 RAM에서 데이터를 가져와서 사용하는 것은 느리다.그래서 필요한 데이터들을 임시로 저장해놓고 사용하고, 이 임시 데이터들을 저장하는 장소를 캐시하고 한다. 데이터를 변경할때도 마찬가지이다.바로 메모리에 변경된 데이터를 올리는 것이 아니라, 일단 자신의 캐시에 저장해놓고 나중에 실제 메모리에 한번에 올린다. 캐시는 RAM에 비해서는 공간이 매~~~우 작은데 그럼 RAM에서 어떤 데이터를 임시로 가지고 있어야 할까?캐시에는 Temporal Locality(시간적 지역성), Spacial Locality(공간적 지역성)이라는 두가지 철학이 있다.Temporal ..

C# 서버 2024.04.28

멀티쓰레드 프로그래밍

멀티쓰레드란?쓰레드란 프로세스(프로그램)에서 실행되는 흐름의 단위이다.보통 알고리즘 문제를 풀거나 유니티 로직을 짤때 별도의 쓰레드를 생성하지 않았고, 그렇다면 기본적으로 하나의 쓰레드가 존재한다.이렇게 하나의 쓰레드가 하나의 프로세스에 있는 것을 싱글쓰레드 라고 하고, 여러개의 쓰레드가 하나의 프로세스에 있는 것을 멀티쓰레드라고 한다. 스레드는 그냥 실행되는것이 아니라 실행하는데 필요한 자원이 필요하다.즉, 프로세서(CPU코어)가 스레드를 실행해줘야 하고, 프로세서는 한번에 하나의 쓰레드만 실행시킬 수 있다.프로세스가 실행되는 과정은 프로세서가 엄청나게 빠른 시간 간격으로 쓰레드들에 할당되어 쓰레드를 실행해주는 것이다. 코어가 할당되는 속도가 매우 빠르다보니 동시에 실행되는것처럼 보이는 것이다. 프로세..

C# 서버 2024.04.28

UE5로 만드는 Team Fortress 2 닷지볼 - 사운드 추가, Aws에 올린 서버를 통해 멀티플레이

앞으로 해야하는 작업1. 로켓의 움직임을 보간작업을 통해 부드러운 움직임 구현2. 사람 여러명일때 반사하는 각도에 따라 타겟 설정 하는 공식 만들기 (내적을 이용하면 될거같음)3. 맵 적용4. 로켓 파티클이 맘에 안드는데 수정하기5. 어색한 애니메이션 해결6. 관전상태일때 다른 사람 시점으로 볼 수 있는 기능 추가7. 팀별 스폰장소 지정하고 게임 Ready상태일때 스폰장소에 스폰하기8. Ready상태일때는 못움직이게 하기 생각보다 할게많네