전체 글 283

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (24) UI와 GE의 Tag 연동 준비

이번 포스트에서는 이전 포스트에서 소개해드린,GE의 Tag와 UI를 연동하는 작업의 준비를 해보도록 하겠습니다. 우선, 기존의 Ability System Component에서 수행하던 작업을 델리게이트를 통해 UI Controller에게 넘겨주어 처리하도록 하겠습니다. 1) AuraAbilitySystemComponent#pragma once#include "CoreMinimal.h"#include "AbilitySystemComponent.h"#include "AuraAbilitySystemComponent.generated.h"DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTags, const FGameplayTagContainer& /*AssetTags*/);..

유니티 입력 처리 심화 - (9) Player Input 컴포넌트 - Broadcast Messages

이번 포스트에서는 Player Input 컴포넌트를 통해 Input System을 사용하는 4가지 방법 중에서두번째인 Broadcast Messages를 알아보겠습니다. Broadcast Messages의 경우, 동작하는 방식이 Send Message와는 크게 차이가 없지만수행하는 콜백 함수가 Player Input 컴포넌트를 가진 오브젝트가 아닌Player Input 컴포넌트를 가진 오브젝트의 자식 오브젝트의 것이라는 차이가 있습니다. 즉, 정리하자면 Broadcast Messages 방식은자식 오브젝트의 함수를 호출하는 것에서 Send Messages와 큰 차이가 존재합니다. 이제 예제를 통해 사용하는 방법을 알아 보도록 하겠습니다. 1) PlayerInput 컴포넌트 - Broadcast Messa..

유니티 입력 처리 심화 - (8) Player Input 컴포넌트 - Send Messages

이번 포스트에서는 Player Input 컴포넌트를 통해 Input System을 사용하는 4가지 방법 중에서첫번째로 Send Messages를 알아보겠습니다. Player Input 컴포넌트를 추가한 후에,Behavior 항목에서 Send Messages로 설정하였습니다.  위와 같이 설정한 Input Action Asset - Action Map 아래의 기본적인 Input Action들 외에도추가적으로 만든 Input Action들이 보이는 것을 확인할 수 있습니다. Send Messages 방식은 다음과 같이 동작합니다.입력 이벤트에 따라 호출할 함수의 이름 규약은 On + Input Action명으로 지어집니다.이때, 내부적으로 GameObject.SendMessages 메서드를 통해PlayerI..

유니티 입력 처리 심화 - (7) Player Input 컴포넌트를 통한 입력 처리

이번 포스트에서는 유니티에서의 입력을 처리하는 4가지 단계 중에서 마지막 단계인Player Input 컴포넌트를 사용하여 입력을 설정하는 방법을 알아보겠습니다.Player Input 컴포넌트는 다음과 같이 동작합니다.  Player Input 컴포넌트를 이용한 입력 처리 방법은 기존에 사용하던 키 대신, 다른 키와 입력 함수를 연결하는 리바인딩(Rebinding)이 가능하므로상업적인 게임에서 사용하기 매우 적합합니다. 우선, Player Input 컴포넌트를 오브젝트에 추가해보겠습니다.여기서 추가되는 하나의 Player Input 컴포넌트는 플레이어 한 명을 의미합니다.추가한 Player Input 컴포넌트는 다음과 같이 구성되어 있습니다.  1) Player Input 컴포넌트의 구성우선적으로 사용할 ..

직렬화(Serialization) 2

이번에는 기존의 패킷에서 Session들에서 수행하던Read와 Write를 패킷에서 수행할 수 있도록 변경해보겠습니다. 공통적으로 패킷의 구조를 다음과 같이 변경하였습니다.차후에 패킷의 클래스를 따로 선언하여 클라이언트와 서버가 갖게끔 구성하도록 수정하겠습니다. 1) Server와 Client 모두가 공통적으로 갖는 패킷 // 패킷의 인자를 설정하는 경우, 최대한 용량을 줄여주는 것이 좋음public abstract class Packet{ // 패킷의 용량 public ushort _packetSize; // 패킷의 아이디 public ushort _packetID; // 패킷을 읽고, 패킷에 쓰기 위한 함수 public abstract void Read(ArraySeg..

C# 2025.01.01

직렬화(Serialization) 1

이번 포스트에서는 네트워크 통신에서의 직렬화에 대해 알아보겠습니다.직렬화는네트워크 뿐만이 아닌 다른 상황에서도 보편적으로 사용하는 단어입니다.그리고 네트워크 통신에서의 직렬화는 다음과 같이 사용할 수 있습니다. 1) 직렬화 : Send 버퍼안에 전송할 데이터를 압축하여 집어넣는 작업을 의미대표적으로 OnConnected 에서 수행하는 로직이 해당합니다.2) 역직렬화 : Recv 버퍼에 담겨진 압축된 데이터를 다시 원상태로 늘리는 작업을 의미대표적으로 서버의 OnRecvPacket과 클라의 OnRecv에서 수행하는 로직이 해당합니다. 이 포스트에 소개해드릴 직렬화와 관련된 작업은 자동화 이전에 자동화 작업이 어떻게 이뤄질 지 간략하게 알아보도록 하겠습니다. 1) 클라이언트1 - 1) Client{ // 기..

C# 2025.01.01

2D RPG - (12 - 2) 카운터 어택 구현하기

지난 포스트에 이어 이번에는 플레이어 코드를 구현해보록 하겠습니다. 1) PlayerControllerpublic class PlayerController : BaseCharacterController{ . . . #region States . . . public PlayerStateCounterAttack _counterAttackState { get; private set; } #endregion // Player Input . . . [SerializeField] InputAction _counterAttackAction; . . . // Attack Info [Header("Attack Details")] . . . public float _coun..

2D RPG - (12 - 1) 카운터 어택 구현하기

이번 포스트에서는 적의 공격을 반격하는 카운터 어택 기능을 구현해보도록 하겠습니다. 위와 같이 카운터 어택이 성공하였을 때,평범하게 공격받을 때와 다르게 이펙트가 발생하는 것을 볼 수 있습니다 적에게서 보여지는 빨간색 사각형이 유요한 동안에만 카운터 어택을 수행할 수 있으며,플레이어의 경우 카운터 어택이 성공하면 성공 시의 애니메이션이 연출되는 것을 확인할 수 있습니다. 1) BaseEffectControllerpublic class BaseEffectController : MonoBehaviour{ . . . void RedColorBlink() { if(_spriteRenderer.color != Color.white) _spriteRenderer.colo..

PacketSession

TCP 통신환경에서는상황을 고려하여 패킷을 완전하게 보내지 않고 내용의 일부를 잘라 전송합니다.이때, 패킷이 완전히 도착하지 않고 잘려서 오는 경우에잘려진 패킷을 올바르게 결합하는 여러 방법이 존재합니다. 이번 프로젝트에서는 패킷 별로 ID를 설정하여 잘려진 패킷을 결합하는 방식을 구현해보도록 하겠습니다.ID를 설정하는 경우에 인자로 패킷의 사이즈와 패킷의 ID를 우선적으로 설정해야 합니다.그리고 이렇게 우선적으로 설정되는 패킷의 메모리를 Header라고 부릅니다. Header를 구현하는 경우에는 용량을 최대한 줄이고,Header의 메모리도 Header에 기록할지 결정해야 합니다.이번 프로젝트에서는 Header에 Header의 메모리도 기록하겠습니다.따라서 Header의 메모리 크기도 Header에 포함..

C# 2024.12.31