2025-02-11TIL 정리안됨

별빛에소원을·2025년 2월 11일

TeamSparta-Unreal1기-TIL

목록 보기
41/90
post-thumbnail

알고리즘 : JadenCase 문자열 만들기

HUD는 HeadsUpDisplay의 약자이다. 플레이어에게 제공하는 데이터를 화면에 제공하는 기능을 이야기한다.

언리얼은

  • Canvas기반과 UMG기반의 HUD가 존재한다.
  • HUD
  • UMB(UnrealMotionGraphics)기반의 경우 WidgetBluePrint를 이용하게 된다.

우클릭 -> UserInterface->WBP 를 생성 할 수 있다.

CanvarsPanel이 Root가 되고 그 위에 UI를 그리게 된다.
사이즈는 ScreenSize에서 선택 할 수 있고 모니터 크기별로 선택 할 시 해상도를 조절 할 수 있다.

컨텐츠 브라우저, Import하면 Font를 Import할 수 있다.

UI는 컨트롤러와 상호작용을 하기 떄문에 컨트롤러에서 위젯에 대한 정보가 필요하다.
// H
TSubClassof HudWidgetClass
// Cpp
// 위젯의 인스턴스를 생성하는 함수
CreateWidget(this ,HUDWidgetClass)
// AdddToViewport(Widget) -> 생성된 위젯을 뷰포트에 옮겨준다.

Build.cs 에서는 기본적으로 프로젝트 빌드시 어떤것을 빌드할지 선택할 수 있는데
HUD는 기본적으로 빠져있기 때문에 빌드를 하고 싶다면 PublicDependencyModuleNames.AddRange() 에서 UMG를 추가해야한다.

  • Core : 엔진의 기본 기능을
  • CoreUObject : 리플렉션
  • Engine : 게임엔진의 주요 기능을
  • InputCore : 인풋시스템
  • EnhancedInput : 향상된 인풋시스템
  • UMG : Unreal

빌드 이후 Controller에는 HUDWidget 을 추가 할 수 있다 추가한 HUD를 삽입하면 된다.

UI와 화면을 맞추기 위해 Advent 에서 화면 해상도를 조절하면 어느정도 맞출 수 있고, 새창으로 보게되면 어긋남이 없다.
사슬 모양을 클릭하면 바인딩 할 수 있는데 데이터를 바인딩 할 수 있다.
바인딩은 Tick을 사용하고 있기 떄문에 시스템이 복잡할 경우 사용하지 않는것이 권장되는데
C++로 이벤트 바인딩을 하는 것이 좋다.

컨트롤러에서 Widget을 넘겨줘야한다.

컨트롤러는 GetWorld GetFirstPlayerController에서 가지고 올 수 잇다.
추가한 Widget을 GetWidgetFromName()함수로 가지고 올 수 있다.

타이머는 GetWorldTimeManager().GetTimerRemaining(HANDLE)을 통해 원하는 핸들의 남은 시간을 가지고 올 수 있다.

HUD는 Timer를 통해 업데이트 하면 좋다.

메뉴 전용 UI, Level을 만들어도 좋다.

Boarder는 Canvas위에 올라가는 Panel이다.

마우스는 보여야 할 경우 bShowMouseCursor = true로 바꾸어 주면 된다.

SetInputMode(FInputModeUIOnly()) 를 할 경우 UI만 처리할 수 있게 된다.

GetWorld()->GetMapName()을 할경우 현재 맵의 이름을 가져온다.

HUDInstance->RemoveFromParent()를 할경우 Clear()한다.

Menu 의 Visibility를 이용해 시작시 안보이게 하는 설정도 가능하다.

Anmations 를 이용해 깜빡거리는 효과 같은 것을 넣어 줄 수 있다.

특정 함수 호출시 표현되어야 하는 메뉴 Animaiton(ex : GameOver)의 경우 함수 실행 이후 SetVisiblity -> PlayAnim 을 이용해 처리할 수 있다.

UFunction* Func = MainMenuWidgetInstance -> FindFunction() 를 통해 BP를 통해 등록된 함수를 가져올 수 있다.

ProcessEvent를 통해 호출이 가능하다.

WidgetComponent - UI를 3D월드에 배치할 수 있는 것이다. 케릭터에 붙이면 대가리에 붙일 수 있다.

WidgetComponent는 2D이기때문에 3D에 변환하는 과정이 필요하다.

모드는 2가지가 존재한다.
스크린 모드 - UI가 화면에 고정된 것 처럼 보인다.
월드 모드 - 케릭터에 움직임에 따라서 보이는 것이 달라진다.

UWidgetComponent는 Mesh에 붙이면 된다. GetMesh()를 할 경우 BP에서 붙여준 Mesh에 붙게된다.
SetWidgetSpace(EWidgetSpace::Screen)을 할 경우 모드를 정할 수 있다.
UserWidget은 GetUserWidgetObject를 통해 UserWidget의 포인터를 가져올 수 있다.

Controller에는 SetPause를 통해 게임을 멈출 수 있다.

UParticleSystem
USondBase

사운드 웨이브 - 간단한 효과에 사용한다.
사운드 큐 - 다양한 상황에 대한 믹스가 가능하다.

UGameplayStatics::SpawnEmitterAtLocation() // 파티클 효과를 생성하는 함수다.
파라메터 :

  • World,
  • 파티클,
  • 위치,
  • 회전,
  • 자동제거여부

사운드 재생
UGameplayStatics::PlaySoundAtLocation()
파라메터 :

  • World,
  • 파티클,
  • 위치,
  • 회전,
  • 자동제거여부

SpawnEmitterAtLocation는
월드에 독립적으로 생성된 것이기 때문에 이 함수를 호출한 객체의 라이프사이클이 끝나도 파티클은 사라지지 않는다. 따라서 직접 제거해야한다.

ParticleSystemComponent
GetWorldTimeManager().SetTimer(
Handle,

{
Particle->DestroyComponent();
}
)


공부법 변경

강의 코드를 분석하지말자. 논리구조를 따라가고 기능을 익히고 스스로 만들어보자.
주말에 처음부터 끝까지 2번정도 만들어보면 좋을거 같다.

건강관리

귀찮다고 끼니를 거르지 말자 컨디션에 영향을 준다. 나도 이제 늙음

코딩

기능에 대해서 씹어먹으려고 노력하지 말자.
그건 예전부터 공부하던 사람들이 하는 행동이다.
빠르게 기능을 숙지하고 좋은 구조와 패턴안에서 잘 동작할지 라이프 사이클을 고려하여
구현할 생각을 하자.

TODO

자꾸 할 일을 까먹어서 Todo를 통해 목록을 정리해보니까 생각보다 좋았다.
앞으로 사소한거부터 일상에 대한 전반적인 관리를 이것으로 하자.
생각나는게 있으면 하나 하나 체크해가면서 하면 큰 도움이 될 거 같다.

profile
취미로 게임하는사람

0개의 댓글