전체 글 283

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (15) 일시적인 GameplayEffect 만들고 적용하기

본격적으로 GameplayEffect를 만들기 전에 기존의 EffectActor에서 코드를 일부 수정하겠습니다.수정사항은 다음과 같습니다. #pragma once#include "CoreMinimal.h"#include "GameFramework/Actor.h"#include "AuraEffectActor.generated.h"class UGameplayEffect;UCLASS()class AURA_API AAuraEffectActor : public AActor{ . . . // Target 인자의 이름을 TargetActor로 변경 UFUNCTION(BlueprintCallable) void ApplyEffectToTarget(AActor* TargetActor, TSubclassOf Gameplay..

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (14) GameplayEffect와 EffectActor 코드 수정

본격적인 GameplayEffect를 적용하기 전에 GameplayEffect가 무엇이고 어떻게 동작하는지 알아보겠습니다. 1) GameplayEffectGAS 프레임워크에서는 게임에 영향을 주는 객체를 별도로 분리해서 관리합니다.이때 별도로 분리되는 객체를 GameplayEffect로서 사용합니다.GameplayEffect를 정의하는 클래스들은 데이터 전용 클래스이므로 따로 로직을 추가해서는 안됩니다. GameplayEffect에는 Duration Policy가 존재하여 이를 통해 GE를 적용하는 기간을 결정합니다.Instant는 Attribute에 즉각 적용되며, 한 프레임에서만 실행됩니다.Has Duration은 지정한 시간동안 적용되는 GE에 사용합니다.Inifite는 명시적으로 종료하지 않으면 ..

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (13) Model의 갱신에 따른 UI 변화

이번에는 기존의 AttributeSet의 초기값을 불러와 UI를 설정하는 단계를 넘어서Attribute가 변화하면 실제로 UI에 변화를 반영하도록 해보겠습니다.또 기존의 체력바 UI말고도 마나 UI도 손보도록 하겠습니다. 언리얼 엔진에서는 GAS 시스템에서 Attribute가 변경되는 경우 콜백 함수를 호출할 수 있는 함수를 제공합니다.그 함수는 GetGameplayAttributeValueChangeDelegate 로서 AbilitySystemComponent가 호출합니다. 따라서 저 함수를 설정하면 해당하는 Attribute가 변경될 때마다 콜백함수를 호출할 수 있게 됩니다.따라서 WidgetController에 GetGameplayAttributeValueChangeDelegate 함수를 설정하도록..

GameplayAbilitySystem을 이용한 RPG 프로젝트 - (12) 체력 UI에 델리게이트 연결하기

이번에는 기존의 UI 시스템을 발전시켜 Attribute Set의 데이터를 UI가 반영할 수 있도록 하겠습니다.우선 C++ 클래스의 일부를 손보도록 하겠습니다. Model의 정보를 View에 반영하는 일은 UAuraWidgetController가 수행해야 합니다.따라서 함수를 추가하겠습니다.1) UAuraWidgetController...UCLASS()class AURA_API UAuraWidgetController : public UObject{ GENERATED_BODY() public: . . . virtual void BroadcastInitialValues(); protected: . . .}; ...void UAuraWidgetController::BroadcastInit..

Interlocked

