전체 글 283

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (27) OverlayWidgetController 리팩토링

이번 포스트에서는 기존에 사용하던 WidgetController의 코드를 리팩토링하겠습니다.이전의 WidgetController는 Attribute 별로 델리게이트가 존재하고,델리게이트 별로 연결하는 콜백함수가 따로 존재하였습니다.  하지만, 생각해보면 위의 로직은 Attribute가 변경될 때마다 호출되고,float값을 인자로 사용한다는 공통점이 존재합니다.따라서 델리게이트를 하나로 묶어 관리하면Attribute가 추가될 때마다 델리게이트를 만들지 않아도 되고또 콜백함수가 아닌 람다를 사용하면 불필요한 콜백함수를 선언 + 정의할 필요도 없어집니다.따라서 다음과 같이 코드를 수정하겠습니다. 1) AuraOverlayWdigetControllerDECLARE_DYNAMIC_MULTICAST_DELEGATE..

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (26) 메세지를 위한 전용 UI 만들기

이번 포스트에서는 이전까지 화면에 띄우기만 한 Tag별 메세지를 전용 UI를 만들어 프로젝트에서 사용해보겠습니다. 1) WBP_EffectMessage AuraUserWidget을 상속받은 새로운 위젯 블루 프린트를 생성합니다.해당 위젯의 계층 구조는 다음과 같습니다. 또, Image와 Text에는 애니메이션을 추가하여 UI로서의 효과를 추가하였습니다. 사용하는 함수는 다음과 같습니다.우선, Event Graph에서 다음의 멤버 함수를 추가합니다. DestroyDelay는 0.5초 뒤에 메세지 위젯을 파괴합니다.이후 외부에서 사용할 함수를 정의합니다. SetImageandText 함수는 인자로 Image와 Text를 받습니다.우선, Text를 SetText로 TextMessage 변수에 저장합니다.그리고..

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (25) Data Table을 활용하여 GE별 메세지 출력하기

이번 포스트에서는 이전에 만든 Data Table을 활용하여GE가 발동된 경우, GameplayTag 그 자체를 출력하는 것이 아닌GameplayTag 별 메세지를 출력하도록 수정해보겠습니다. 1) DT_MessageWidgetData기존에 만든 DataTable을 다음과 같이 수정했습니다. 이제 DataTable에 저장된 정보대로 Message Tag와 GE의 GameplayTag를 대조하여 Message를 출력하게 됩니다.따라서 이전에 만든 GE들의 태그를 Message Tag와 동일하게 변경해줘야 합니다. 2) 이전에 만든 GE 블루프린트 이전에 만든 4개의 GE 블루 프린트 모두 위와 같이 Message 태그를 갖도록 설정하였습니다.이제 C++ 스크립트에서 몇 가지 수정을 해줘야 합니다. 3) A..

유니티 입력 처리 심화 - (12) UI 입력

이번 포스트에서는 새로운 Input System을 사용한 UI 입력을 처리해보도록 하겠습니다.우선, 두개의 버튼을 생성해보도록 하겠습니다.생성하면 다음과 같이 Event System 오브젝트가 자동으로 생성되는 것을 볼 수 있습니다. 1) Event System이란?UI 요소를 생성한 후에 자동으로 생성되는 EventSystem은 입력과 UI 요소를 연결해주는 오브젝트입니다.생성된 EventSystem에서 기본적으로 총 3개의 컴포넌트가 있는데,각각 Transform, Event System, 그리고 Input System UI Input Module입니다. 이중에서 Input System UI Input Module에서새로운 Input System을 사용하게끔 설정하면 기본적인 Action Asset을..

Packet Generator #4

이번 포스트에서는 자동으로 생성된 패킷을 세션에 일일이 복사 + 붙여넣기 하는 방식을 수정하겠습니다.이전까지 PacketGenerator를 빌드하게 되면,아래와 같이 실행파일이 생성 + 동작하여 패킷을 생성하였습니다. 이제 새로 bat 실행 파일을 만들어 bat 파일을 실행하면 Client와 Server의 폴더 안에 패킷을 만들어주는 작업을 수행하겠습니다. 1) PacketGenerator...class PacketGenerator{ static string genPackets; static ushort packetID; static string packetEnums; static void Main(string[] args) { string pdlPath = "....

C# 2025.01.08

Packet Generator #3

이번 포스트에서는 Packet의 포맷이 아닌Packet을 담고 있는 파일 그 자체의 포맷을 만들도록 하겠습니다.추가적으로 byte 자료형에 대한 처리와 자료구조 안에 자료구조가 있는 경우도 어떻게 처리되는지 확인해보도록 하겠습니다. 1) PacketFormat class PacketFormat { public static string fileFormat =@"using System;using System.Collections.Generic;using System.Net;using System.Text;using ServerCore;public enum PacketID{{ {0}}}{1}"; // {0} 패킷 이름 // {1} 패킷 번호 p..

C# 2025.01.08

2D RPG - (14) 분신술 스킬 구현

이번 포스트에서는 첫번째 스킬 중 분신술을 구현해보겠습니다.분신술을 위한 키를 따로 설정하지 않아 대쉬에 연동하여 발동하는 스킬로서,분신은 적을 발견하면 적을 공격하게 됩니다. 분신술은 다음의절차에 의해 수행됩니다.플레이어가 입력하면 SkillManager에 의해 분신술을 수행수행된 분신술에서 이전에 만들고 설정해놓은 분신 Prefab을 생성분신 Prefab에 설정된 컴포넌트에 의해 로직을 수행위의 절차에 맞춰 코드를 알아보겠습니다. 1) SkillCloningpublic class SkillCloning : SkillTemplate{ [Header("Clone Info")] [SerializeField] private GameObject _clonePrefab; [Serialize..

Packet Generator #2

이번 포스트에서는 패킷을 자동으로 생성하는 과정에서 패킷에 포함되어 있던구조체와, 구조체를 담은 자료구조까지 패킷에 포함시켜 생성해보도록 하겠습니다.기존의 코드에서 일부 변경사항이 추가되었고,마지막에는 기존의 세션에서 사용하던 패킷 코드를 자동 생성된 패킷으로 교체헤보도록 하겠습니다.염두할 변경사항으로는 기존의 StatInfo로 사용하던 구초제 이름을 Stat으로 변경한 것입니다. 1) PacketGeneratorclass Program{ static string genPackets; static void Main(string[] args) { XmlReaderSettings settings = new XmlReaderSettings() { I..

C# 2025.01.07