반응형

게임 엔진 34

[Unreal] ESlateVisibility

개요 ESlateVisibility Visible 화면에 보이고 마우스와의 인터랙션이 발생한다. 레이어 밖에서의 인터랙션은 통하지 않는다. Collapsed 화면에 보이지 않게 한다. 레이아웃에 속해 있다면 공간도 차지하지 않는다. Hidden 화면에 보이지 않게 한다. Collaspsed와는 다르게, 레이아웃 안에서 공간은 차지한다. HitTestInvisible 화면에 보이지만 마우스와 인터랙션은 발생하지 않는다. 하위 위젯 또한 마우스와 인터랙션이 발생하지 않도록 한다. SelfHitTestInvisible HitTestInvisible와 동일하지만, 하위 위젯에는 적용되지 않는다. 기타 Visible은 오버헤드가 크다. 인터랙션이 필요 없는 UI라면 HitTestInvisible이나 SelfHit..

[Unreal] 캐릭터와 입력 시스템

앞서 이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다. 액터 액터는 월드에 속한 컨텐츠의 기본 단위이다. 액터는 트랜스폼을 가지고, 월드로부터 틱과 시간 서비스를 받는다. 액터는 논리적 개념이 아니다. 컴포넌트를 감싸는 포장 박스이다. 액터는 다수의 컴포넌트를 소유하고 있고 실질적인 구현은 컴포넌트에서 담당한다. 다수의 컴포넌트 중 컴포넌트를 대표하는 것을 루트 컴포넌트라고 한다. 액터는 반드시 루트 컴포넌트를 가져야하고, 루트 컴포넌트의 트랜스폼이 액터의 트랜스폼이 된다. 액터에서 컴포넌트 생성하기 컴포넌트는 언리얼 오브젝트(UObject) 이므로 UPROPERTY() 매크로를 설정해야 하고, TObjectPtr로 포인터 선언한다. CDO에서 생성한 오브젝트는 자동으로 월..

[Unreal] 메모리 관리

앞서 이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다. C++ 언어 메모리 관리의 문제점 C++은 메모리 주소에 직접 접근하는 포인터를 사용해 오브젝트를 관리한다. 메모리 누수 : new와 delete의 짝을 맞추지 않아 힙에 메모리가 남아 있는 경우 댕글링 포인터 : 이미 해제해서 무효화가 된 오브젝트의 주소를 포인터가 가리키는 경우 와일드 포인터 : 포인터의 값이 초기화되지 않은 경우 따라서 C++ 이후의 Java나 C#과 같은 언어에서는 포인터 대신 가비지 컬렉션 시스템을 도입했다. 가비지 컬렉션 프로그램에서 더 이상 사용하지 않는 오브젝트를 자동으로 감지해 메모리를 회수한다. 동적으로 생성된 모든 오브젝트 정보를 모아두고, 사용되지 않는 메모리를 추적한다. Mark ..

[Unreal] 델리게이트

앞서 이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다. 개요 언리얼 엔진에서 델리게이트를 사용하는 방법에 대해 서술한다. 델리게이트를 사용하면 느슨한 결합을 구현할 수 있다. 강한 결합 vs 느슨한 결합 강한 결합은 클래스들이 서로 의존성을 가지는 경우를 말한다. 앞선 예제에서는 Person이 Card 클래스를 가지고 있었다. 느슨한 결합은 추상적 설계에 의존한다. Card 클래스의 쓰임이 출입 체크라면 Person에서 Card를 직접 가지는 것이 아니라 ICheck라는 인터페이스를 가지고, Card가 ICheck 인터페이스를 상속받게 만들도록 구현한다. 이렇게 구현하면 Card 말고 다른 클래스로 출입 체크 기능을 구현해야 할 때, 그 클래스가 ICheck를 상속받게 구현..

[Unreal] 언리얼 컴포지션과 UENUM

앞서 이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다. 개요 Is - a 관계인 상속관계만으로 설계나 유지보수하기는 어렵다. Has - a 관계인 컴포지션을 활용해 성질이 다른 두 객체에서 한 객체가 다른 객체를 소유하는 설계를 구현할 수 있다. 컴포지션 관계를 언리얼에서 구현하는 방법은 크게 2가지이다. 1. CDO에 미리 언리얼 오브젝트를 생성해 조합한다. (무조건 포함할 때) : CreateDefaultSubobject() 사용 2. CDO에 빈 포인터만 넣고 런타임에 언리얼 오브젝트를 생성해 조합한다. (선택적으로 포함할 때) : NewObject 사용 이번 강의에서는 1.을 사용해 컴포지션을 구현한다. 내가 소유한 오브젝트를 SubObject라고 하고, 나를 소유한..

[Unreal] 인터페이스

