FMath는 함수가 아니라 structFMath::함수이름() 으로 호출int32 Value = FMath::Rand(); // 임의의 정수
int32 ValueInRange = FMath::RandRange(1, 10); // 1~10 사이
FMath::RandInit(Seed); // 랜덤 시드 초기화
float Lerp = FMath::Lerp(0.f, 100.f, 0.5f); // 50.0 (선형 보간)
float Clamp = FMath::Clamp(120.f, 0.f, 100.f); // 100.0 (최소/최대 제한)
float SinVal = FMath::Sin(PI / 2); // 1.0
float Power = FMath::Pow(2.f, 3.f); // 8.0
float Sqrt = FMath::Sqrt(16.f); // 4.0
int32 MinVal = FMath::Min(3, 7); // 3
int32 MaxVal = FMath::Max(3, 7); // 7
bool IsNearly = FMath::IsNearlyZero(0.0001f); // true
FMath::함수() 로 호출데이터를 미리 저장해 두고 나중에 빠르게 접근하기 위해 사용하는 기법
데이터를 반복적으로 계산/처리하지 않고 미리 저장해서 성능을 향상시키는 방법
수학 문제를 풀 때 한 번 푼 값을 저장해두고 다시 계산하지 않게 하는 거랑 비슷한 개념
// CXGameModeBase.h
...
class ACXPlayerController;
/**
*
*/
UCLASS()
class CHATX_API ACXGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
...
virtual void BeginPlay() override;
void PrintChatMessageString(ACXPlayerController* InChattingPlayerController, const FString& InChatMessageString);
protected:
FString SecretNumberString; // 만든 SecreatNumber을 저장해주기 -> 캐싱
TArray<TObjectPtr<ACXPlayerController>> AllPlayerControllers; // 참가자들 저장
};
// CXGameModeBase.cpp
...
#include "Player/CXPlayerController.h"
#include "EngineUtils.h"
// 로그인 후에 호출되는 함수
void ACXGameModeBase::OnPostLogin(AController* NewPlayer) // 컨트롤러 넣어줌
{
...
ACXPlayerController* CXPlayerController = Cast<ACXPlayerController>(NewPlayer); // 형변환
if (IsValid(CXPlayerController) == true)
{
AllPlayerControllers.Add(CXPlayerController);
}
}
...
void ACXGameModeBase::BeginPlay()
{
Super::BeginPlay();
// 게임 시작 시 한 번만 정답 번호 만들기 -> GenerateSecreatNumber()
// 캐싱하기 -> SecretNumberString
SecretNumberString = GenerateSecretNumber();
// UE_LOG(LogTemp, Error, TEXT("%s"), *SecreatNumberString();
}
// GameMode는 서버 전용 액터니까 클라이언트에서 서버 RPC로 호출하기
void ACXGameModeBase::PrintChatMessageString(ACXPlayerController* InChattingPlayerController, const FString& InChatMessageString)
{
// FString ChatMessageString = InChatMessageString; // 채팅메세지 받아오기 -> 이거 활용 안함
int Index = InChatMessageString.Len() - 3;
FString GuessNumberString = InChatMessageString.RightChop(Index);
if (IsGuessNumberString(GuessNumberString) == true) // 이 번호가 추측하려고 낸 번호인지 확인
{
FString JudgeResultString = JudgeResult(SecretNumberString, GuessNumberString); // 담아주기
for (TActorIterator<ACXPlayerController> It(GetWorld()); It; ++It) // 플레이어 컨트롤러 전체 순회 돌기
{
ACXPlayerController* CXPlayerController = *It;
if (IsValid(CXPlayerController) == true)
{
FString CombinedMessageString = InChatMessageString + TEXT(" -> ") + JudgeResultString; // 결과에 대한 문자열을 combine
CXPlayerController->ClientRPCPrintChatMessageString(CombinedMessageString); // 클라한테
}
}
}
else // GuessNumber가 아니라면 -> 게임하려고 친 게 아니라 다른 거 친 것 같아
{
for (TActorIterator<ACXPlayerController> It(GetWorld()); It; ++It)
{
ACXPlayerController* CXPlayerController = *It; // CXPC로 해야할듯?
if (IsValid(CXPlayerController) == true)
{
// CXPC로 해야할듯?
CXPlayerController->ClientRPCPrintChatMessageString(InChatMessageString); // 클라한테 ChatMessage 그대로 넣어줌
}
}
}
}
// 로그인 후에 호출되는 함수
void ACXGameModeBase::OnPostLogin(AController* NewPlayer) // 컨트롤러 넣어줌
{
}
인자로 NewPlayer → 접속한 플레이어의 AController
AllPlayerControllers = 아마 TArray 타입의 멤버 변수
FMath에 대한 고찰,
풀어내는 여유로움,
흠 잡을 곳이 없는 칠칠맞은 글이였습니다.