전체 글 283

2D RPG - (3) StateMachine의 구성과 완성 (2)

1) 자식 오브젝트에서 사용하는 PlayAnimationTrigger기존에 PlayerController에서 소개해드린 AnimationTrigger 함수의 경우Animator가 있어야 설정이 가능합니다.그러나 Animator의 경우 위와 같이 PlayerController가 부착된 오브젝트의 자식에 존재합니다.따라서 Animator에서 사용하는 컴포넌트를 하나 만들어 다음과 같이 사용할 수 있도록 하겠습니다. using System.Collections;using System.Collections.Generic;using UnityEngine;public class PlayerAnimationTrigger : MonoBehaviour{ private PlayerController _controll..

2D RPG - (2) StateMachine의 구성과 완성 (1)

이제 기존에 설계한 StateMachine을 완성해보도록 하겠습니다.완성된 StateMachine은 다음과 같이 동작하게 됩니다.   이제 StateMachine을 사용하는 궁극적인 이유를 알아보겠습니다.일단 StateMachine을 기반으로 완성된 Animator를 살펴보겠습니다.  위는 Base Layer의 Animator 화면이고,아래는 PrimaryAttack Layer의 Animator입니다.위의 사진에서 볼 수있듯이 Animation끼리의 복잡한 전환없이 애니메이션이 서로 연결되는 것을 볼 수 있습니다.이어지는 사진은 플레이어게게 설정된 컴포넌트의 화면입니다. 보시는 것처럼 PlayerController를 제외하고 직접 만들어낸 컴포넌트가 존재하지 않는 것이 보입니다.즉, StateMachin..

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (16) 일정시간동안 적용되는 GameplayEffect 만들고 적용하기

이번에는 기존의 Duration Policy가 Instant 였던 GE 대신Duration Policy가 Has Duration으로 설정되어 설정한 시간동안만 적용되는 GE를 만들어보겠습니다. 그전에 먼저 EffectActor의 코드를 수정하여InstantGameplayEffect 말고도 DurationGameplayEffect도 처리할 수 있도록 수정하겠습니다. 1) GE를 적용할 AuraEffectActor...UCLASS()class AURA_API AAuraEffectActor : public AActor{ GENERATED_BODY() public: AAuraEffectActor();protected: virtual void BeginPlay() override; /* * Gameplay Ef..

Lock 구현 훑어내리기 + ReaderWriterLock 기초

1) 일반적인 lock가장 먼저 알아볼 Lock 구현은 일반적인 lock 키워드를 통한 lock 입니다.사용할 수 있는 방식은 다음과 같습니다.static object _lock = new object();static void Main(string[] args){ lock (_lock) { }} object 타입의 _lock 변수를 사용하며lock의 경우 내부적으로 Monitor가 동작합니다. 2) SpinLock다음으로는 SpinLock을 통한 Lock 구현입니다.SpinLock을 통해 Lock은 무한히 대기하며 자원의 점유가 풀리기를 기다립니다.사용할 수 있는 방식은 다음과 같습니다.class Program{ // C# API - SpinLock : 이때의 SpinLoc..

C# 2024.12.04

Event를 통한 Lock 구현

이번에는 Lock을 구현하는 3가지 방법 중에서 Event를 통해 Lock을 구현하는 방법을 알아보겠습니다.Event를 통해 Lock을 구현하는 방식은 2가지가 존재하는데,자동으로 동작하는 AutoResetEvent와 수동으로 조작해야 하는 ManualResetEvent가 존재합니다. 1) AutoResetEvent제일 먼저 AutoResetEvent를 통해 Lock을 구현해보도록 하겠습니다.코드는 다음과 같습니다.class Lock{ // AutoResetEvent의 true 또는 false 값에 따라 해당 이벤트가 사용가능한 상태를 의미함 AutoResetEvent _available = new AutoResetEvent(true); public void Acquire() { ..

C# 2024.12.04

Context Switching

멀티 스레드를 구현하는 3가지 방식 중에서 Context Switching에 대해 알아보겠습니다.Context Switching은 다른 스레드가 자원을 점유하는 동안대기하지 않고 하던 일을 마저 하다가 일정 시간 후에 자원 점유 여부를 확인합니다. 이러한 Context Switching을 구현하는 방법은 총 3가지로 구분할 수 있습니다.1) Thread.Sleep(n)위와 같이 사용할 수 있으며 이때 n은 0이 아닌 수를 의미합니다.스레드는 자신의 작업을 계속 수행하다가 n초 후에 자원이 점유되었는지 확인합니다.자원이 점유되어있다면 자신의 작업을 계속 진행하고점유되어 있지 않다면 기존의 작업을 RAM에 저장한 뒤 해당 자원의 작업을 수행하게 됩니다. 2) Thread.Sleep(0)Thread.Sleep..

C# 2024.12.04

SpinLock

락을 구현하는 3가지 방식 중 하나인 스핀락에 대해 알아보고 이를 예제로 살펴보겠습니다.스핀락은 자원에 접근하기 위해 무한히 대기하여 락을 구현하는 방식입니다.따라서 이론적으로 다음과 같이 구현할 수 있을 것입니다. 1) 첫 번째 시도class SpinLock{ volatile bool _key = false; public void Accquire() { // 잠금이 풀릴때까지 대기 while (_key) { } // 잠금 설정 _key = true; } public void Release() { // 잠금 해제 _key = false; }}class Program{ static in..

C# 2024.12.04

DeadLock과 Lock구현

이전 포스트에서 DeadLock에 대해 한번 언급을 했었습니다.DeadLock은 멀티 스레드 환경에서스레드가 자원을 계속 점유하여 다른 스레드가 이 자원을 사용하기 위해 대기하는 문제를 말합니다. 이번 포스트에서는 멀티 스레드 환경에서 DeadLock이 발생하는 예시를 한번 살펴보고DeadLock을 어떻게 해결해야 하는지 한번 고민해보도록 하겠습니다. 1) 예시 코드class SessionManager{ static object _key = new object(); public static void Test() { lock (_key) { ClientManager.TestClient(); } } public static..

C# 2024.12.02

Lock 기초

이전에 알아본 InterLocked는 멀티 스레드 환경에서 사용할 수 있는 중요한 요소 중 하나입니다.그러나 InterLocked가 가진 치명적인 단점은 정수형 변수만 다룰 수 있다는 점입니다.따라서 이번에는 다른 방식으로 멀티스레드 환경을 만들어보겠습니다. 멀티스레드 환경에서는 단순히 읽어오는 것은 문제가 되지는 않지만, 쓰기 시작하면서 문제가 발생하기 시작합니다.그리고 이런 식으로 문제가 발생하는 코드 영역을 Critical Section 한국어로 임계영역이라고 합니다. 1) Monitor 클래스를 통한 임계영역 제한이럴 때 사용가능한 클래스가 바로 Monitor 클래스이고,Monitor 클래스의 함수 Enter와 Exit입니다.다음의 사용예제를 보겠습니다.  class Program { st..

C# 2024.12.02