목록UE5 (37)
게임 개발 메모장
. 우리가 사용하는 리슨 서버 구조에서는 서버와 클라이언트가 동일한 어플리케이션을 사용한다. 그렇기 때문에 이 어플리케이션을 구현할 때는 서버와 클라이언트가 같은 코드를 사용해야 되는데 신뢰를 가져야된다. 신뢰를 가져야 하는 액터는 서버에만 존재하기 때문에 게임 플레이에 영향을 미치는 게임 로직은 우리가 서버인지를 파악해서 그 서버에서만 동작하도록 구성을 해줘야 된다. 액터 단위로 이 액터가 신뢰할 수 있는지를 파악할 수 있어야 되는데 이를 위해서 제공하는 것이 언리얼엔진에서는 '역할' 이라는 설정을 제공한다. 현재 동작하는 어플리케이션을 중심으로 해서 이 어플리케이션의 역할을 로컬 역할, 그리고 이 어플레케이션과 커넥션으로 맺어진 원격 어플리케이션의 역할을 리모트 역할이라고 한다. 그리고 오른쪽에 어플..
FTimerHandle 타입의 변수를 헤더에 먼저 선언하여 전역 변수로 사용한다. GetWorldTimerManager().SetTime 함수를 호출하여, '헤더에 선언한 Timer를 통해 delay 시간 후에 Function 함수를 호출한다.' 라고 정의해주면 된다. 함수를 등록하는건 역시 바인딩을 통해 등록하면 된다. 하지만 코루틴은 시작과 동시에 등록하면, 코루틴 함수에 있는 무한 루프문을 통하여 지속적으로 함수가 호출되지만, 방금 설명한 API는 지속적으로 호출하고 싶다면, 호출된 함수 내에 다시 SetTime 함수를 호출해야 한다. 따지고 보면 코루틴 보다는 '일정 시간 후에 한번만 호출해라.' 는 쪽에 가깝다. 그리고 등록한 함수를 해제하고 싶다면, ClearTimer를 통하여 함수를 등록한 ..
main 안에서 실수로 값을 초기화 해버리는 문제가 생길 수 있는데, 이를 막을 수 있는 방법이 있을까? 정적 멤버 데이터(static member data) - static이 붙은 멤버 데이터 - 모든 객체가 공유한다. - 클래스 내부에 선언을 만들고 클래스 외부에 정의를 만들어야 한다. - 모든 객체가 공유한다. - 멤버 이므로 접근 지정자를 사용할 수 있다. class 내부에 static으로 변수를 선언한다. private로 선언하면 class 내부에서 getter/setter를 통해 해당 변수에 접근이 가능하게 만들 수 있다. class 내부에 static으로 선언된 cnt 값을 c1.getCount()로 호출해 가져올 수 있다. 출력 : 3 정적 멤버 데이터와 일반 멤버 데이터 아래 코드에서 -..
RPC의 기본 개념과 동작 원리 - 원격 프로시저(함수) 호출 - 원격 컴퓨터에 있는 함수를 호출할 수 있도록 만든 통신 프로토콜 - 네트워크 멀티플레이에서 서버와 클라이언트 간에 빠르게 행동을 명령하고 정보를 주고 받는데 사용 - 언리얼 엔진에서 클라이언트에서 서버로 통신하는 유일한 수단을 제공한다. 이 기능의 주요 용도의 속성상 장식이나 휘발성인 비신뢰성 게임플레이 이벤트를 위한것 이는 사운드 재생, 파티클 스폰, 액터의 핵심적인 기능과는 무관한 일시적 효과와 같은 작업을 하는 이벤트를 포함한다. RPC 사용시 OwnerShip 작동 방식을 이해해둬야 한다. 대부분 RPC 실행 장소를 결정하기 때문이다. RPC 사용하기 함수를 RPC 로 선언하려면 UFUNCTION 선언에 Server, Client,..
TEXT 매크로 TEXT("Hello World"); 언리얼에서는 문자열 리터럴을 TEXT 매크로 안에 넣어서 TEXT("Hello World") 이런식으로 넘기는게 좋다. - 어떤 플랫폼에서든 동작할 수 있도록 언리얼이 인코딩을 해주기 때문이다. 모든 플랫폼에서 2 바이트 문자열로 동작하게끔 해준다. FString C++ 에서의 string처럼 문자열 처리와 관련된 메서드들 사용 가능 FString str = TEXT("Hello World"); printf 함수 FString::printf(TEXT("Actor Name: %s, ID : %d, Location X : %.3f", *GetName(), ID, GetActorLocation().X); C언어의 printf와 비슷하다. 형식 문자열을 출력..
C++ const, constexpr constexpr 이란 컴파일 시간 상수를 만드는 키워드 컴파일 시간에 결정되는 상수 값으로만 초기화 할 수 있다. constexpr이 변수를 상수로 만들어 준다고 하는데 그럼 const와 똑같은데 무슨 차이가 있나? 상수에는 2가지 상수가 존재하는데 1. 컴파일 시간에 알 수 있는 상수. 2. 컴파일 시간에 알 수 없는 상수. (실행시간에 알 수 있는 실행시간 상수) 이렇게 두 종류의 상수가 존재한다. 컴파일 시간에 알 수 있는 상수를 컴파일 시간 상수 (compile-time constant)라고 하고, 컴파일 시간에 알 수 없는 상수 즉 실행시간에 알 수 있는 상수를 런타임 상수(runtime constant)라고 한다. const는 컴파일 시간에 알 수 있는 ..
1. 언리얼에서는 클라이언트에서 서버로 패킷을 보내는 방법은 서버RPC가 유일하기 때문이다. 서버에 보낼 명령의 중요도에 따라 Reliable 인지 Unreliable 인지 판단해서 RPC 함수를 선언해주면 된다. 2. 게임 플레이 판정은 서버에서 무조건 처리하는 것 게임을 구현할 때 가끔식은 서버의 부하를 줄이고 게임의 쾌적한 반응성을 위해서 클라이언트에서 중요한 기능을 처리하는 경우가 종종 있다. 하지만, 최종 판정은 항상 서버에서 진행되도록 원칙을 지켜줘야 된다. 3. 게임 플레이에 영향을 주는 중요한 정보는 프로퍼티 리플리케이션을 사용하는 것이다. 예를 들어, 모바일 게임을 하고 있는데 엘리베이터를 타서 접속이 잠시 끊어진 상황이라면 엘리베이터에서 내리면 다시 재접속을 하게 될 텐데 이렇게 재접속..
- 그래프 전체를 탐색하는 하나의 방법으로써, 하나의 가지(branch)를 모두 탐색한 이후에 다음 branch로 이동한다. - 넓게 탐색하는 것이 아닌, 깊게 탐색하는 방법이다. - stack 또는 recursive(재귀 함수)로 구현할 수 있다. DFS의 특징 - 정점 방문 시, 반드시 방문 여부(isVisited)를 검사하고, 방문 시 isVisited를 true로 표시한다. 정점 방문 여부를 검사하지 않으면 무한 루프에 빠질 수 있다. - 시간 복잡도(Time complexity) : 인접 리스트로 구현 시 O(V+E) // 인접 행렬로 구현 시 O(V^2) - 재귀 함수로 구현 시, 별도의 자료구조가 필요하지 않으므로 메모리를 아낄 수 있다. (BFS의 경우 queue를 사용해야 하므로 DFS에..
- 특정 플레이어에 속한 액터의 정보를 네트워크 내 다른 플레이어에게 복제하는 작업이다. - 클라이언트 - 서버 모델에서는 대부분 서버에서 클라이언트로 전달한다. ( 언리얼 엔진이 사용하는 클라이언트 서버 모델에서는 서버만이 Authority를 가지기 때문이다. ) - 리플리케이션의 방법에는 크게 두 가지가 있는데 1) 프로퍼티 리플리케이션 2) RPC(Remote Procedure Call) 이있다. 기본 액터의 로딩 리플리케이션 작업이 진행 되기 위해서는 네트워크로 데이터를 전송해줘야 된다. 사용자마다 다양한 디바이스와 네트워크 환경에 변수가 있기 때문에 우리는 항상 이것을 정확하게 예측하는 것은 어렵다. 그렇기 때문에 최악의 경우를 언제나 가정해야 되는데, 리플리케이션 작업에서 가장 중요한 것은 데..
서버 섹션에서 플레이어 컨트롤러부터 전달된 어떤 명령은 넷커넥션 객체에 의해서 관리가 되는데, 이 넷커넥션은 상위에서 네트워크 통신을 담당하는 클래스이다. 상위 명령어를 로우레벨 데이터로 변활할 수 있는 기초 작업을 진행해준다. 전체적인 관점에서 네트워크가 원활하게 진행할 수 있도록 어떤 밴드위스라든지 대역폭이라든지 흐름을 조절하는 역할도 함께 담당해준다. 그 아래 NetDriver는 NetConnection에서 정돈된 데이터를 실제 네트워크상으로 보내는 로우 레벨 기능을 제공한다. 이렇게 해서 NetDriver를 통한 데이터가 클라이언트에 전달이 되면 클라이언트는 거꾸로 NetConnection을 거쳐서 액터에 명령을 내리게 된다. 서버가 시작하는 과정 처음에는 StandAlone의 모드로 시작했다가 ..