TIL(Today I Learned)

2026/06/24

BreadMushroom 2026. 6. 24. 20:52

TIL 쓰기전 항상 명심 할 것

작성 타이밍: 공부가 다 끝나고 쓰려고 하면 지쳐서 안쓴다. 모르는게 있을 때 즉시 적기

작성 강도: 메모가 절대로 '공부'나 '또 하나의 짐'처럼 무거워지면 안됨.


[질문] 

  • 내가 몰랐던 것: void OnRep_ServerRotationYaw(); 함수는 어디서도 호출되지 않았는데 어떻게 액터에 적용 된 걸까??
  • 원인 (이유): Replication Notify 시스템에 등록된 콜백 함수라서 자동으로 호출
  • 코드: 
//h
UFUNCTION()
void OnRep_ServerRotationYaw();

UPROPERTY(ReplicatedUsing = OnRep_ServerRotationYaw)
float ServerRotationYaw;

//cpp
void ADXBox::OnRep_ServerRotationYaw()
{
	SetActorRotation(FRotator(0.f, ServerRotationYaw, 0.f));
}

 

[개념] NetLoadOnClient 

  • 한 줄 요약: 레벨에 정적으로 배치된 액터를 서버 복제 없이 클라이언트가 맵 로딩 시 로컬에서 함께 로드하도록 하는 옵션
  • 언제 써?:정적 오브젝트처럼 별도 동기화가 필요 없는 액터에 사용
    • 레벨에 미리 배치된 액터
    • 게임 중 상태가 거의 변하지 않는 액터
  • 코드:블루프린트에서 설정하는게 편함

[개념] Property Replication

  • 한 줄 요약: 서버에 존재하는 변수의 특정 속성값을 클라이언트들에게 자동으로 동기화하는 기능
  • 언제 써?:체력, 점수, 위치값처럼 서버가 기준이 되어 모든 클라이언트가 같은 값을 알아야 할 때 사용
  • 코드:
  • 프로퍼티 레플리케이션 설정 방법
    1. 액터의 Replicates 속성을 true로 설정합니다.
    2. 네트워크로 복제할 액터의 속성을 키워드로 지정합니다.해당 속성의 UPROPERTY()에 Replicated 키워드 추가합니다.
    3. GetLifetimeReplicatedProps() 함수에 네트워크로 복제할 속성을 추가합니다.#include “Net/UnrealNetwork.h” 헤더파일 추가합니다.DOREPLIFETIME 매크로를 사용해 복제할 속성을 명시합니다.
//h

생성자();

UPROPERTY(Replicated)
float ServerRotationYaw;

virtual void GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const override;

//cpp
#include “Net/UnrealNetwork.h”

생성자()
{
    bReplicates = true;
}

void 클래스이름::GetLifetimeReplicatedProps(TArray<class FLifetimeProperty>& OutLifetimeProps) const
{
	Super::GetLifetimeReplicatedProps(OutLifetimeProps);

	DOREPLIFETIME(ThisClass, ServerRotationYaw);
}

 

[개념] UE_DISABLE_OPTIMIZATION & UE_ENABLE_OPTIMIZATION

  • 한 줄 요약: 디버깅을 쉽게 하기 위해 특정 코드 구간의 컴파일 최적화를 끄고 다시 켜는 매크로
  • 언제 써?:특정 코드 구간에만 최적화를 끄면 디버깅에서 흐름을 더 정확히 추적할 수 있다.
  • 코드:
UE_DISABLE_OPTIMIZATION

//디버깅 할 코드부분

UE_ENABLE_OPTIMIZATION

[개념] Replication Notify

  • 한 줄 요약: 복제된 변수가 클라이언트에서 갱신될 때 자동으로 후처리 함수를 호출해주는 기능
  • 언제 써?:변수 값만 동기화하는 것으로 끝나지 않고, 값이 바뀐 뒤에 추가 동작이 필요할 때 사용
    • 체력 값이 바뀌면 UI 갱신
    • 회전 값이 바뀌면 액터 회전 적용
  • 코드:
    //h
    UFUNCTION()
    void OnRep_ServerRotationYaw();
    
    UPROPERTY(ReplicatedUsing = OnRep_ServerRotationYaw)
    float ServerRotationYaw;
    
    //cpp
    void ADXBox::OnRep_ServerRotationYaw()
    {
    	SetActorRotation(FRotator(0.f, ServerRotationYaw, 0.f));
    }

[개념] NetUpdateFrequency

  • 한 줄 요약: 서버가 이 액터의 변경 정보를 클라이언트에게 얼마나 자주 보낼지 정하는 값
  • 언제 써?: 굳이 자주 동기화 할 필요 없는 액터일 경우 값을 조절하여 최적화 할 때
  • 코드:

[개념] Relevancy

  • 한 줄 요약:  액터의 정보를 특정 클라이언트에게 보낼 필요가 있는지 판단하는 기준
  • 언제 써?: 클라이언트에 연관된 액터만 복제해줌으로 최적화 할 때
  • 코드:

 

[함수 족보] SpawnActor<>()

  • 한 줄 요약: 게임 실행 중에 원하는 Actor를 특정 위치와 회전값으로 동적으로 생성할 때 사용하는 함수
  • 언제 써?:이미 레벨에 배치된 Actor가 아니라, 게임 도중 새 Actor를 만들어야 할 때 사용
    • 캐릭터가 총알을 발사할 때
    • 몬스터를 일정 위치에 소환할 때
  • 코드:
    void AMyCharacter::BeginPlay()
    {
        Super::BeginPlay();
    
        FVector SpawnLocation = GetActorLocation() + FVector(200.f, 0.f, 0.f);
        FRotator SpawnRotation = GetActorRotation();
        FActorSpawnParameters SpawnParams;
    
        ATestActor* SpawnedActor = GetWorld()->SpawnActor<ATestActor>
        (
            SpawnLocation,
            SpawnRotation,
            SpawnParams
        );

 

'TIL(Today I Learned)' 카테고리의 다른 글

2026/06/26  (0) 2026.06.26
2026/06/25  (0) 2026.06.25
2026/06/19  (0) 2026.06.19
2026/06/18  (0) 2026.06.18
2026/06/16  (0) 2026.06.16