💻 Code : https://github.com/tedison7/ArenaBattle 게임 모드 게임모드(Game Mode)는 게임의 규칙을 정하고, 게임의 틀을 잡아주는 역할을 한다. 폰(Pawn)은 플레이어가 조종할 수 있는 액터를 뜻한다. 게임모드와 폰을 직접 제작해보자. 기존 Step1 레벨을 다른이름으로 저장 기능을 통해 Step2로 저장 GameModeBase 클래스를 부모로하는 ABGameMode 클래스를 생성 Pawn 클래스를 부모로하는 ABPawn 클래스를 생성 Step2 레벨에서 월드세팅에 GameMode Override 항목을 생성한 ABGameMode로 선택 플레이 버튼을 눌러보면 월드 아웃라이너에 ABGameMode와 DefaultPawn이 생성됨을 확인 ABGameMode의 코..
📚 2021 읽은 기술 도서기록 🌱 읽어야 되는 책 모던 자바 인 액션 단위 테스트 생산성과 품질을 위한 단위 테스트 원칙과 패턴 📖 읽고 있는 책 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 아파치 카프카 애플리케이션 프로그래밍 with 자바 📕 읽은 책 코드로 배우는 스프링 부트 웹 프로젝트 자바 ORM 표준 JPA 프로그래밍 스프링 인 액션 5판 도메인 주도 설계로 시작하는 마이크로서비스 개발 🙈 아무래도 끝내지 못할 책 Node.js 교과서 Do it! Vue.js 입문
💻 Code : https://github.com/tedison7/ArenaBattle 로깅 환경의 설정 출력 로그 윈도우 언리얼 엔진은 로그(Log) 환경을 위해 UE_LOG 라는 매크로를 제공하고 있다. UE_LOG(카테고리, 로깅수준, 형식 문자열, 인자... ) 해당 매크로를 사용하여 생성된 로그는 Saved\Logs 폴더의 Log 파일과 출력로그 윈도우에서 확인할 수 있다. 로그 카테고리 로그에는 카테고리를 지정할 수 있다. 로그를 확인해보면 로그가 "카테고리:" 으로 시작하는것을 확인할 수 있다. 로깅 수준 로깅 수준은 크게 메시지(Log), 경고(Warning), 에러(Error) 세가지로 나뉜다. 각각 흰색, 노란색, 붉은색으로 출력 로그 윈도우에 표시된다. 색상은 편집 > 에디터 개인설정..
1. 시작하며 의존성을 주입하기 위해 필드에 @Autowired 를 사용하면 편리하지만 intellij나 sonarLint 에서 Constructor Injection 을 사용하라는 warning을 발생시킨다. 왜 경고가 발생하는지 스프링에서 의존성을 주입하는 방법을 알아보자. 2. Inversion of Control, DI(Dependency Injection) 이란 Inversion of Control (제어의 역전 - IoC) 일명 할리우드 원칙이라고도 불린다. don’t call me, I’ll call you. 나를 부르지 마라, 내가 너를 부를 것이다. 메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미한다. 이 방식은 대부분의 프레임워크에서 사용하는 방식..
💻 Code : https://github.com/tedison7/ArenaBattle 언리얼 컨텐츠의 구성요소 월드 언리얼 엔진의 가상 공간을 월드(world)라고 부른다. 월드에는 다음과 같은 요소가 제공된다. 공간(Space) : 가상 세계를 구성하는 3차원의 영역을 의미. 트랜스폼(Transform) 구조체를 제공하며 단위는 cm이다. 시간(Time) : 가상 공간에서 흐르는 시간 단위는 초 단위. 멈추거나 느리게 혹은 빠르게 속도를 조절할 수 있다. 물리(Physics) : 월드 공간에 있는 오브젝트에 작용하는 물리적인 환경. 대표적으로 중력이 있다. 물리적 영향을 받기 위해서는 콜리전(Collision)정보가 있어야 한다. 렌더링(Rendering) : 엔진이 제공하는 시각적인 기능. 빛과 머..
1. 시작하며 JPA Auditing 을 통해 등록/수정 날짜/시간 설정을 자동화 해보자. 2. 왜 JPA Auditing 쓰나? 매번 엔티티의 날짜/시간 데이터가 변경돨 때마다 이를 코드로 수정한다면 여기저기 입력/수정 코드를 구현해야한다. 그러나 JPA Auditing를 사용하면 공통으로 처리할 수 있다. 3. JPA Auditing 구현 1) BaseEntity 추상 클래스를 생성한다 도메인에 BaseEntity 클래스를 생성한다. BaseEntity는 모든 Entity의 상위 클래스이다. 따라서 이를 상속받는 Entity들의 createdDate, modifiedDate를 자동으로 관리하는 역할을 한다. @Getter @MappedSuperclass @EntityListeners(AuditingE..
💻 Code : https://github.com/tedison7/ArenaBattle 들어가며 이전에 유니티 엔진으로 개인프로젝트를 진행하며 공부를 하려고 했었다. 진행하다보니 현재 회사에서는 언리얼을 하고 있어서 언리얼의 기본을 더 다져야 한다는 생각이 들었다. 막연히 공식문서를 이것저것 읽어보기 보다 좀더 체계적으로 배우기 위해 책을 한권 구매하였다. 이득우의 언리얼 c++ 게임 개발의 정석 책을 구매하였고, 따라하면서 몇몇 내용들을 기록하고자 한다. 엔진 설치 및 비주얼 스튜디오는 설치를 한 상태이다. 프로젝트 생성단계부터 시작해보자 언리얼 프로젝트의 생성 기본 프로젝트 생성 책에서는 4.19버전으로 기록되어있으나 현재 최신버전인 4.27버전으로 프로젝트로 생성하였다. 삼인칭 템플릿으로 선택 시작..
개요 UE4(Unreal Engine)의 UPROPERTY에는 여러 메타데이터 지정자가 있다. 그 중 EditCondition(EditConditionHides) 지정자를 사용하여 UPROPERTY 값에 따라 에디터에서 속성을 선택적으로 활성화, 비활성화 및 숨기는 방법을 기록하고자 한다. 기본 사용 일반적으로 bool 타입을 지정하여 활성화, 비활성화 할 수 있다. UPROPERTY(EditAnywhere, Category = "Move") bool bCanMove = true; UPROPERTY(EditAnywhere, Category = "Move", meta = (EditCondition = "bCanMove")) int MoveSpeed = 100; 숨김 옵션 EditConditionHides ..
UE4 - Enum to String 로그 출력을 위해 Enum의 이름을 출력하고자 하는 경우가 있다. Enum을 다음과 같이 설정한다고 할때 UENUM(BlueprintType) enum class ECharState : uint8 { None = 0, Idle = 1, Run = 10, Jump = 100, }; 다음과 같이 FString 또는 FName으로 값을 얻어올 수 있다. void AStudyPlayerController::PrintEnumString() { static ECharState State = ECharState::Run; FName EnumToName = FName(TEXT("Invalid")); FString EnumToString = TEXT("Invalid"); const ..
1. 시작하며 롬복 어노테이션 사용시에 자꾸 헷갈려서 개인적인 기억 정리 용도로 기록해 두고자 한다. 2. 왜 Lombock을 쓰나? Getter, Setter, Constructor 등을 자동으로 생성해줘서 귀찮은 일을 줄여 준다. 단, 무한루프에 빠지거나 무분별하게 setter를 남발할 수 있으니 조심해서 쓰자 3. Lombok 설치 maven org.projectlombok lombok true gradle compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' gradle 5버전 이상은 annotationProcessor 'org.projectlombok:lombok' 을 추가해주어야 한다. 그렇지않..
월드 컴포지션 WorldComposition은 대규모 월드 관리를 위해 만들어진 툴이다. 퍼시스턴트 레벨을 이용하여 스트리밍 정보를 저장하지 않도록 하여 동시에 레벨 작업을 하고자 할 때 병목현상을 해결할 수 있다. 퍼시스턴트 레벨에는 스트리밍 정보를 폴더 검색을 통해 발견된 레벨을 스트리밍 레벨로 적용한다. 각 스트리밍 레벨에는 패키지 헤더 정보가 저장되어 있어, 월드 컴포지션은 레벨을 메모리에 로드하지 않고도 정보를 읽을 수 있다. 월드 컴포지션은 거리 기반 레벨 스트리밍에 사용되는 월드 원점 시프트 기능에 의존하는데 이를 통해서 거대한 월드를 만들 수 있다. 월드 컴포지션 활성화 월드 세팅에서 월드 컴포지션 활성화 옵션을 켜는것으로 활성화 시킬 수 있다. 레벨 계층구조 창 메뉴에서 레벨을 선택하면 ..
언리얼 스마트 포인터 라이브러리 언리얼 스마트 포인터 라이브러리(Unreal Smart Point Library)는 메모리 할당과 추적의 부담을 해소하도록 설계된 C++11 스마트 포인터들의 커스텀 구현이다. 표준인 Shared Pointer, Weak Pointer, Unique Pointer 와 null이 불가능한 Shared Reference 가 포함되어있다. 언리얼 오브젝트는 게임 코드에 더 최적화된 별도의 메모리 추적 시스템을 사용하기 때문에 Uobject 시스템과 사용할 수 없다. 스마트 포인터타입 Shared Pointer(TSharedPtr) 쉐어드 포인터는 참조하는 오브젝트를 소유하며, 무기한으로 오브젝트의 소멸을 방지하고, 참조하는 쉐어드 포인터나 쉐어드 레퍼런스가 없을 경우에 오브젝트..