Server - Client Model
Server ( authority )
- check request
- replicate to client
Client ( clone )
- function ( input, logic, etc.. ) → request for server
- Init
- bReplicates
- SetIsReplicated(bool)
Request Function to Server ( RPCs remote procedure calls )
header
header
UFUNCTION ( server, reliable, validation )
type funcName(var);
cpp
cpp
.AddBind( param, object, funcName );
type funcName_Implementation(var)
{ 실행문 ( 서버에서 ) }
bool funcName_Validation(var)
{ return 유효성 } // false일 경우, cheating 규칙 적용
Actor Roles ( Unreal Doc. _ Actor Roles )

- Unreal network model에서 권한의 단위는 Actor
- Simulated Proxy Actor ( in client )
- 서버로 부터 받는 정보에 전적으로 의존
- 정보들을 종합하여 지역적(시간축) 상태에 대해 시뮬레이션 → 적용
- 이후 리플리케이트를 적용할 때, 시뮬레이션된 값과 서버로부터 새로 받은 정보를 기반으로 비교, 검정, 보간
- Autonomous Proxy
- Simulated Proxy에 더해, 유저의 입력을 포함하고 있으며, 역으로 server에게의 request를 포함
- Simulated Proxy에 더해, 유저의 입력을 포함하고 있으며, 역으로 server에게의 request를 포함
- Simulated Proxy Actor ( in client )
- Role / RemoteRole
- 체크하는 당사자 ( server or client 등 ) 입장에서, 자신의 정보 - Role / 비교대상의 정보 - Remote Role
- Actor.Role property를 통해 접근가능
- Autonomous Proxy는, 자기자신에 대한 결정권은 자신이 지니므로
- Local에서 수행 후
- Server 에서 UFUNCTION(server)로 할당된 로직을 수행하는 형태로 구현되어야 함
- 동기화를 고려하면, local 수행용 함수와, server 수행용 implementation 함수는 동일한 로직이어야 함
Replicate Property
- Object 단위
- bReplicates = true; ( Object ) ( constructor )
- UPROPERTY(Replicated) [property]
void AActor::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const // header에서 선언할 필요 없음 ( property의 속성에 replicated를 통해 선언 ) { DOREPLIFETIME(AActor, [property]); }
- ( ReplicatedUsing = [함수명] )
- 해당 함수를 통해 replicate 진행
- 같은 class 내의 UFUNCTION 항목?
- [함수명](OnRep_Func)은 property 값이 변경될마다, client ( has authority = false )에서만 이루어짐
-
header
UPROPERTY(ReplicatedUsing = OnRep_ReplicatedTransform) FTransform ReplicatedTransform; cpp
void AMyKart::OnRep_ReplicatedTransform() { SetActorTransform(ReplicatedTransform); }
- Actor::NetUpdateFrequency ( sec, beginPlay )
-
-


-
- owner player controller와 현재 접속한 instance에게 할당된 player controller를 비교해서 IsLocallyControlled 체크하는듯?
- hasAuthority는 "해당 액터"의 속성에 관한 것 ( 호출자하고는 별개인듯? )
- HasAuthority() 체크시, 함수를 포함하는 actor instance가 아니라 함수를 호출하는 actor instance의 authority를 체크하는듯?
- IsLocallyControlled() 체크시, 함수를 포함하는 actor instance == 함수를 호출하는 actor instance 체크하는듯?
- canonical state ( 표준 상태 ) - 프로토콜
-> 서버-클라 유효성검정을 위한 데이터들의 모듈화된 군집 ( serialize? or structure? )APawn::IsLocallyControlled()
{ return APawn::Controller(allocated) && Controller->IsLocalController() }
Actor::Role - AActor::HasAuthority()
{ return GetLocalRole }
보간 패턴
보간 패턴
- Location - Linear interp.
- Revolutionary - Location Slerp ( spherical linrea interpolation )
- Velocity
- exponential 합성하여 사용
- sigmoid interp.
- bezier ( hermite ) interp. - FMath::CubicInterp ( p0, t0, p1, t1, a ) - position, tangent(velocity or pos.derivation), alpha
- Acceleration
- sigmoid는 어차피 n차에서 항상 미분 가능
-
여기를 클릭하여 펼치기...
- bazier ( hermite ) 은 차수 하나 늘리면 됨 ( https://docs.unrealengine.com/4.26/en-US/API/Runtime/Core/Math/FMath/CubicInterp/1/ )
- exponential은 필요에따라 custom하기 편하고
Editor에서 소켓 접속 방법
- 서버
- "${언리얼 엔진 경로}\Engine\Binaries\Win64\UnrealEditor.exe" "${프로젝트 경로}\${프로젝트이름}.uproject" /Game/{맵 경로}?listen -server -log
- 로그 확인 필요사항
- 포트번호 확인 ( listening on port로 검색 )
- created socket for bind adress : 0.0.0.0 이라면, 모든 ip의 접근에 대해 허가된 상태
- 클라이언트
- "${언리얼 엔진 경로}\Engine\Binaries\Win64\UnrealEditor.exe" "${프로젝트 경로}\${프로젝트이름}.uproject" 서버ip:포트번호 -game -log