앞서 이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다. 개요 인터페이스는 객체가 반드시 구현해야 하는 행동을 지정하는데 활용된다. 다형성을 구현하거나 디커플링을 하는데 유용하게 활용할 수 있다. 언리얼 C++ 인터페이스의 특징 인터페이스를 생성하면 두 개의 클래스가 생성된다. U로 시작하는 타입 클래스와 I로 시작하는 인터페이스 클래스가 있다. UInterface는 클래스 타입정보를 제공하고, IInterface는 실질적인 설계 및 구현을 담당한다. Java나 C#에서 인터페이스는 추상 타입으로만 선언할 수 있지만, 언리얼에서는 인터페이스도 구현이 가능하다. 언리얼 C++ 인터페이스 인터페이스 C++ 클래스를 만들면 다음과 같은 2개의 클래스가 만들어져 있다. 1. UINT..

[Unreal] 언리얼 리플렉션

앞서 이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다. 개요 리플렉션은 프로램이 실행시간에 자기 자신을 조사하는 것이다. 시리얼라이제이션, 가비지 컬렉션, 네트워크 리플리케이션 등이 리플렉션을 토대로 만들어졌다. 리플렉션 시스템에 보이도록 했으면 하는 유형이나 프로퍼티에 주석을 달아주면, Unreal Header Tool이 프로젝트 컴파일 시에 해당 정보를 수집해 소스 코드를 생성해준다. 예시로, 멤버 변수에는 UPROPERTY(), 멤버 함수에는 UFUNCTION()라는 매크로를 사용하면 UHT가 이것들을 확인한 뒤 Intermediate 폴더 내부에 필요한 코드를 생성해준다. UPROPERTY를 선언해주면 다음과 같은 기능을 갖는다. 1. 특정 속성들의 기본값을 설정해주..

[Unreal] 언리얼 오브젝트

앞서 이 포스팅은 이득우의 언리얼 프로그래밍 Part1을 수강하고 작성한 내용입니다. 개요 C++과 C#이나 JAVA와 같은 하이레벨 언어를 비교하면 다음과 같다. C++의 특징 메모리를 직접 제어 캐시 활용 극대화 저수준 API 호출 복사 작업 최소화 하이레벨 언어의 특징 유지보수성 향상 크래시로부터 보호 자동 메모리 관리 고질적 실수 예방 언리얼 오브젝트 언리얼 C++은 C++의 특징을 가지면서도 하이레벨 언어의 장점을 흡수하고자 했다. 이런 내부적인 기능을 자동으로 만들어질 수 있도록 UClASS() 매크로를 사용해줘야 한다. UCLASS()에는 클래스를 정의하는 프로퍼티와 함수 세트가 들어있다. 언리얼에서는 일반 C++ 오브젝트와 언리얼 오브젝트 모두 사용 가능하다. 일반 C++ 오브로젝트에는 접..

[Unreal] 언리얼 C++ 코딩 표준

클래스 체계 public을 선언 후 private 구현이 따라야 한다. -> 읽는 사람의 대부분은 클래스의 public 인터페이스를 사용하기 때문 명명 규칙 언리얼 엔진은 대부분 파스칼 케이싱을 사용, 단어 사이의 언더스코어( _ )를 사용하지 않음. 타입 이름에는 대문자로 이루어진 접두사를 포함하여 변수 이름과 구분함. 예를 들어서, FSkin은 타입 이름이고, Skin은 FSkin의 인스턴스임. 예시 UObject를 상속받으면 접두사 U를 사용 AActor를 상속받으면 (Actor는 UObject를 상속받았지만) 접두사 A 사용 SWidget(UI 관련)에서 상속받으면 접두사 S를 사용 추상 인터페이스 클래스에는 접두사 I를 사용 템플릿 클래스는 T 열거형은 E사용 bool변수는 예외적으로 소문자 b..

[Unity] Gpt를 활용한 가변 슬라이더 만들기

개요 가변 슬라이더를 만들어야 했는데... 다 만들고 난 뒤 GPT를 사용해 리팩토링한 경험을 공유한다. 니즈 원래 위와 같은 슬라이더가 있었다. 작은 흰색 동그라미가 50 단위로 있었는데, 보상 단위마다는 흰색 큰 동그라미를 넣어주었다. 이 슬라이더를 보상 간격이 일정하게 바꿔달라고 요청이 들어왔는데, 그러면 보상 단위마다 슬라이더가 차는 비율을 조정해야했다. 구현 QuestData = 현재 퀘스트 정보를 저장하고 있는 클래스 rewardData = 포인트 리워드 정보를 가지고 있는 클래스 int rewardDatesLength = rewardDatas.Count(); int rewardStep = 0; for (int idx = 0; idx < rewardDatesLength; idx++) { if ..

게임 엔진/Unity 2023.07.19
반응형