분류 전체보기 297

유니티 입력 처리 심화 - (1) Direct 방식

C# 기반의 게임엔진인 Unity에서는기존의 Input Maanger와 새로운 방식의 Input System을 사용하여 입력을 처리합니다.이 둘의 차이점에 대해서는 이전의 포스트에서 다뤄보았습니다. https://monstrosite.tistory.com/42 Input Manager와 Input System유니티에서는 두 개의 입력 시스템을 제공합니다.구형 입력 시스템인 Input Manager와 신형 입력 시스템인 Input System입니다. 사용자의 키 변경에 대응하기 위해 개발된 Input System은 기존의 Input Managemonstrosite.tistory.com 이번 포스트에서는 Input System을 조금 더 쪼개어 깊게 다뤄보고각 방식의 차이점에 대해서도 알아보겠습니다. 1) ..

Thread Local Storage

자원이 여러 개 있고 스레드들이 자원에 접근하여 사용을 하는 경우가 있다고 생각해보겠습니다.자원마다 Lock을 걸게 되면 자원에 대한 원자성은 보장되지만, 하나의 자원에 대해 여러 스레드의 접근이 이뤄지면 대기가 길어져 처리가 늦춰지는 문제가 발생합니다.그리고 이런 경우 대기가 길어져 멀티 스레드의 장점을 살리지 못하고싱글 스레드보다도 효율적이지 못한 방식이 되어버립니다. 이런 상황에서 사용할 수 있는 것이 바로 Thread Local Storage 즉, TLS입니다.동적할당되는 데이터들을 위한 Heap 영역이나 전역 변수와 같은 공용 변수를 위한 Data 영역같은 경우 모든 스레드들이 같이 사용하는 영역입니다.그에 반해 지역변수같은 데이터를 위한 Stack 영역의 경우 스레드들이 각각 갖고 있습니다.T..

C# 2024.12.09

ReaderWriterLock 구현

이전에 설명한 적이 있는 ReaderWriterLock에 대해 간단하게 구현해보도록 하겠습니다.구현방식은 다음과 같습니다. int 형의 비어있는 플래그를 사용하여 ReaderLock과 WriterLock을 구현합니다.int는 4바이트 총 32비트로 구성되어 있으므로 다음과 같이 사용이 가능합니다.1비트 = 사용안함15비트 = WriteLock을 사용하여 자원을 점유하는 스레드 기록16비트 = ReadLock을 사용하여 자원을 점유하는 스레드 기록그리고 만들어지는 Lock은 스핀락을 사용하여 만들고 스핀락의 대기횟수를 제한하겠습니다.그리고 Lock 안에서 yield를 통해 실행가능한 스레드에게 자원의 점유를 넘겨주겠습니다.마지막으로 WriterLock의 경우 Lock 안에서 재귀적으로 다른 Lock을 설정..

C# 2024.12.09

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