언리얼
[Unreal] 멀티플레이 개념잡기 Replicated
정의 일반적인 게임들은 Steam에 연동하는 등의 플랫폼 작업이 뒤따르거나, DB에 현재 상태의 값을 저장하는 등 서버로서 필요한 작업이 더욱 많다. 다만 이러한 부분은 일단 제쳐두고 별다른 save data 없이 단판 게임으로서 멀티플레이 게임을 어떻게 만들 것인지 부터 생각해보자. 개인적으로는 dedicated server를 연습하기 위해 멀티플레이 개념을 잡고 있으므로 리슨 서버(listen server)에 대해서는 별도로 다루지 않는다. 참고로 Editor에서 dedicated server를 이용해 여러 클라이언트를 띄우려면 아래와 같이 설정하면 된다. Replicated 속성 적용하기 기본적으로 위의 그래프를 보면 replicated 속성은 아래 구조체에 적용할 수 있다. - GameSt..
[Unreal] csv 파일 불러온 후 읽어들이기
불러오기 우선 .csv 파일을 준비한다. 빈 클래스가 생성 될텐데 싹 지워버린다. .csv 파일을 연동시키기 위해선 데이터 테이블이 필요하다 FTableRowBase 로부터 상속받은 구조체를 하나 생성한다. #include "Engine/DataTable.h" 및 "파일명.generated.h" 추가 USTRUCT(BlueprintType) 와 GENERATED_BODY() 메크로 필히 추가 #pragma once #include "CoreMinimal.h" #include "Engine/DataTable.h" #include "Test.generated.h" USTRUCT(BlueprintType) struct FsTestData : public FTableRowBase { GENERATED_BODY(..
[Unreal] 자료구조 순회 방법
TMap 변수명; Key = 키, Value = 값 범위 기반 for문 사용 구현, . 멤버 변수 접근자 사용 예) 변수명.Key, 변수명.Value for (auto 변수명 : TMap 변수명) { } 이터레이터 사용 구현, it-> 화살표 연산자 참조 또는 (*it) 역참조로 접근 예) it->Key, (*it).Value 주의) TConstIterator 형이지만 != 연산자는 nullptr과 비교 불가다. ++ 연산자는 파라미터를 봐서는 전위 연산자인데 후위 연산자는 복사 오버헤드로 인해 막아놓은듯 하다. for (auto it = TMap 변수명.CreateConstIterator(); it; ++it) { }
[Unreal] FTimerManager 타이머 설정
#include "TimerManager.h"를 추가해주면 된다. 생성자가 FTimerManager() = delete;로 되어있기 때문에 인스턴스화 시킬 수 없다. 각 인자 값으론 FTimerHandle 쓰여질 핸들 InRate 반복될 횟수 inbLoop 무한반복 여부 InFirstDelay 첫 발동까지 대기시간 const FTimerDelegate&, const FTimerDynamicDelegate&, TFunction&& 함수 포인터 UserClass* 타이머를 적용할 대상 오브젝트 FTimerHandle handle; float rate = 1.f; float inFirstDelay = 0.f; bool bLoop = false; FTimerDelegate timerDele; FTimerDyna..
[Unreal] 화면 정중앙 조준선 위치 기반 레이캐스트
FVector startPos = 소환위치(FVector); float maxRange = 10000.f; // 카메라 기반으로 구하기 auto cameraManager = UGameplayStatics::GetPlayerCameraManager(GetWorld(), 0); auto traceStartPos = UKismetMathLibrary::ProjectPointOnToPlane(cameraManager->GetCameraLocation(), startPos, cameraManager->GetActorForwardVector()); auto traceEndPos = traceStartPos + (cameraManager->GetActorForwardVector() * maxRange); // 게임 ..
[Unreal] 문자열 변환 - FName, FText, FString
문자열 클래스간 변환 변환 형식 변환 방법 FName → FString TestString = TestName.ToString(); FName → FText TestText = FText::FromName(TestName); FString → FName TestName = FName(*TestString); // 손실 위험 있음. FName이 대소문자 구분 없음 FString → FText TestText = FText::FromString(TestString); FText → FString TestString = TestText.ToString(); // 안전하지 않음. 언어 변환시 손실 위험 때문 FText → FName FText → FString -> FName // 직접 변환 없음 // 손실 위..
[Unreal] C++ 버전 변경(C++ 20기능 사용) 방법과 모듈
언리얼에선 디버그 속성 통해 전체 .sln 파일에 대해 언어를 지정 할 수가 없다. UE 5 기준 전체 언리얼 모듈들은 C++ 17버전으로 작성 되어있다, 따라서 20 버전으로 업그레이드 한 후 참조할 때 에러가 날 수 있다. 각 모듈 Build.cs 파일 내에 // CppStandardVersion.Latest 즉 최신 버전 설정 시 17 버전으로 설정 됨. CppStandard = CppStandardVersion.Cpp17; // C++ 20 기능 사용하고자 할 때 아래와 같이 작성하면 된다. CppStandard = CppStandardVersion.Cpp20; 아래는 현재 사용하고 있는 직접 구현한 모듈들이다. Objects 같은 경우엔 탄알(파티클 이펙트) Niagara System을 사용해야..
[Unreal] 마우스 방향을 따라가는 총기 애니메이션 (Aim Offset)
Animation에는 Aim Offset과 Aim Offset1D가 존재한다. 가장 큰 차이점은 파라미터 개수의 차이다. 에임 오프셋은 하나의 애니메이션이기 때문에 애님 인스턴스에서 설정 해줘야한다. 가장 눈여겨봐야할건 Additive Settings이다 Aim Offset과 구성할 애니메이션 Sequence이 Preview Base Pose가 일치 해야한다. 애니메이션 Sequence 내 Additive Anim Type을 Mesh Space와 Base Pose Type을 Selected animation frame으로 설정하는것도 중요하다. 가운데, 가운데 상, 가운데 하, 오른쪽, 오른쪽 상, 오른쪽 하, 왼쪽, 왼쪽 상, 왼쪽 하가 각각 구성 후 추가한다. Horizontal Axis을 Yaw로 ..
[Unreal] RootComponent 루트 컴포넌트
루트 컴포넌트는 충돌 인식과 월드 스페이스에서 오브젝트의 위치를 결정하고 항상 충돌을 탐지하는 컴포넌트(메쉬(Skeletal, Static) , 충돌체)여야 한다. 메쉬 컴포넌트를 설정했을 시 Mobility라는 항목이 추가된걸 확인해 볼 수가 있다, 이는 크게 3개로 나뉜다. 추가적으로 Set Simulate Physics를 할 시 무조건 Movable이여야 한다. Static > 맵에서 움직이진 않고 라이트닝 또한 인게임 중 위치를 바꿀 수가 없다. Stationary > 맵에서 움직이진 않지만 라이트닝 위치를 인게임에서 바꿀 수가 있다. Movable > 맵과 라이트닝 동일하게 움직일 수가 있다. 참고 : https://docs.unrealengine.com/4.26/en-US/BuildingWor..
[Unreal] RadialForceComponent 하중을 가하는 컴포넌트
Radial Force Component를 추가한 후 루트 컴포넌트에 부착한다. 추가적으로 대상 오브젝트는 항상 Simulate Physics true 상태여야 한다. Radius > 범위 Object Types To Affect > 하중을 가하고자 하는 오브젝트(엑터) 타입 Impulse Strength > Fire Impulse 함수를 통해 하중을 단방에 가할 힘 Impulse Vel Change > 하중을 대상 오브젝트 무게와 상관없이 일정하게 가하는 것 Force Strength > 별다른 함수 호출 없이 하중 컴포넌트가 Activate 상태일 때 서서히 하중을 가할 힘 캐릭터는 폭발물에 하중을 가할 필요가 없으므로 제거해줬다. RadialForceComp->RemoveObjectTypeToAff..