GAS 동작원리 GAS를 적용하기 위해서는 기본적인 규칙을 지켜야 한다. GAS를 적용할 액터에 AbilitySystemInterface의 GetAbilitySystemComponent()를 구현해야 한다. GetAbilitySystemComponent에서는 액터가 소유한 ASC(AbilitySystemComponent)를 return 해줘야 한다. 이렇게 설정된 ASC에 Ability를 부여하고 원하는 타이밍에 Ability를 발동시키면 된다. 간단한 예를 들어보자. 어떤 액터가 게임이 시작함과 동시에 계속하여 반복하는 행위를 한다고 가정해보자. 그렇다면 반복되는 행위를 Ability로 만들고 BeginPlay나 특정한 시점에 Abiltiy를 활성화시키면 된다. 예시 앞에서 말한 대로 예시를 만들어보자..
Unreal
GAS란? GAS란 Game Ability System의 줄임말로 액터가 소유하고 발동할 수 있는 어빌리티 및 액터 간의 인터렉션 기능을 제공하는 프레임워크이다. GAS는 데이터를 기반으로 동작하며 모듈화되어 확장성이나 유연성이 좋다. 또한, 네트워크 멀티플레이를 지원하기도 한다. 이러한 이유로 GAS는 게임을 보다 효율적으로 제작할 수 있도록 해준다. GAS 구성 요소 GAS의 핵심 요소는 위의 사진과 같다. 각각의 요소들이 어떠한 역할을 하는지 간단하게 정리하면 다음과 같다. ASC: Ability System을 관리하는 중앙처리장치 같은 역할을 한다. Tag: GAS를 간편하게 관리하게 해주는 구분자 GA: 게임 내에서 일어나는 액션 GE: GA의 결과로 Attibute에 주는 영향 Attribut..
BeginPlay 프로젝트 중 상호작용 가능한 Actor에 WidgetComponent를 넣어 놨는데 해당 위젯이 보이지 않는 현상이 발견되어 많은 시간을 고민했다. 기존에도 했던 방식인데 다른 Actor에서는 동일한 Widget을 써도 올바르게 동작하고 Root로 설정한 Mesh의 scale 문제인지도 체크해 봤다. 계속 찾아보다 다른 점 하나를 발견했다. 다른 점은 BeginPlay에서 Super의 BeginPlay를 호출하지 않은 것이었다. Super인 AActor의 BeginPlay에서는 Component를 초기화하는 부분이 있다. //... for (UActorComponent* Component : Components) { // bHasBegunPlay will be true for the c..
상속과 인터페이스 상속과 인터페이스의 공통점은 다형성이다. 상속은 자주 사용하지만 인터페이스는 자주 사용하지 않았다. 프로젝트를 진행하던 중 적절한 사용상황을 발견하여 기록한다. 프로젝트 중, NPC와 Drop Item 모두 캐릭터와 상호작용하는 경우가 있다. NPC는 대화를 통해 퀘스트를 주고, Drop Item은 Inventory에 Item을 추가한다. 둘 다, 상호작용하는 Actor이기 때문에 하나의 부모를 가지고 Interact 함수를 구현한 뒤 상속받게 하였다. 하지만, NPC를 구현하다 문제가 발생했다. 올바르게 동작하지만, 원하지 않는 상속이 이루어지게 되는 문제였다. 예를 들어, 부모 클래스인 InteractiveActor에서 Item에 관한 정보를 가지고 있다고 가정했을 때, NPC는 I..
Slate Slate란 Unreal Editor 또는 게임 내 사용자 인터페이스와 같은 도구 및 응용 프로그램용 사용자 인터페이스를 효율적으로 구축하도록 설계된 플랫폼에 구애받지 않는 맞춤형 사용자 인터페이스 프레임워크이다. 즉, UI를 만들 수 있는 프레임워크라고 생각하면 된다. 에디터에 있는 UI들도 만들 수 있지만, 인게임에 사용되는 UI도 생성가능하다. 하지만, 인게임 UI는 UMG를 통해 만드는 게 효율적이다. UMG도 계속 부모를 타고가다보면 Slate를 이용하여 구현하였다. 예시 UButton의 클릭 처리를 할 때, OnClicked에 함수를 바인딩하여 사용한다. MyButton->OnClicked.AddDynamic(this, &MyClass::MyOnClick); Button클래스를 뜯어..
UserWidget의 Native UserWidget을 상속하여 UMG작업을 하면 Native~~라는 함수를 자주 사용한다. 하지만, UserWidget에는 Native가 없는 함수들도 존재한다. 예를 들면, UserWidget에는 NativeOnMouseButtonDown라는 함수도 존재하고 OnMouseButtonDown라는 함수도 존재한다. 이 두 함수의 차이점을 알고 싶어 자세히 살펴보니 NativeOnMouseButtonDown에서 OnMouseButtonDown를 호출하는 것을 알 수 있었다. 그렇다면 NativeOnMouseButtonDown가 존재하는 이유가 무엇인지 알아보려 글을 쓴다. Native 위에서 언급한 두 함수의 차이는 Native의 여부이다. 따라서, Native에 대해 알아..
언리얼 스마트 포인터 스마트 포인터는 원시 포인터를 안전하고 효율적으로 사용하기 위해 만들어진 개념이다. 원시 포인터란 *를 통해 표현하는 것을 말한다. 이를 사용하면 댕글링 포인터나 이중 해제 등 문제가 발생할 수 있다. 예를 들어, 여러 곳에서 하나의 객체를 가리키고 있었다고 가정해 보자. 중간에 이 객체가 쓰임을 다해 소멸을 시켰다고 한다면 이를 가리키고 있는 모든 포인터가 유효하지 않는 값을 가리키고 있게 되는 것이다. 만약 이를 인지하지 못하고 사용한다면 엉뚱한 주소의 값을 변경하거나 런타임 에러가 발생할 수 있다. 이를 방지하기 위해 만들어진게 스마트 포인터이다. 스마트 포인터 타입 언리얼에서는 C++의 스마트 포인터를 사용하여 새로운 스마트 포인터를 만들어 제공한다. Shared Pointe..
Token 만들기 개발 중인 게임에 필요한 Token을 제작하는 과정 원하는 3D 에셋은 다음과 같은 모양이다. 모델링 모델링은 크게 2가지만 하면 된다. token의 밑부분인 동전과 같은 부분 token의 위에 올라가는 광석 부분 동전 부분 cylinder를 이용하여 만드는 방법과 원으로부터 만들 수 있다. 이번에는 원에서 시작하겠다. 원을 생성한다. Tab을 눌러 edit mode로 변경한다. F를 눌러 표면을 생성한다. 그다음은 만들어진 원을 이용하여 입체적인 물체를 만들면 된다. E를 눌러 높이를 만들어 준다. I를 눌러 안쪽으로 추가적인 점을 생성한다. 다시 E를 눌러 안쪽의 높이를 낮춘다. 광석 부분 IcoSphere를 이용하면 광석과 같은 모양을 쉽게 만들 수 있다. IcoSphere의 Su..
Replication Replication이란 Server와 Client사이의 명령과 데이터를 주고받는 것이다. 즉, Server와 Client의 동기화라고 생각하면 된다. Replication의 방식은 두 가지이다. 프로퍼티 업데이트 RPC (Remote Procedure Call). 프로퍼티 리플리케이션과 RPC 사이의 큰 차이점은, 프로퍼티는 변경될 때마다 자동으로 리플리케이트되는 반면, RPC는 실행될 때만 리플리케이트된다는 점이다. 쉽게 말하면 프로퍼티 업데이트는 자동, RPC는 수동이다. 프로퍼티 업데이트 예를 들어, 한 캐릭터의 체력을 나타내는 변수는 프로퍼티 업데이트 방식을 이용하여 데미지를 입었을 때 자동으로 Replication이 되게 할 수 있다. 하지만, 프로퍼티의 변화를 감지하는 ..
Travel Map을 이동하기 위해서는 Travel을 이용해야 한다. Travel은 크게 Seamless 방식과 non-seamless방식으로 나뉜다. Seamless 방식은 Player들의 연결 해제 없이 매끄럽게 Map을 이동한다. 매끄러운 이동을 위해 TransitionMap을 이용하는데, TransitionMap이란 목적이 되는 Map으로 이동하기 전에 거쳐가는 Map이다. 쉽게 생각하면 맵을 이동 하면서 로딩화면을 띄운다고 생각하면 된다. 또한, Seamless 방식으로 Map을 이동하면 몇 개의 액터를 지속시킬 수 있다. 다음은 지속시킬 수 있는 액터들이다. GameMode 액터 (서버만) AGameModeBase::GetSeamlessTravelActorList 를 통해 추가된 액터 유효한 ..