본문 바로가기

분류 전체보기

(144)
멀티플레이 공부(디버깅으로 실행 시 함수 호출 순서 알아보기) 멀티플레이 디버깅용 로그 매크로 작성// DedicatedX.h#pragma once#include "CoreMinimal.h"#pragma region NetLoggingDEDICATEDX_API DECLARE_LOG_CATEGORY_EXTERN(LogDXNet, Log, All);#define NETMODE_TCHAR ((GetNetMode() == ENetMode::NM_Client) ? *FString::Printf(TEXT("Client%02d"), UE::GetPlayInEditorID()) : ((GetNetMode() == ENetMode::NM_Standalone) ? TEXT("StandAlone") : TEXT("Server")))#define FUNCTION_TCHAR (ANSI_T..
멀티플레이 공부(Property Replication) 레플리케이션(Replication)생성된 액터의 정보를 네트워크 내 다른 클라이언트에게 복제하는 작업을 레플리케이션이라고 합니다.서버-클라이언트 모델에서는 서버에서 클라이언트로 복제되는 것이 기본 규칙입니다. 레플리케이션 방법은 RPC와 Property Replication이 있다.Property Replication액터의 모든 속성의 변경된 값을 모든 클라이언트에게 복제하는 것은 비효율적이다. 원하는 속성만을 다른 클라이언트에게 복제하는 것을 프로퍼티 레플리케이션이라고 한다.프로퍼티 레플리케이션은 항상 Authority에서 Proxy로만 가능하다.(서버에서 복제된 클라이언트에게만 가능)설정 방법1. 액터의 bReplicates 속성을 true로 한다.bReplicates = true2. 네트워크로 복제..
멀티플레이 공부(Remote Procedure Call, 액터 소유권, WithValidation, UnReliable, Reliable) RPC(Remote Procedure Call)지금까지 함수를 호출하는 PC와 실행하는 PC가 같았다.즉, 로컬 PC에서 함수를 호출하고 로컬 PC에서 함수를 실행했다. RPC는 간단하게 호출하는 PC와 실행하는 PC가 달라도 되도록 해주는 통신 기법 이다.언리얼에서는 게임에 큰 영향을 주지 않는 일시적인 효과들에 RPC를 사용하는 편이다.주로 코스메틱(사운드, 파티클 등)에 사용한다.어디에서 호출하는가서버에서 호출하는가 / 클라이언트에서 호출하는가 해당 RPC 함수가 어느 액터에 정의되어 있고, 그 액터의 소유권은 누구인가호출한 클라이언트가 소유(Owner)인가서버가 소유인가소유자 없음(미소유)인가결국 어디에서 실행되는가(최종 결과)서버에서 실행특정 클라이언트에서 실행모든 클라이언트에서 실행드랍(무시)..
멀티플레이 공부(NetRole, Authority, Proxy, Local Role, Remote Role) NetRole게임에 중대한 영향을 끼치는 로직은 서버에서 처리해야 한다고 했다.그래서 NetMode를 통해 현재 로직이 서버에서 도는지 클라이언트에서 도는지 확인해야 한다고 했다. 하지만 NetMode는 월드 관련 정보다. 해당 월드가 서버PC의 월드인지, 클라이언트 PC의 월드인지를 판단한다.그러나 우리는 월드가 아니라 액터 클래스나 컴포넌트 클래스의 멤버 함수 속에서 로직을 대부분 작성한다. 그럼 그 액터가 서버PC에 스폰됐는지 클라이언트PC에 스폰됐는지, 그 액터의 멤버 함수가 어디서 실행되고 있는지 파악을 해야한다. NetRole은 이에 대한 내용이다.Authority와 Proxy서버에 스폰 된 액터가 가진 NetRole 속성 값은 항상 Authority다.서버에 스폰 된 액터에서 수행될 로직은 ..
멀티플레이 공부(NetMode, NetConnection, NetDriver, Ownership) NetMode해당 게임 프로세스가 네트워크 상에서 어떤 역할을 하고 있는지를 의미.싱글(NM_StandAlone), 서버(NM_Listen, NM_DedicatedServer), 클라이언트(NM_Client)게임에 중대한 영향을 미치는 로직은 서버 컴퓨터에서 처리하는데 이유는 해킹에 취약해지기 때문이다. NetMode는 작성하고 있는 로직이 서버에서 돌고 있는지 클라이언트에서 돌고 있는지 알아야 할 때 필요하다. UWorld::InternalGetNetMode() 함수는 언리얼에서 구현해놓은 함수인데 코드를 살펴보면// World.cpp...ENetMode UWorld::InternalGetNetMode() const{ if ( NetDriver != NULL ) // 넷드라이버가 설정되어 있으면 { ..
멀티플레이 공부(Server, Client, Dedicated Server 흐름도, 특징) 각각의 컴퓨터가 서버이자 클라이언트인 P2P 서버서버이자 클라이언트인 방장(Host)이 있고 나머지 참가자(Guest)는 모두 클라이언트인 Listen 서버서버를 담당하는 컴퓨터가 따로 있는 Dedicated 서버 위 3가지 서버중 Dedicated 서버에 대해 공부할 것이다.Dedicated 서버의 실행 흐름도 PIE를 했거나, Server.exe를 실행하는 식으로 서버 프로세스 실행.실행할 때 Open {Level이름}?Listen 명령어가 인자로 전달. 해당 Level을 열어둔다.이때 Socket이 생성되며 다른 PC가 접속 가능하게 한다. Listen 명령어가 없다면 싱글플레이.Level에는 WorldSettings 속성이 있고, WorldSettings에는 GameMode와 GameState 정..
멀티플레이 공부(멀티 실습 환경 설정) 지금까지는 싱글 플레이를 다뤄봐서 따로 설정이 필요 없었지만 멀티 플레이는 서버와 클라이언트를 따로 봐야하므로 언리얼 에디터에서 Number of Players를 테스트 할 인원수대로 조절하고 Net Mode를 Play As Client로 해야한다.멀티플레이 실습을 위해 멀티 채팅 프로젝트를 생성했는데 현재 위처럼 설정하고 실행을 한 뒤 종료를 해보면 에러가 발생한다.현재 구현해놓은 로직에서는 다른 클라이언트에 불필요한 위젯 객체가 생성된다.위젯 객체는 Owning Client에서만 생성되면 되므로 판별하기 위해 IsLocalController() 함수를 호출한다.IsLocalController란 위젯 객체를 띄울 클라이언트가 내 PC가 맞는지 판단을 하는것이다.// CXPlayerController.c..
팀 프로젝트(언리얼엔진 5 기반 슈터 게임 프로젝트) 장르 : 3D 뱀파이어 서바이벌류 게임개발 목적 : 언리얼, C++ 개발 및 팀 협업 과제 수행개발 기간 : 25년 10월 20일 ~ 25년 11월 10일(약 3주) 팀 프로젝트를 3주간 진행했다.우리 팀은 메가봉크라는 게임을 모작하여 게임을 만들었는데 메가봉크에 비해서는 많이 부족하지만 시작과 끝이 있는 하나의 완성도 있는 게임을 만들었다. 3주 동안 하루에 열 몇시간씩 팀 프로젝트를 만들며 많은 일이 있었지만 기록을 해놓지 않아서 대략 기억나는 부분만 적으려 한다.다음부터는 작업을 하며 메모장에라도 적어놓을 예정이다. 팀에서 내가 맡은 파트는 UI와 배틀시스템을 만드는 부분이였는데 각 상황에 맞는 많은 UI(게임시작, 엔딩, HUD 등)들을 제작하고 실제 데이터와 연결하는 작업들을 했다.UI각 위젯이..