
std::vector<int>().swap(v);USceneComponent* SceneRoot;객체이름 = CreateDefaultSubobject<T>(TEXT("객체이름"));SetRootComponent(객체이름);StaticMeshComp->SetupAttachment(SceneRoot);static ConstructorHelpers::FObjectFinder 객체이름 <T> (TEXT("오브젝트주소"))SetMaterial(0, MaterialAsset.Object)#include <string>
#include <vector>
using namespace std;
int solution(int num) {
long long number = num;
int answer = 0;
int count = 0;
while(number>1&&count < 500)
{
if(number%2==0)
{
number /=2;
count++;
continue;
}
else
{
number = number*3+1;
count++;
continue;
}
}
if(count >=500)
{
answer = -1;
}
else
{
answer = count;
}
return answer;
}
continue; 는 아랫부분 무시하고 다시 반복문 돌리는 것. 이 경우는 필요 없었음. break; 대체도 답이 아님.일단은...한동안은 몰래라도 듣자. 필요없는 부분이라도
std::vector<int>().swap(v); -> 빈 벡터() 를 벡터 v 랑 스왑해서 벡터 clear 후 capacity 도 0으로 만드는 거와 비슷하게 작동. 스왑 한 후 기존 벡터는 () 벡터 스코프가 다음 줄에 끝나면서 소멸
#include "generated.h"는 무조건 제일 밑에!!! 이건 Unreal Header Tool이 다른 파일들 다 확인하고 만들어주는 언리얼 전용 헤더다.
DebugGame 모드 -> 디버깅에 최적화 되어 있는 모든. 디버그에 대한 모든 정보를 가진 채 게임이 빌드가 된다. 따라서 무거움.DebugGame, DebugGame Editor 차이는? DebugGame -> 실행 파일 그 자체가 달랑 나옴. 엔진 코드들은 "고정" 이 된 채로 디버깅 가능.DebugGame Editor는 에디터에서 플레이하면서 디버깅Development, Development Editor -> 빠르게 개발하고-> 수정하고 반복할 때. 많이 축소가 되어 있고 빠르다. 적당한 수준의 가벼운 디버깅도 가능. Editor 안붙어있으면 Unreal Engine Editor 형식으로 빌드가 되지 않고 실행파일로 나옴.Shipping -> 최종 릴리즈 단계. 디버그 정보 등등 모두 빠지고 빨라진다.Ctrl+Shift+B: 엔진이나 유틸리티 등 포함 전체를 빌드함. 너무 느림Builddll 수정 안 됨. 에러 뜨면 일단 에디터 끄고 다시 빌드해 볼 것.Build + IntelliSense: IntelliSense는 실제 에러가 아니라 컴파일러 자체의 진짜 에러는 아니다. Unreal 자체 문법을 감안 안하기 때문에 끄는게 맞다.
Binaries 폴더 안에 Win64 에 dll 파일이 생성 -> 이제 언리얼 에디터 실행하면 이 수정된 dll 파일 로드 해서 수정 사항 반영.Intermediate, DerivedDataCache, Saved 폴더 삭제.uproject 파일 Shift 우클릭 -> Generate Visual Studio project Files.Build 에서 Clean Solution). 언리얼 에디터 다시 실행.Saved/Logs 확인하기. Migrate -> 다른 프로젝트에서 파일 잘라내기-> 붙여넣기의 언리얼용으로 Dependency 등 깨지지 않게 잘 붙여넣어 주는 기능. 
Item 을 만든 스샷 -> 여기서 솔루션 SpartaProject 아래 Source-> SpartaProject 가 하나의 "모듈" 인 것. 지금은 한 폴더 아래 다 관리하지만 나중엔 플레이어 폴더 하나(모듈 하나), UI 모듈...이런 식으로 관리하게 된다.Public 클래스는 헤더가 Public에, cpp 소스 코드가 Private에 생성. 이러면 다른 모듈에서 이 헤더를 include, 참조 가능함..h 파일#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"
UCLASS()
class SPARTAPROJECT_API AItem : public AActor
{
GENERATED_BODY()
public:
AItem();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
};
#pragma once 컴파일러가 중복 참조 한번씩만 처리하도록 하는 코드#include "CoreMinimal.h": 언리얼 기본 헤더. 엔진 전역 타입, 매크로, 함수. .h 맨 위에 거의 항상 포함#include "GameFramework/Actor.h": AActor 클래스 선언용#include "Item.generated.h": 언리얼 헤더툴이 자동 생성하는 코드용. 무조건 헤더 마지막 줄에UCLASS(), GENERATED_BODY() -> 리플렉션 시스템에 등록, 사용.A (Actor 계열), U (Object 계열), F (구조체), T (템플릿), E (열거형) 등Item 클래스는 액터이므로 AItemSPARTAPROJECT_API -> 앞에는 보통 모듈명(현재는 SpartaProject) _API는 다른 모듈에서도 사용할 수 있게 하기 위한 매크로AItem();은 생성자, BeginPlay()와 Tick은 블루프린트에서 본 그 이벤트 함수..cpp 파일#include "Item.h"
// 생성자 구현부
AItem::AItem()
{
PrimaryActorTick.bCanEverTick = true;
}
// BeginPlay() 구현부
void AItem::BeginPlay()
{
Super::BeginPlay();
}
// Tick() 구현부
void AItem::Tick(float DeltaTime)
{
}
#include "Item.h"는 항상 가장 먼저 include 해야 한다.SUPER:: 부분은 부모 클래스(AActor) 부분들 먼저 호출한다USceneComponent* SceneRoot; 선언SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));SetRootComponent(SceneRoot); 추가CreateDefaultSubobejct<> 는 템플릿 -> 저 <> 안에 원하는 오브젝트 타입을 넣는 것. TEXT 뒤에 "" 해서 넣는 건 이름SetRootComponent(); 로 루트 컴포넌트 지정UStaticMeshComponent* StaticMeshComp; 로 포인터 선언StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh")); 추가StaticMeshComp->SetupAttachment(SceneRoot);: StaticMeshComp 는 헤더에서 선언한 포인터라 -> 쓴다. SetupAttachment로 씬루트 아래에 추가. 루트 아래 추가 안하면 여러모로 복잡해짐.static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Chair.SM_Chair"));
if (MeshAsset.Succeeded())
{
StaticMeshComp->SetStaticMesh(MeshAsset.Object);
}
static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Materials/M_Metal_Gold.M_Metal_Gold"));
if (MaterialAsset.Succeeded())
{
StaticMeshComp->SetMaterial(0, MaterialAsset.Object);
}
static ConstructorHelpers::FObjectFinder<> 역시 템플릿. <> 안에 원하는 오브젝트 형식을 넣는다. (TEXT("")) 안에 원하는 리소스의 주소를 넣는다.MeshAsset 또는 MaterialAsset 이라는 이름의 객체를 생성하는 코드라고 보면 된다.
Copy Reference/ Script / Engine.Material'/Game/Resources/Materials/M_Metal_Gold.M_Metal_Gold' 이렇게 나온다. 여기서 /Game 부터가 진짜 주소이므로 그 전 부분은 삭제하고 삽입.MeshAsset.Succeeded() 로 불러오기 성공했는지 체크. SetMaterial SetStaticMesh 로 실제 대입.SetMaterial(0, MaterialAsset.Object) 형태임에 주의UMaterial 부분에 UMaterialInstance 를 넣으면 된다.