본문 바로가기

전체 글

[09] 세이브데이터 기반 오브젝트 생성 [08]에서는 데이터 테이블을 만들었고, 데이터 테이블을 기반해서 인스턴스를 생성하는 것. 그리고 그 생성한 인스턴스들의 정보 중 필요한 부분을 분류해서 세이브 데이터로 넣는 것까지 했었다. 그렇다면 세이브-로드 기능은 어떻게 구현할까?나는 언리얼에서 지원해주는 USaveGame을 사용해서 해결했다. 기본 USaveGame에 있는 함수들을 사용하려고 하는 것은 아니고, UGamePlayStatics에 직렬화 할 데이터들을 고르기 위함이다. 그러니까 아래는 단순히 저장할 데이터들을 모으는 컨테이너 역할을 한다.UCLASS()class UNITCLASSTEST_API UDRRSaveGame : public USaveGame{ GENERATED_BODY()public: UPROPERTY(Visibl.. 더보기
[08] 데이터 테이블 관리 기본적인 수치관리를 하는 법USTRUCT(BlueprintType)struct UNITCLASSTEST_API FTrapRow : public FTableRowBase{ GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadOnly) int32 TrapID = -1;};TableRowBase를 상속받는 구조체를 하나 선언하고, 그걸 기반으로 데이터 테이블을 생성한다.그럼 위처럼 한 번에 관리할 수 있도록 테이블이 만들어진다. 위 사진은 유닛 데이터 테이블. 유닛, 방, 함정. 이 세 개를 각각 데이터 테이블을 만들어서 관리한다.유닛같은 경우는 한 번 생성된 이후는 별도의 독립적인 개체로 관리되지만, 기본값을 받아오는 용도로 쓴다. 프로토타입에서는 종류를 각각 .. 더보기
[07] 진행 진도 중간 점검 휴식하고 언리얼 공부 병행하면서 지내다가 다시 진행 재개. 기존에 하던 인원 포함해서 사람이 조금 추가되어 주 2회 3시간씩 모여서 얘기하기로 결정했다. 그 덕에 조금 더 코드 짜는 쪽에 집중할 수 있게 되었다. 공부할 방향성도 잡힌 느낌. 그래서 게임 흐름이랑 프로토타입의 골자를 다시 잡고 이어서 작업에 들어갔다. 유닛이랑 오브젝트 모델링은 AI를 통해 3D로 뽑아서 한 명이 블렌더에서 작업해줬다.-> 유닛 모델링과 걷는 애니메이션까지 완료. 함정과 방 모델링 진행중. 그리고 공부를 하면서 동시에 만들면 항상 느끼는 것이지만, 기존에 만들었던 것을 갈아엎고 싶은 생각이 든다.하지만 그것도 쉽지 않은 것이, 기존 함수를 바꿔버리면 블루프린트가 고장나버리고, 공유할 때 문제가 생겨버린다. 꼭 삭제가 아니더.. 더보기
[06] 프로젝트 공유랑 방향 우선 기존에 만들었던 Spawn의 부족한 점을 손보자.기존의 Spawn Unit은 정해진 Location에서 충돌을 무시하고 진행하기 때문에, 유닛이 서로 겹쳐서 등장하는 오류가 있었다.  소환 위치를 바꾸는 것 이전에, 계속 공중에 떠 있으니 보기 좋지 않다.중력을 적용되게 만들어 볼 생각인데, 그러기 위해서 먼저 UE의 Movement Component들에 대해서 알아봤다.1. PawnMovementComponent2. FloatingPawnMovement3. CharacterMovementComponent4. NavMovementComponent5. ProjectileMovementComponent 일단 유닛이 발사체는 아니니 5번은 제외. 3번도 많은 Pawn이 같이 사용하기에는 비용 부담이 클 .. 더보기
[05] Unreal Singleton/Get Actor of Class 저번에는 ChangeRoom 함수가 작동되는걸 확인해봤고, 이제 UI(위젯 블루프린트)랑 연결시켜서 입력가능 텍스트 위젯과 버튼으로 함수를 작동시켜볼 차례다. 그런데 블루프린트 위젯에서 Room에 대한 정보에 접근할 수 없었다.그 해결책으로는 몇가지 방법이 후보군에 있었는데, 당장 생각할 수 있는 것으로는 1. 노드의 Get Actor of Class로 Room을 모아놓은 Spawner에 접근한다.2. Spawner를 전역 선언해서 사용한다.3. 이 위젯의 참조에 Spawner를 넣어놓는다.  가 있었다. 여기서 보통 1번을 쓴다고는 하는데, 유니티에서 싱글톤을 쓰느라 익숙해지기도 했고, Spawner가 월드에 하나밖에 존재하지 않으니까 싱글톤을 써도 될 것 같아서 2번으로 진행해봤다.그렇게 만든 블루프.. 더보기
[04] Actor Spawn, Algo/Sort 외형과 수치를 가지게 된 유닛을 월드에 소환할 생각이다.그러기 전에, 유닛이 어디에 소환될 지에 대한 정보가 없으므로 유닛 소환 위치를 지정하는 방에 대해 먼저 작성해보자.20x20x15 m 크기의 방. 이 방이 5x5로 총 25개 배열된 곳을 월드처럼 사용할 것이다.그리고 각 방에 Spawn Point를 저장하고, 저장한 Point에 유닛을 소환시키는게 목표가 된다.그러니 RoomBase.cpp 파일을 만들어서 SpawnLocations를 저장할 수 있는 벡터를 만들어주자.UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Room 관련", meta = (AllowPrivateAccess = "true"))TArray SpawnLocations;이제 각 .. 더보기
[03] Pawn C++ Class 언리얼 웨비나를 따라한 것을 정리하기 전에, 개인적으로 만들어보고 싶은 것을 먼저 정리하자.  원하는 것은, 미리 입력해놓은 이동 동선에 따라서 자동으로 움직이는 NPC 유닛.이 NPC가 다른 진영의 NPC와 만나면 서로 전투를 시행하고, 전투가 끝나면 다시 이동시키고 싶다.그럼 어떤 유닛이던간에 그 틀이 될 C++ 클래스를 하나 만들어야 하는데, '없음'과 '캐릭터', '폰', '액터' 등의 부모 클래스가 있다. 간략하게 설명하면 움직일 일이 없는, 간단하게 월드에 배치할 오브젝트는 Actor, 조작가능한 오브젝트와 간단한 이동을 하는 오브젝트는 Pawn, 플레이어가 직접 움직이는, 인간형 캐릭터에 주로 사용되는 것이 Character이다. Actor > Pawn > Character 순서대로 상속받는.. 더보기
[02] Unreal Engine Learning Your First Hour in Unreal Engine 5.2의 6 ~ 9 번을 마저 이어서 해보도록 하자.편집 -> 프로젝트 세팅에서는 더 많은 설정을 건들 수 있는데, 그 중에는 빛, 렌더링도 있다. 빛 설정 전에 기본적인 설정을 여기서 건들 수 있다. 퍼포먼스를 원하는 것에 따라서 설정해주면 좋다.(None이 최고 퍼포먼스)이후 Directional Light에서 강도와 컬러를 설정해줘서 빛 세팅을 이어나갈 수 있다. 이때, 밝기 세팅이 진짜 밝기를 결정하지는 않는데, 이는 게임에서 적용될 시각 적응을 미리 해놓기 때문이다. '라이팅 포함'에서 게임 세팅을 제외하면 밝기 수치 그대로를 확인할 수 있다. Sky Light도 마찬가지로 설정할 수 있다. Directional Light가 태양을 모방.. 더보기