[2023 하계 모각소] 어만사 1주차

jungizz_·2023년 7월 9일
0

모각소

목록 보기
1/12
post-thumbnail

📝 1주차

  • 언리얼 엔진 입문 섹션1. 유니티vs언리얼 까지 🔗
  • 백준 CLASS2 2문제 🔗

📅 7월 9일 20:00 ~ 23:00



📖 언리얼

  • 필수 파일
    Config, Content, Source, ~.uproject
    (언리얼 프로젝트를 우클릭하고 Generate Visual Studio project files를 눌러 다른 파일들을 재생성)

1. 언리얼 엔진 기초

  • 유니티와 유사

◾ 조작

  • 오른쪽 마우스 클릭 후, w a s d로 이동
  • q e로 수직 이동
  • q w e r로 선택, 이동, 회전, 크기 변경

◾ 기초 내용

  • 아웃라이너: 오브젝트, 라이트, 카메라 등의 목록
  • 디테일: 각 오브젝트의 속성을 에서 설정
  • 액터 배치: 언리얼 엔진에서 제공하는 기본 소품
  • 프로젝트 세팅 > 맵&모드 > Default Maps에서 에디터 시작 맵과 게임 기본 맵 설정 가능

  • 플레이: 캐릭터 시점으로 게임 실행
  • f8로 캐릭터 시점에서 벗어날 수 있고, esc로 플레이 모드를 종료
  • fps의 기본 구조를 가진 상태로 프로젝트가 세팅되므로, 유니티의 메인 카메라 대신 플레이어가 생성

◾ Github

  • 유니티와 동일
  • Github Desktop을 사용해 Git ignore에서 UnrealEngine을 선택해 레포지토리를 만들어 언리얼 프로젝트 커밋


2. 유니티 vs 언리얼

  • 유니티에 비해 엔진이 무거워 로딩이 길고, 삭제 과정이 어려운 등의 불편함이 있지만 퀄리티가 높다

◾ 부모 클래스

  • 오브젝트 > 액터 > 폰 > 캐릭터 처럼 상속 관계를 가짐
  1. 캐릭터: 걸어다니는 기능이 포함된 폰
  2. : 컨트롤러에서 입력을 받을 수 있는 액터
  3. 액터: 월드에 배치되는 오브젝트
❗ 클래스 삭제 시 그냥 지우는게 안되므로... 언리얼 창 닫고, 비주얼 스튜디오에서 .cpp, .h파일을 지운 뒤, 해당 경로의 폴더에서도 .cpp, .h를 지워주고 필수 파일인 Config, Content, Source, ~.uproject를 제외하고 나머지 파일을 삭제해서 Generate Visual Studio project files을 하면 된다고 함~..

◾ c++ 클래스 생성

  • 액터 클래스 생성

  • 클래스를 생성하면 유니티와 유사한 스크립트가 생성

    유니티언리얼
    Start()BeginPlay()
    Update()Tick()

📌 클래스.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class PRACTICEUNREAL_API AMyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AMyActor();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

};

📌 클래스.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "MyActor.h"

// Sets default values
AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  
    // You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned
void AMyActor::BeginPlay()
{
	Super::BeginPlay();
	
}

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

}

◾ StaticMesh 컴포넌트 추가

  • 코드를 수정한 뒤 빌드
  • Actor에 새로운 속성이 나타남

📌 클래스.h

class PRACTICEUNREAL_API AMyActor : public AActor
{
. . .
private:
	UPROPERTY(VisibleAnyWhere) //외부에서 보이고 수정할 수 있도록하는 리플렉션
    UStaticMeshComponent* Mesh;
}

📌 클래스.cpp

AMyActor::AMyActor()
{
 	. . .
	Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));
}
  • Static Mesh에 원하는 Mesh를 적용 -> 툴 상에서 적용한 과정이라서 다시 Actor를 레벨에 가져오면 적용이 안된 오브젝트가 나타남

◾ 스크립트 상에서 Mesh 로드 및 적용

  • 스크립트 상에서 적용했기 때문에 Actor를 다시 레벨에 가져와도 동일한 메시로 나타남
  • 원하는 메시의 경로를 가져오기 위해 우클릭 후 파일 경로를 복사하거나, 클릭한 상태로 ctrl+c

📌 클래스.cpp

Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));

RootComponent = Mesh;

//원하는 메시 로드(원하는 메시의 경로를 붙여넣기) 
static ConstructorHelpers::FObjectFinder<UStaticMesh> SM(TEXT("StaticMesh'/Game/StarterContent/Props/SM_Couch.SM_Couch'"));

//성공적으로 로드했다면
if(SM.Succeeded())
{
	//Mesh에 SetStaiticMesh함수를 호출하여 로드한 메시를 적용
	Mesh -> SetStaticMesh(SM.Object);
}
  • 비어있던 MyActor에 지정해준 메시가 적용 됨

◾ 변수 생성

  • 컴포넌트 뿐만 아니라 인게임에서 사용할 정보 생성
  • VisibleAnyWhere를 사용하면 디테일에 보이긴 하지만 수정할 수 없으므로 EditAnyWhere을 사용
  • 리플렉션에 Category = ~~로 카테고리를 생성하여 변수를 정리할 수 있음

📌 클래스.h

private:
	UPROPERTY(VisibleAnyWhere)
    UStaticMeshComponent* Mesh;
    
	UPROPERTY(EditAnyWhere, Category = BattleStat)
	int32 HP;
    
    UPROPERTY(EditAnyWhere, Category = BattleStat)
    int32 MP;
  • 액터 디테일 창에 생성 됨


💬 언리얼 빌드 오류

  • C++ 클래스를 생성한 뒤, 코드를 빌드할 때 오류 발생

◾ 구글링 시 해결방법

  • Visual studio의 버전 확인과 C++를 사용한 데스크톱 개발, C++을 사용한 게임 개발을 설치 -> 이에 해당하는 오류는 사라졌지만 완전 해결은 못함
  • 언리얼 엔진의 디버깅을 위한 편집기 기호 옵션 설치 -> 설치 후 빌드 딱 한번 성공하고 다시 안됨..


📖 백준

🪧 2231 분해합

  • 브루트포스 알고리즘을 사용해 모든 경우의 수를 탐색
  • 1부터 N까지 반복하며 i의 각 자리수와 i를 더한 값이 N과 같은지 확인
#include <iostream>

int main(int argc, const char * argv[]) {
	int N, ans = 0;

	std::cin >> N;

	for (int i = 1; i < N; i++) {
		int sum = 0;
		int num = i;
		while (num) {
			sum += num % 10;
			num /= 10;
		}
		if (sum + i == N) {
			ans = i;
			break;
		}
	}
	std::cout << ans << std::endl;
	return 0;
}

🪧 2292 벌집

  • 1번부터 N번까지 지나가는 최소의 방 개수
  • 아래 그림처럼 1을 중심으로 퍼지는 각 원에 해당하는 번호끼리 지나가는 방 개수가 동일
  • 방 개수NN의 개수
    2개2~76 (0+6×1)
    3개8~1918 (6+6×2)
    4개20~3736 (18+6×3)
    5개38~6160 (36+6×4)
#include <iostream>

int main(int argc, const char * argv[]) {
	int N;
	int num = 0;
	int ans = 1;

	std::cin >> N;

	for (int i = 0; num < N; i++) {
		num += 6 * i;
		if (N <= num + 1) {
			ans = i + 1;
			break;
		}
	}
	
	std::cout << ans << std::endl;
	return 0;
}
profile
( •̀ .̫ •́ )✧

0개의 댓글