멀티스레드 환경은 싱글스레드와 다르게 신경써야 하는 것이 매우 많습니다.그 중에서도 전역 변수같은 공용으로 사용하는 변수에 대해서 알아보겠습니다. 아래의 코드를 한번 살펴보겠습니다.class Program{ static int number = 0; static void Thread_1() { for (int i = 0; i  일반적으로 생각하는 결과는 0일 것입니다.100000000번동안 1을 더하고, 100000000번동안 1을 빼므로 값은 0이라 생각되지만, 결과는 다음과 같습니다. 위와 같은 결과가 발생한 이유는 공용변수 Task에 대한 원자성이 보장받지 못하기 때문입니다.간단하게 말하자면 원자성이 보장받는다는 것은해당 데이터에 수행하는 작업이 동시에 발생할 수 있는 작..

C# 2024.11.27

Memory Barrier

최적화는 비단 컴파일러만 수행하는 것이 아닌 하드웨어에 의해서도 수행됩니다.하드웨어가 판단하기에 빠르게 처리할 수 있는 코드의 경우 기존의 순서를 무시하고 우선 처리하게 됩니다,이는 싱글 스레드에서는 의미가 없지만,여러 개의 스레드가 각기 다른 작업을 처리하는 멀티 스레드 환경에서는 매우 큰 위험이 됩니다. 아래의 코드를 한번 살펴보겠습니다.class Program{ static int x = 0; static int y = 0; static int result1 = 0; static int result2 = 0; static void Thread_1() { y = 1; result1 = x; } static void Thread_2()..

C# 2024.11.27

파이썬의 예외처리

프로그래밍에서 예외처리는 프로그램의 실행 중에 발생하는 에러를 미연에 방지하고자 사용합니다.이번 포스트에서는 파이썬에서의 예외처리를 알아보겠습니다. 파이썬에서 예외 처리는 다음과 같은 구조로 사용됩니다.try: # 예외가 발생할 수 있는 코드except 에러: # 예외 발생 시 실행할 코드else : # 예외가 발생하지 않는 경우 실행할 코드finally: # 항상 실행할 코드 그렇다면 예제를 통해 예외처리를 사용해보겠습니다. 1) 사용예제코드는 다음과 같습니다.won = input("원화를 입력 : ")dollar = input("달러 환율을 입력 : ")try: print(int(won)/int(dollar))except ValueError as error: print("문자열 에러가 발생..

Python 2024.11.27

캐싱

컴퓨터에서 CPU의 코어는 다음과 같이 구성되어 있습니다. ALU는 연산을 수행하는 장치이고,L1/L2 캐시의 경우 캐싱을 수행하는 장치입니다. 캐싱은 기록하는 작업을 의미하는데 캐싱을 수행하는 이유는 다음과 같습니다.RAM은 변동 사항을 반영해야 하는 메모리입니다.이때 변동 사항이 들어올 때마다 반영하는 것은 매우 비효율적인 작업입니다.따라서 어느 정도 기록을 한뒤에 한번에 모아서 반영하는 것이 훨씬 효율적입니다.그렇기에 캐싱이 수행됩니다. 캐싱은 2가지의 기준을 세워 수행합니다.하나는 시간적인 기준이고, 다른 하나는 공간적인 기준입니다. 시간적인 기준은 다음과 같습니다.가장 최근에 발생한 변동에서 또 다른 변동이 생길 가능성이 높으므로 가장 최근에 발생한 변동을 캐싱합니다.이를 영어로는 Tempora..

C# 2024.11.27

파일 입출력

이번 포스트에서는 파이썬에서 파일 입출력을 수행하는 방법을 알아보겠습니다. 파일 입출력을 사용하는 이유는 크게 2가지로 설명할 수 있습니다.첫번째로, 파일로부터 데이터를 읽어와서 프로그램에 사용하기 위해 사용합니다.두번째로, 프로그램에서 만든 데이터를 파일 형태로 저장하기 위해 사용합니다. 그리고 이런 파일 입출력에는 3가지 모드가 존재합니다.w : 쓰기 모드(덮어쓰기 방식으로 동작)a : 추가 모드(이어쓰기 방식으로 동작)r : 읽기 모드  1) 파일 쓰기파일 쓰기는 다음과 같은 구조로 사용합니다.파일변수 = open("파일이름", w)파일변수.write(쓸데이터)파일변수.close() 파일 입출력을 수행하는 경우 open을 했으면 반드시 close를 사용해야 합니다.추후에 알아볼 with을 사용하면 ..

Python 2024.11.26

2D RPG - (1) StateMachine의 설계

Unity를 이용한 2D RPG를 만드는 이번 프로젝트의 첫 시작은 StateMachine을 설계하는 것으로 시작하겠습니다.원래 StateMachine은 인공지능의 하나로, State별로 AI가 취해야 하는 행동을 정의합니다. 하지만 이번에 만드는 StateMachine은 플레이어의 애니메이션을 상태기반으로 변경하는 데 사용합니다.구성은 크게 다음의 3가지로 구성합니다.플레이어를 조작하면서 StateMachine을 통해 State를 변화시키는 PlayerControllerState를 변화시키는 주체인 StateMachine플레이어의 상태 별로 나눠진 State 1) 플레이어의 State를 변화시키는 주체인 PlayerStateMachineusing System.Collections;using System..