본문 바로가기

Unreal/팁

(6)
UE4) 모바일에서는 Hover이벤트 들어오지 않는다. 커서가 없는데 호버 들어오는것도 이상하긴 하지.... 호버 쓸 거면 Hold 중 2D영역 충돌체크 하라고..
데디에서 스폰 할 때 특정 클라에만 설정..? Spectactor Pawn을 데디에서 접속한 클라이언트 수 만큼 스폰했다. (스폰된 객체가 리플리케이트 된 이후에 NM_Client에서 불릴 )Spectactor Pawn 클래스의 BeginPlay에서 Initialize를 해주었고, 그걸 PlayerState에 등록을 해주었는데 리플리케이트 순서가 클라들간에 보장이 되지 않아서, 간헐적으로 Spectator Pawn의 인풋이 클라간에 거꾸로 들어가는 경우가 있었다. 1. SpawnActor할 때 Owner를 PlayerController로 설정해줘서 해결했다. 2. 혹은 Replicate 컨디션을 COND_OwnerOnly로 설정해도 된다.
Widget이 NativeTick() 돌지 않을 때 void UUserWidget::NativeConstruct() { Construct(); UpdateCanTick(); } void UUserWidget::UpdateCanTick() { TSharedPtr SafeGCWidget = MyGCWidget.Pin(); UWorld* World = GetWorld(); if(SafeGCWidget.IsValid() && World) { // Default to never tick, only recompute for auto bool bCanTick = false; if (TickFrequency == EWidgetTickFrequency::Auto) { // Note: WidgetBPClass can be NULL in a cooked build, if t..
Jam's Tip APlayerController* UUserWidget::GetOwningPlayer() const { return PlayerContext.IsValid() ? PlayerContext.GetPlayerController() : nullptr; } template TPlayerState* GetOwningPlayerState(bool bChecked = false) const { if (auto Controller = GetOwningPlayer()) { return !bChecked ? Cast(Controller->PlayerState) : CastChecked(Controller->PlayerState, ECastCheckedType::NullAllowed); } return nullptr; } ..
#pragma once(수정필요) 오늘 회사에서 #pragma once때문에 컴파일 에러로 난리가 났어서 정리하는 글 난리가 났던 이유 1. 파일 A는 #pragma once 전처리기와 함께 파일B를 include 하고 있었음 2. (추정) 파일A를 간접적으로 참조하는 파일 C에서도 파일B를 include 3. (추정) #pragma once가 파일A의 include B를 날려버림 4. 컴파일에러가 났지만 비주얼스튜디오는 파일A가 아닌 파일B의 변수D를 원인으로 지목함 (파일A 전혀 지목X) 한 시간 정도... svn 업뎃 받은 모두는 아무 일도 할 수 없었다. include를 전방선언으로 바꿔주니까 문제 해결! Pragma once docs.microsoft.com/en-us/cpp/preprocessor/once?view=msvc-1..
데디케이트 서버에서 스탯 관리(수정필요) 언리얼에서 제공하는 RPC나 리플리케이션 관련 함수들은 클라이언트에서 데디케이트서버로 직접 데이터를 전송한다. 하지만 그렇게 하면 Transient한 전송이기도 하고, 검증할 수 없기 때문에 스탯과 같은 유로컨텐츠는 신뢰할 수 있는 검증을 거쳐야 하기 때문에 "게임서버"를 반드시 거쳐야 한다. 대부분의 Receiver들은 CD 혹은 CG이지만 DedicatedReceiver에서는 GD 프로토콜을 관리하기 때문에 스탯, 아이템 관련 프로토콜은 해당 리시버에서 관리해줘야 한다.