분류 전체보기 269

유니티 입력 처리 심화 - (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

2D RPG - (11) 피격에 따른 효과 구현하기

지난 포스트에서는 스켈레톤의 기본적인 구조를 갖춰놓았습니다.이번에는 공격받았을 경우, 피격 효과를 구현해보도록 하겠습니다. 피격 효과의 구현은 Animation Event를 통해 발동시키도록 하겠습니다. 1) BaseEffectControllerpublic class BaseEffectController : MonoBehaviour{ private SpriteRenderer _spriteRenderer; [Header("Flash FX")] [SerializeField] private float _flashDuration; private Material _defaultMaterial; [SerializeField] private Material _hitMaterial..

RecvBuffer와 SendBuffer

기존의 프로젝트 코드는 TCP를 사용하여 네트워크 통신을 하는 경우, 상황을 고려하여 분할되어 전송된 패킷을 온전히 받지 못하는 문제가 있으므로이를 수정하도록 하겠습니다. 이때 RecvBuffer와 SendBuffer는 설계구조에서 약간의 차이가 존재합니다.RecvBuffer의 경우, 클라이언트(=유저)별로 보내는 데이터가 다르므로 Session 별로 다르게 생성하여 갖고 있습니다.하지만 SendBuffer의 경우 다른데, 일단 크기가 일정하고 또한 SendBuffer의 경우Session이 갖는 것이 아닌 Server가 직접 갖고 있게 됩니다.이러한 이유는 외부에서 Send할 데이터를 만든 다음 해당 데이터를 내부로 넘기는 방식은성능적인 문제를 발생시키므로 외부에서 Send를 처리하도록 하겠습니다.1) ..

C# 2024.12.30

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (23) GE의 델리게이트를 통해 현재 적용되는 GE의 Tag를 출력하기

이번에는 이전에 배운 Gameplay Effect의 Tag를 한번 화면에 띄워 보도록 하겠습니다.따라서 Gameplay Effect가 적용될 때 사용할 수 있는 델리게이트를 사용하여 이를 구현해보겠습니다. 1) AbilitySystemComponent의 델리게이트GAS의 주체인 ASC는 많은 기능을 지원합니다.그 중에서도 OnGameplayEffectAppliedDelegateToSelf 델리게이트는 GameplayEffect가 자기자신에게 적용되는 경우 호출됩니다.따라서 해당 델리게이트를 사용해보도록 하겠습니다. 2) 코드 일부를 수정또한, 코드 구조를 일부 수정하도록 하겠습니다.현재 구조에서 AuraCharacterBase가 부모 클래스이고,AuraPlayer와 AuraEnemy가 부모 클래스에서 상..