Mapping Tags to Attributes현재는 Strength 속성만 처리 중이며, 기존 방식을 따르면 속성마다 동일한 작업을 반복해야 한다.따라서 위젯 컨트롤러에서는 속성이 몇 개인지, 이름이 무엇인지 신경 쓰지 않고 모든 숙성을 자동으로 순회하며 브로드캐스트하는 구조를 만들 것이다. 이를 위해서 Map 자료 구조를 활용할 것이다.키는 GameplayTag로, 값은 GameplayAttribute가 되도록 매핑한다.Attribute Set에는 각 속성에 접근할 수 있는 Attribute Accessor가 존재하고, 이 함수들이 GameplayAttribute를 반환한다.하지만 이러면 함수 자체를 연결해서 저장해야하는 상황이지만, 함수는 일반 값처럼 저장할 수 없기 때문에 Delegate를 활용..
Widget Attribute Tags속성은 여러가지가 있지만, 지금은 Strength에 대해서만 설정하여 이에 대한 텍스트와 값을 설정하고 있다.따라서 이제 속성 정보가 들어왔을 때, 이 값이 어떤 속성인지 확인할 것이며, 이때 사용할 것이 Gaemplay Tag이다.이를 위해 버튼이 없는 기본 Text Value Row에서 Gameplay Tag 타입의 변수를 선언하고, 해당 변수를 공개 상태로 만들어 인스턴스에서 편집이 가능하도록 해주자. Attribute Menu에서 각 Row들의 이름을 알기 쉽도록 속성 명을 활용하여 바꿔줄 것이다.그리고 이 모든 값들을 Variable로 설정해주자. 그리고 EventGraph로 넘어와서 AttributeTags를 세팅하기 위한 함수를 설정해줄 것이다.추가로 S..
Attribute Info DelegateAttribute Menu Widget Controller를 할당했기에, 이제 Attribute Menu Widget에 표시해야하는 데이터를 전달해야 한다.이를 위해서는 콜백에 위젯을 바인딩하고, 초기 값을 브로드캐스트하는 작업이 필요하다.위젯 컨트롤러 -> 데이터 브로드캐스트 -> 위젯 수신 -> UI 갱신 broadcast할 데이터는 이미 만들어준 Aura Attribute Info(Data Asset)을 활용한다.해당 데이터는 하나의 속성에 대해 다음과 같은 정보를 담고 있다.Gameplay Tag이름(Name)설명(Description)값(Attribute Value) 따라서 앞으로 위젯 컨트롤러는 이 구조체를 브로드캐스트하고, 속성 메뉴 위젯에서 이 구조..
Constructing the Attribute Menu Widget Controller기존에 만들었던 Overlay Widget Controller 패턴을 그대로 활용하여 Attribute Menu Widget Controller를 구성할 차례이다.먼저 Overlay Widget Controller 구조를 다시 확인해보자면 다음과 AuraHUD에 다음과 같은 요소들이 존재한다.TObjectPtr OverlayWidget;- 실세 생성된 위젯 인스턴스Overlay Widget Class- 블루프린트에서 설정하는 클래스Overlay Widget Controller- 실제 생성된 컨트롤러Overlay Widget Controller Class- 블루프린트에서 지정하는 컨트롤러 클래스 그리고 수정사항으로 Ov..
Aura Ability System Blueprint Library우리는 프로젝트 전체에서 단 하나만 존재하는 위젯 컨트롤러에 어디서든 안전하게 접근할 수 있는 구조를 만들 것이다.특히 Blueprint에서 간단하게 함수 하나만 호출해서 현재 존재하는 위젯 컨트롤러를 얻을 수 있도록 Blueprint Function Library를 제작한다. 하지만 현재는 HUD -> Widget Contrller 생성 -> Attribute Menu 전달과 같은 방식으로 동작한다.즉 Attribute Menu가 자기 컨트롤러를 직접 찾는 거싱 아니라, Overlay 쪽에서 만들어서 넣어주는 구조이다. Overlay Widget Contrller의 경우에는 다음과 같은 문제가 있다.Health GlobeMana Glob..
Attribute Menu Widget Controller이제 Attribute Menu 전용 위젯 컨트롤러를 만들 것이다.기본 Aura Widget Controller를 상속받아 핵심 기능을 재사용한다. 그리고 핵심 기능인 바인딩 처리용 함수와, 초기 값 브로드캐스트 처리 함수를 상속해주자.현재 해당 함수들의 내용이 비어있기에 Super를 호출할 필요가 없다.이후에 필요할 때 새로 내용을 구현할 것이다. 설계 방향현재 OverlayWidgetController는 이미 존재하며, AuraHUD에서 getOverlayWidgetController() 함수를 통해 관리되고 있다.AttributeMenuWidgetController 또한 동일한 방식으로 적용되며, HUD 또는 중앙 관리 클래스에서 생성 및 ..
Attribute Info Data Asset등록한 Tag를 토대로, 속성 정보 매핑을 구현할 것이다.Data Asset 기반으로 클래스를 생성하여, 속성의 이름과 설명 등을 관리한다. 속성이 변경될 때 Widget에 단순한 숫자만 전달하는 것이 아니라, 태그, 이름, 설명, 값 등 여러 값들을 전달해야하기 때문에 우선 하나의 속성 정보를 담는 구조체를 만들어줄 것이다.여기서 AttributeValue의 경우 게임에서 계속 바뀌는 값이며 Data Asset에서 설정하는 값이 아니기에 Edit이 불가능하도록 한다. 그리고 현재는 단순히 Tag만 알고 있는 경우가 많기에, Tag를 토대로 나머지 정보를 조회할 수 있는 함수를 만들어준다.그리고 속성을 하나만 저장하는 것이 아니기 때문에 배열을 사용하여 속성 ..
Native Gameplay Tags현재 Armor 속성에 대해서만 등록했으니, 나머지 속성들도 전부 등록해주자.이에 앞서 등록되어있는 MaxHealth와 MaxMana는 삭제해줄 것이다. 이제 저번과 같은 방식으로 나머지 속성들도 등록해주자.Secondary 속성 뿐만 아니라, Primary 속성들도 등록해줄 것이다. 이제 컴파일을 하고 확인해보면 무사히 전부 등록된 것을 볼 수있다. 그리고 블루프린트에서 Tag Container를 통해서 단일 Tag 호출이 가능하다.
Aura Asset ManagerGameplay Tag 초기화 함수는 존재하지만, 현재 이를 호출할 명확한 초기화 위치가 없다.를 해결하기 위해 Asset Manager의 초기화 단계(StartInitialLoading)를 사용한다. Asset Manager는 엔진 레벨에서 단 하나 존재하는 싱글톤이며, 프로젝트의 초기 로딩과 에셋 관리를 담당한다.따라서 게임 시작 시 Asset Manager 초기 로딩 시점에 Gameplay Tag 초기화 함수를 호출하여 모든 Native Gameplay Tag를 등록할 것이다.따라서 AssetManager 클래스를 만들어주자. Asset Manager은 엔진 레벨 싱글톤이며, 전역에서 접근이 가능해야한다.따라서 Public 영역에 Get 함수를 만들어 Engine이 ..
Gameplay Tags Singleton현재 Attribute Menu 자체는 만들었지만, UI 메뉴에 데이터를 broadcast하려면 각 속성을 식별할 수 있는 방법이 필요하다.이를 위해서 각 Attribute 마다 고유한 Gameplay Tag를 부여하여 활용할 것이다. 기존에는 Project Settings에서 직접 태그를 추가하거나, Data Table을 사용했지만 C++에서는 긴 문자열을 계속 작성해야해서 오타의 위험이나 유지보수가 어렵다는 단점이 있다.따라서 다음과 같이 변수로 접근하여 활용할 것이다."Attributes.Secondary.Armor" -> XGameplayTags.Attributes_Secondary_Armor -> O 이에 대한 해결방안으로 프로젝트 전체에서 사용할 Gam..
Plan for Displaying Attribute DataAttribute 메뉴를 만들었으니, 이제 각 속성의 이름, 값, 설명 등의 툴팁을 UI에 표시하여야한다.이를 위해서는 다음과 같은 과정들이 필요하다.Attribute 데이터 → UI 전달Attribute 변경 감지변경된 데이터 UI 갱신 가장 단순한 접근 방식 예시를 보자면 다음과 같다.Strength 변경↓ASC(Attribute System Component)가 Delegate Broadcast↓Widget Controller 수신↓Widget Controller가 Delegate Broadcast↓Strenth Row Widget 수신↓UI 업데이트 (Strength 값 변경) 다만 이러한 방식은 각 속성마다 Delegate/바인딩을 위..
Closing the Attribute MenuAttribute Menu를 활성화시키는 것까지는 했지만, 지금 상태로는 메뉴 창을 닫을 수 없다.따라서 만들어둔 버튼으로 메뉴창을 닫는 것을 구현할 것이다. 이는 간단하게, WBP_AttributeMenu 위젯에서 해당 버튼을 불러와서 함수를 바인딩해줄 것이다.여기서는 Remove from Parent 함수를 통해 위젯을 없애준다. 이렇게 하면 메뉴창은 사라지지만, 기존의 메뉴 활성화 버튼이 비활성화 상태 그대로 되어있다.따라서 이를 다시 활성화 상태로 바꿔주어야 한다.여기서는 Event Dispatchers를 사용하여 위젯이 파괴됐을 때 메뉴가 닫혔다는 것을 알릴 것이다. 이러면 해당 내용을 WBP_Overay 위젯에서 수신하여, Attribute Men..
Opening the Attribute MenuAttribute Menu와 그에 대한 버튼은 만들었지만, 실제 기능은 없는 상태이다.따라서 버튼 클릭시 Attribute Menu 위젯이 보이도록 해줄 것이다.먼저 버튼 클릭에 대한 바인드 함수를 설정해주자. 내용이 길어질 것을 고려하여, 바인드 호출 함수는 따로 Custom 함수로 빼서 설정하였다.버튼 클릭시 기존 버튼을 비활성화시켜주고, Attribute Menu를 생성해 Viewport에 추가해주자. 이대로 게임을 실행해보면, Attribute Menu가 화면 전체를 꽉 채우는 것을 볼 수 있다.이는 해당 위젯의 최상단이 Size Box이므로, 이를 가득 채우면서 생기는 문제이다. 이를 해결하기 위해서 SizeBox위에 Overlay를 추가해주자.이러..
Wide Button WidgetAttributeMenu 위젯의 버튼을 새롭게 만든 Button 위젯으로 대체한 것처럼, TextValueButton 위젯의 Button도 바꿔주자. 그리고 버튼과 관련된 값들은 모두 외부에서 수정할 수 있도록 전부 공개 상태로 만들어주었다. 이제 디테일 패널에서 해당 값들을 자유롭게 변경할 수 있다. 그리고 기존 버튼 위젯을 상속하여 AttributeMenu를 열기 위한 와이드 버튼도 만들 것이다.가로 200으로 바꾼 초기값의 모습은 다음과 같다. 우리가 사용할 WideButton용 이미지는 테두리가 이미 존재한다.따라서 테두리에 해당하는 BorderBrush의 투명도를 올려 보이지 않게 할 것이다. 이 상태의 모습과, WideButton용 이미지를 할당한 상태는 다음..
Button Widget지난번에 만든 Menu 위젯을 우선 조금씩 수정해줄 것이다.보조 속성 Text의 위치를 스크롤 박스 위로 옮겨주고, Spacer를 맨아래 하나 더 추가하고, 나머지는 간격을 재조정할 것이다. 그리고 우측 하단에 Menu 위젯을 닫기 위한 버튼을 새롭게 만들어주자.버튼은 저번과 동일하게 Normal/Hovered/Pressed/Disabled 상태에 따라 이미지를 다르게 사용하고 Padding을 활용하여 간격을 조정한다.또 이때 중요한 것은 Warp Box 내부에 넣는 것이 아니라 별도의 Overlay를 통해 Button 이미지와 Text를 배치한다. 지금은 버튼을 만들 때마다 테두리 이미지, 버튼 이미지, 텍스트를 계속 반복하여 만들고 있다.따라서 효율성을 위해 공용 Button..
