본문 바로가기

전체 글

(144)
언리얼 C++ (게임모드, 플레이어 컨트롤러, 폰, 캐릭터) 다양한 게임 장르와 멀티 플레이까지 지원할 수 있도록 설계된 언리얼 프레임워크 다양한 클래스가 있지만, 게임플레이 프레임워크의 핵심 3가지 클래스는 게임모드, 플레이어 컨트롤러, 폰 이다.게임모드게임의 규칙을 관리하는 클래스, 눈에 보이지 않는 액터다.게임 플레이 중 사건이 발생할 때 게임 진행의 심판 역할, 플레이어 입장을 준비하는 역할을 한다. 게임모드 클래스를 생성한 후 적용하는 방법이 두가지가 있다. 프로젝트 세팅 - Maps & Modes에서 설정하는 방법.이 방법은 해당 레벨의 월드 세팅에 지정된 게임 모드가 없을 때 프로젝트 세팅의 게임 모드가 적용이 된다. 월드 세팅에서 설정하는 방법.이 방법은 해당 레벨에만 특정 게임모드를 지정할 수 있다.플레이어 컨트롤러실질적으로 게임에 입장하는 플레이..
언리얼 C++ (새로 알게 된 지식들) 지금까지 언리얼을 조금 만져봤지만 새로 알게된 지식에 대해 적어보려 한다. 1. 언리얼5에서부터 헤더에 언리얼 오브젝트 포인터를 선언할 때 로우 포인터 * 대신 TObjectPtr을 사용하는 것을 권장한다. 2. CreateDefaultSubobject() : Subobject를 CDO에서부터 포함시키기 위해 호출하는 함수. 3. CreateDefaultSubobject() 함수에 전달되는 문자열 : 해당 문자열은 액터에 속한 컴포넌트 끼리 구별하기 위한 Hash 값 생성에 사용됨. 따라서 다른 컴포넌트와 중복되지 않는 유일한 문자열을 지정해야함.(같은 애셋 안에서) 4. 컴포넌트를 생성자 후에 액터에 부착할 때 NewObject() 함수를 호출한다. 이렇게 생성된 컴포넌트는 반드시 등록 함수인 Regi..
언리얼 C++ (Reflection, Delegate) Reflection리플렉션은 런타임 중에 자기 자신을 조사하는 기능을 뜻한다. C#에도 있다.가비지 컬렉션, 리플리케이션, 시리얼라이즈 등의 기능들의 근간을 이룬다.리플렉션은 언리얼 오브젝트만 가질 수 있다. 일반 C++ 클래스는 불가능 하다.언리얼 오브젝트 클래스의 멤버 변수나 멤버 함수에 UPROPERTY()나 UFUNCTION()을 작성하고 필요한 키워드들도 작성하면 가능해진다. 또한 모든 언리얼 오브젝트 개체는 자기 자신 클래스가 가진 속성과 함수 정보를 컴파일 타임(StaticClass())과 런타임(GetClass())에서 조회할 수 있다.// SXGameInstance.hclass SHOOTERX_API USXGameInstance : public UGameInstance{ ... publi..
언리얼 C++ 공부(CDO, GC) Class Default Object(CDO)언리얼에서는 클래스 멤버 변수의 기본값을 에디터에서도 수정이 가능하고 C++ 클래스의 멤버 변수는 블루프린트 클래스에서 오버라이드 되기도 한다.소스코드 에디터에서 생성자에다가 기본 값을 100으로 초기화 하더라도 에디터에서 200으로 기본 값을 수정할 수 있고 혹은 블루프린트 클래스에서 오버라이드 되어 300으로 수정될 수도 있다. CDO는 C++ 클래스의 생성자에서 초기화 된 기본 값 뿐 아니라 블루프린트 클래스 애셋 등에서 초기화된 기본값까지 모두 한 번 반영을 시켜둔 개체이다. 그리하여 언리얼에서는 개체를 생성할 때 마다 CDO의 값을 그대로 복사받고 그 뒤에 생성자가 호출되는 방식을 채택했다. 이를 통해 한 클래스로부터 다수의 개체가 생성될 때 일관성 ..
8번과제 클리어 화면 추가하기 500점이 넘을 때 Clear 문자열이 출력되도록 구현을 해놨었는데 이를 GameClearMenu 위젯 블루프린트를 만들어서 띄우려 한다.GameClearMenu에는 총 점수를 띄우고 메인 메뉴 버튼을 뒀다.메인메뉴 버튼을 누르면 JinPlayerController의 ShowMainMenu 함수를 호출하도록 했다.JinPlayerController에서 위젯 변수를 선언하고 에디터에서 WBP_ShowGameClearMenu를 GameClearMenuWidgetClass 변수에 넣었다.// JinPlayerController.h UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Menu") TSubclassOf GameClearMenuWidgetClass; ..
8번과제 - 도전 과제 2, 3번 도전 과제 2번 - 웨이브별 환경의 변화웨이브가 올라갈수록 맵 환경이나 플레이 상황 자체가 달라지게 설계해봅시다. 각 웨이브마다 ‘새로운 장애물’이나 ‘무작위 이벤트’, ‘맵 변형’ 등을 도입해 난이도를 높일 수 있습니다. 예를 들어,Wave 1: 기존 로직 그대로Wave 2: 맵에 새로운 장애물이 추가됩니다. (예: 바닥에서 일정 간격으로 스파이크가 솟아오르는 지역)Wave 3: 맵에 무작위 폭발 지점이 추가되어, 일정 시간마다 플레이어 주변에 충돌 이벤트가 발생합니다.“스파이크 함정이 활성화되었습니다!” 등 이벤트 발생을 UI로 알려서 플레이어가 상황을 인지할 수 있어야 합니다.웨이브1, 2, 3 맵을 만들면서 이미 새로운 장애물을 추가해서 도전과제 3번을 먼저 구현한 후 시간이 남아서 웨이브 2에 ..
8번과제 장애물 만들기2, 도전 과제 1번 장애물을 만들기 전에 레벨 3 트로피에 다가가면 Clear!!! 가 출력되도록 미리 구현을 해놓고 나중에 Clear UI를 만들어서 띄울 예정이다.그리고 동전을 너무 안먹고 달리기만 하면 제한시간이 의미가 없는 것 같아서 총 점수가 500점 미만이면 트로피에 다가가도 게임오버가 되도록 구현을 했다.테스트를 해보니 500점 미만일 때 게임오버가 되고 500점 이상일 때 Clear!!가 출력이 잘 됐다. 이제 마지막 장애물인 벽에서 왕복하는 장애물을 만들것이다.액터를 생성하고 InterpToMovement로 왕복하도록 Behavior Type을 PingPong으로 설정했다.그리고 지형만큼 움직이도록 움직이는 거리를 설정하고 장애물마다 속도를 다르게 하기 위해 Duration을 랜덤한 값을 받도록 설정했다.이..
8번과제 장애물 만들기 에디터로 만들었던 GameOverTrigger를 StartLevel 함수에서 스폰하기 위해 C++ 클래스로 생성해서 씬컴포넌트, 스태틱메시컴포넌트, 박스컴포넌트를 붙였다.#pragma once#include "CoreMinimal.h"#include "GameFramework/Actor.h"#include "GameOverTrigger.generated.h"class UBoxComponent;UCLASS()class UNREAL_CPP_STUDY_API AGameOverTrigger : public AActor{ GENERATED_BODY() public: AGameOverTrigger(); UPROPERTY(VisibleAnywhere) USceneComponent* Scene; UPROPERTY(E..