본문 바로가기

분류 전체보기

(104)
[Unreal] US_PlayerState.cpp 코드 분석 US_PlayerState.cppvoid AUS_PlayerState::AddXp(const int32 Value){ Xp += Value; OnXpChanged.Broadcast(Xp); GEngine->AddOnScreenDebugMessage(0, 5.f, FColor::Yellow, FString::Printf(TEXT("Total Xp: %d"), Value)); if (const auto Character = Cast(GetPawn())) { if (Character->GetCharacterStats()->NextLevelXp AddOnScreenDebugMessage(3, 5.f, FColor::Red, TEXT("Level Up!")); ..
[Unreal] US_PlayerState.h 코드 분석 변수 선언UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, ReplicatedUsing = "OnRep_Xp", Category = "Experience")int Xp = 0;UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, ReplicatedUsing = "OnRep_CharacterLevelUp", Category = "Experience")int CharacterLevel = 1; ReplicatedUsing: 이전 글에 작성한 내용을 보면, 프로퍼티가 업데이트될 때 콜백 함수를 실행해야 한다면 작성하는 옵션이다. 콜백 함수UFUNCTION()void OnRep_Xp(int32 OldValue) const;UFUNCTION()voi..
[Unreal] 프로퍼티 복제 프로퍼티 복제 이해서버가 프로퍼티 값을 새로 업데이트해 클라이언트로 전송하는 즉시, 클라이언트에서 자체적으로 변경한 사항은 모두 덮어 쓰여지고 서버에서 보낸 정확한 최신 값으로 교체된다. 따라서 서버에서 자주 업데이트하지 않으면, 클라이언트가 정확한 새 값으로 알림을 받기까지 시간이 걸릴 수 있다.프로퍼티 복제 활성화프로퍼티를 복제하려면 몇 가지 설정을 해야 한다. 우선, 해당 프로퍼티를 포함할 액터의 생성자에서 bReplicates 플래그를 true로 설정해야 한다. 그 다음, 복제돼야 하는 프로퍼티에 UPROPERTY() 매크로에 Replicated 지정자를 추가해야 한다. 예를 들어 다음 코드를 사용해 캐릭터의 점수를 복제할 수 있다.UPROPERTY(Replicate)int32 Score; 프로퍼..
[Unreal] US_Character Class 코드 분석(데이터 테이블 읽기) US_Character.hUCLASS()class UNREALSHADOWS_LOTL_API AUS_Character : public ACharacter{ ... UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Character Data", meta = (AllowPrivateAccess = "true")) class UDataTable* CharacterDataTable; struct FUS_CharacterStats* CharacterStats; ... public: ... void UpdateCharacterStats(int32 CharacterLevel); FORCEINLINE FUS_Character..
[C++] 자동 공간, 정적 공간, 동적 공간 자동 공간, 정적 공간, 동적 공간C++에서는 데이터를 저장해 두기 위한 메모리를, 대입하는 방법에 따라 자동공간(automatic storage), 정적 공간(static storage), 동적 공간(dynamic storage)으로 구분한다. 동적 공간은 자유 공간 또는 힙(heap)이라고도 부른다.자동 공간자동 공간(automatic storage)을 사용하는 함수 안에서 정의되는  보통의 변수들을 자동 변수(automatic variable)라고 한다. 예를 들어 임시 배열 temp는 getname()함수가 작동하는 동안에만 존재한다. 프로그램의 제어가 main()으로 다시 넘어가면, temp가 사용하던 메모리는 자동으로 해제가 된다.  만약에 getname()이 temp의 주소를 리턴했다면, m..
[C++] 동적 배열과 배열 표기 new를 사용한 동적 배열의 생성과 파괴int* psome = new int [10]; // 10개의 int형 값을 저장할 블록을 대입delete [] psome; // 동적 배열을 해제 new를 대괄호 없이 사용했으면 delete도 대괄호 없이 사용해야 한다.[1] 배열 표기psome[1]을 살펴보자. C++ 컴파일러는 이것을 *(psome + 1)과 완전하게 동등한 것으로 취급한다. *(psome + 1)은 배열의 두 번째 원소의 주소를 계산하고 그곳에 저장된 값을 알아낸다. 그 결과는 psome [1]이 동등하다는 것을 보여준다.[2]psome[i]를 *(psome + i)로 변환한다 [1]p.193[2]p.199
[Unreal] US_CharacterStats.h 스탯 구조체 생성 언리얼에는 구조체를 블루프린터에서 사용할 수 있도록 만드는 방법이 있다. 해당 구조체는 헤더 파일 밖에 사용하지 않아 엔진 에디터가 아닌 IDE에서 생성할 수 있다. 하지만 언리얼에서 사용할 땐 문제가 없지만 IDE에서는 CoreMinimal.h와 같은 기본적인 헤더 파일을 못 찾는 경우가 발생하여 에디터에서 생성하는 것을 추천한다.US_CharacterStats.hUSTRUCT(BlueprintType)struct UNREALSHADOWS_LOTL_API FUS_CharacterStats : public FTableRowBase{ GENERATED_BODY() UPROPERTY(BlueprintReadWrite, EditAnywhere) float WalkSpeed = 200.0f; ..
[Unreal] 자율 및 시뮬레이티드 프록시 액터가 오너가 변경된 후에도 책이 잠시동안 이전 오너와 새 오너 모두에게 연관성이 유지 되는 것처럼 보일 수 있다. 이러한 현상이 일어나는 이유는 과도한 CPU 리소스 및 대역폭을 사용하지 않기 위해 서버가 업데이트마다 액터를 복제하지 않고 AActor::NetUpdateFrequency 프로퍼티가 결정한 빈도대로 복제하기 때문이다. 또한 이동 중인 액터를 업데이트할 때도 동일한 현상이 발생하며, 클라이언트는 미리 정의된 간격으로 데이터를 받는다. 그 결과, 액터에 대한 업데이트가 플레이어에게 불규칙해 보일 수 있다. 이러한 문제를 피하기 위해 엔진은 최신 데이터를 기반으로 이동을 예측한다. 따라서 기본 동작은 이동 예측에 따라 결정되며, 역할을 ROLE_DimulatedProxy 값으로 설정하면 시뮬레..