개발 161

언리얼 엔진 심화 3주차 - 콜리전, 트레이스 및 데미지 타입

좋은 코드, 나쁜 코드뒤엉킨 변경(Divergent Change)한 모듈이 여러 이유로 자주 수정되어야하면 복잡해짐다른 맥락의 동작은 다른 모듈로 분리필요에 따라 단계를 나누고 클래스를 쪼개서 만들기좋은 예시: 플레이어 데이터는 PlayerDataManager 클래스에, 게임 플레이는 GamePlayManager 클래스에샷건 수술작은 변경을 위해 여러 곳을 동시에 수정하는 일은 피하자.관련된 것을 한 군데로 모아 수정 범위를 좁힌다.좋은 예시: DamageSystem에서 모든 데미지 로직을 처리한다.기능 편애어떤 함수가 자기 객체보다 남의 객체 기능이나 데이터를 더 많이 쓰지 않도록 하자.남의 객체에서 처리된 데이터만 가지고 오자.좋은 예시: 데미지 감소량을 계산하는데 캐릭터의 데이터가 많이 필요한 경우..

언리얼 C++ - UI 애니메이션 효과 및 3D 위젯 UI 구현하기

머리위에 체력표시메뉴창 끝날 때 게임오버 텍스트 출력 및 애니메이션 적용총점 표시 UI 애니메이션 생성하기 재생하면 깜빡거리는 효과가 적용된다. UI 애니메이션 설정하기 SpartaController.cpp 수정ShowMainMenu 함수를 수정한다.if (UTextBlock* ButtonText = Cast(MainMenuWidgetInstance->GetWidgetFromName(TEXT("StartButtonText")))){ // 시작과 재시작 구분 if (bIsRestart) { ButtonText->SetText(FText::FromString(TEXT("Restart"))); } else { ButtonText->S..

언리얼 C++ - 게임 흐름에 맞춘 메뉴 UI 구현하기

게임 흐름에 맞추어 UI 구현 저장하고 새 레벨을 만든다. // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "GameFramework/PlayerController.h"#include "SpartaPlayerController.generated.h"class UInputMappingContext;class UInputAction;/** * */UCLASS()class SPARTAPROJECT_API ASpartaPlayerController : public APlayerController{ GENERATED_BODY()pub..

카테고리 없음 2026.04.28

언리얼 C++ - UI 위젯 설계와 실시간 데이터 연동하기

HUD(Heads-Up Display)이번에는 현재 레벨, 현재 남은 시간, 현재 점수같은 정보를 화면에 표시한다. Canvas 기반 HUDHUD 클래스를 상속하여 구현텍스트나 이미지를 2D 형태로 그림예전 방식요즘은 전부 UMG로 HUD 구현UMG(Unreal Motion Graphics)Widget Blueprint 기능 사용 UI 만들기위젯 블루프린트는 접두어로 WBP를 붙여준다. 기본적으로 UI요소를 Hierarchy로 끌어서 배치하게 된다. 대표적 위젯표시(Display) 위젯 – 화면에 정보를 보여주는 요소Text: 문자열 출력, 점수·상태·안내 문구 표시Image: 아이콘·배경 등 이미지 표시Progress Bar: 값의 비율을 시각화 (체력, 로딩 등)Border: 테두리와 배경 제공,..

언리얼 C++ - State Machine 설계를 통한 캐릭터 동작 애니메이션 적용하기

여러가지 애니메이션들을 캐릭터의 상태에 따라 애니메이션 블루프린트에서 동적으로 제어해 주어야한다. 우선, 애니메이션 블루프린트를 생성한다.스켈레톤 기준으로 애니메이션을 만들게 된다.애니메이션 블루프린트의 파일명 접두어는 ABP이다.Mesh같은 경우는 스켈레탈 메시가 같고 메시만 다른 스태틱 메시들을 보여준다. 선택하고 Apply To Asset을 누르면 적용된다. 에셋 브라우저에는 다양한 애니메이션 시퀀스 파일들과 애니메이션 관련 리소스들이 있다.캐릭터 클래스는 이동과 관련된 정보가 담겨있고, 이를 이용하여 애니메이션 전환 시점을 정해줄 수 있다. Character Movement를 가져와야 하기 때문에 오너는 반드시 Character여야 한다. 따라서, Cast To Character로 캐릭터인지 확..

언리얼 C++ - 캐릭터 체력 및 점수 관리 시스템 구현하기

레벨별로 아이템 확률을 조정한 데이터 테이블을 따로 만들어준다. 이제 아이템 기능을 구현한다. 플레이어의 체력 만들기캐릭터의 체력은 캐릭터에서 관리한다. PlayerState는 멀티플레이로 가면 중요하고, 싱글 플레이에서는 그다지 중요하지 않다. 그래서 Character에서 관리해도 괜찮은 것이다. Health와 MaxHealth 변수를 선언하고 관련 함수를 만든다UFUNCTION(BlueprintPure, Category = "Health")float GetHealth() const;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Health")float MaxHealth;UPROPERTY(EditAnywhere, BlueprintReadWrite..

언리얼 C++ - 아이템 스폰 및 레벨 데이터 관리하기

이번에는 만든 아이템을 랜덤으로 스폰하는 것이 목적이다. 아이템이 스폰되는 확률로 난이도를 조절해줄 것이다. 구현할 내용랜덤 스폰 기능스폰영역 지정아이템의 스폰 확률 지정 맵 설정 기본 레벨을 만들고 메인 레벨로 설정해준다. 스폰 영역 지정블루프린트로 구현 블루프린트로 새 액터 클래스를 만들고 박스 콜리전 컴포넌트를 추가한다. 레벨에 이렇게 콜리전 컴포넌트 액터를 배치하고, 크기를 조정해 스폰 영역을 지정할 수 있다. 콜리전 컴포넌트는 시각적으로 직관적이기 때문에 가벼우면서도 범위를 계산하기 편리하다. C++로 구현 SpawnActor게임 실행 중에 클래스(Blueprint 또는 C++)의 '설계도'를 바탕으로 실제 세상에 '실체(Instance)'를 만들어 배치하는 가장 핵심적인 함수.AAc..

언리얼 C++ - 충돌 이벤트로 획득되는 아이템 구현하기

충돌 이벤트란?액터나 컴포넌트가 다른 객체와 상호작용할 때 발생오버랩 이벤트객체가 겹칠 때 발생하는 이벤트히트 이벤트객체가 닿을 때 발생하는 이벤트 BaseItem에 Colision Component를 붙인다. 위와 같은 방법으로 4개의 아이템을 다 블루프린트로 만들어준다. 블루프린트에 스태틱 메시들을 할당해준다. Collision Presets 살펴보기콜리전 컴포넌트의 콜리전 카테코리를 보면 콜리전 프리셋이 있다. 콜리전 프리셋의 종류이 오브젝트가 무엇과 어떻게 충돌할지”를 미리 정해둔 규칙 묶음.🔵 NoCollision👉 아무것과도 충돌하지 않음트레이스도 무시물리 충돌도 없음완전 통과✔ 용도이펙트, UI, 장식 오브젝트충돌 필요 없는 배경🔵 BlockAll👉 모든 것을 막음Pawn, W..

카테고리 없음 2026.04.21

언리얼 C++ - 인터페이스 기반 아이템 클래스 설계하기

언리얼에서의 인터페이스언리얼에서는 UInterface라는 클래스를 지원해준다. 인터페이스에 함수 원형들만 정의해주고, 아이템 클래스들이 이 인터페이스를 구현한다. 위에 있는 UInterface 인터페이스는 리플렉션을 위한 인터페이스라서 수정할 필요가 없다.MinimalAPI는 현재 모듈 내에서만 접근 가능하도록 제한한다.아래 있는 인터페이스는 직접 구현하는 인터페이스다.순수 가상함수를 여기다 구현한다.cpp파일은 내버려두면 된다. 언리얼 리플렉션 시스템에서 빌드를 할 때 헤더와 구현 파일을 쌍으로 확인하기 때문에 cpp파일을 삭제해버린다면 불안정하게 된다. 설계는 확장할 부분까지 고려해서 구현한다. BaseItem에서는 IItemInterface를 상속받아 함수를 구현해놓는다.// Fill out ..

TA 코스 2주차 과제 - 프로시저 셰이더 응용하기

프로시저 셰이더란?텍스처가 아닌 수학적 계산을 통해 무늬를 실시간으로 생성하는 셰이더. 예를 들어 머티리얼에 수학적으로 원을 그린다고 치자. 원이라는 것은 중심점에서 같은 거리에 있는 점들의 집합이다. 맨 처음 할 일은 TextCoord 노드를 사용하여 기본 UV (1, 1) 에서 (0.5, 0.5)를 빼서 중심을 (0.5, 0.5)로 옮겨주는 일이다.그 다음 Vector Length로 거리를 계산하고, if를 사용하여 원의 반지름을 정한 뒤 원의 안과 밖을 구분해준다. 원의 안은 1, 밖은 0으로 구분이 되고, Lerp로 1일때와 0일 때의 값을 지정해줄 수 있다. 직접 구현해보기내가 원하는 모양은 구체의 빛나는 원들이 생기다가, 마지막에는 전체가 빛나게 되는 텍스처다.여러 개의 원 그리기원이 구체에..