
언리얼 엔진의 디폴트 레이아웃, 뷰포트 창, 아웃라이너 패널, 디테일 패널, 콘텐츠 브라우저 및 메인 툴바에 대하여 공부해보자
뷰포트
아웃라이너
디테일 패널
콘텐츠 브라우저
에디터 개인 설정
프로젝트 세팅
월드세팅
기본 캐릭터와 삼인칭 템플릿

박스 추가

박스 충돌 무시

프로젝트를 진행하면서 어려웠던 점
새로운 기능이나 툴
다음 프로젝트에서 도전하고 싶은 아이디어?
언리얼 엔진을 실행하면 에디터가 실행 되며 템플릿이나 기본 프로젝트 생성 가능
프로젝트 생성 시 뷰포트가 보이고 이를 통해 월드를 볼 수 있음
오브젝트를 이동 회전 늘리기 줄이기 등 조작 가능
콘텐츠 브라우저에서 자유롭게 뷰포트로 에셋 추가 가능
Fab에서 필요한 에셋들을 프로젝트에 추가
첫 레벨 생성
Unreal Engine 5에서 '프로젝트 생성' 단계의 주요 흐름
'에디터 인터페이스'의 핵심요소 3가지
Unreal Engine에서 'Actor'란?


int main() {
string input = "2025_KIM";
string year = input.substr(0, 4);
string name = input.substr(5);
cout << "년도 : " << year << endl;
cout << "이름 : " << name << endl;
cout << "원본 : " << input << endl;
input.replace(0, 4, "2026_");
cout << "변경 후 : " << input << endl;
size_t find_underbar = input.find("_");
size_t find_underbar2 = input.find("_", find_underbar + 1);
size_t find_2025 = input.find("2025");
cout << "첫번째 언더바 위치 : " << find_underbar << endl;
cout << "두번째 언더바 위치 : " << find_underbar2 << endl;
if (find_2025 == string::npos) {
cout << "2025는 변경되었다." << endl;
}
cout << "문자열이 비어있는가? " << input.empty() << endl;
input.clear();
cout << "input 출력: " << input << " 없다! " << endl;
cout << "clear()후 문자열이 비어있는가? " << input.empty() << endl;
input.append("hi");
cout << input << endl;
input += " hello";
cout << input << endl;
input.insert(0, "everyone ");
cout << input << endl;
input.erase(0, 9);
cout << input << endl;
cout << input.compare("gi") << endl;
// 완전일치 0, 양수 반환 (input의 첫번째 인자가 gi의 첫번째 인자보다 사전순으로 뒤에오므로 양수, 음수반환은 그 반대
input.push_back('z');
cout << input << endl;
input.pop_back();
cout << input << endl;
input.resize(2);
cout << input << endl;
input.resize(5, 'o');
cout << input << endl;
string input2 = "swappp!!!";
input.swap(input2);
cout << "input : " << input << endl;
cout << "input2 : " << input2 << endl;
char lowA = 'a';
char changeA = toupper(lowA);
cout << "lowA : " << changeA << endl;
changeA = tolower(changeA);
cout << "lowA : " << changeA << endl;
return 0;
}
STL이란
순방향 반복자
역방향 반복자
vector
set
map
sort
find()
count()
unique()
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
using namespace std;
int main() {
vector<int> filled(5, 100);
for (int val : filled) {
cout << val << " ";
}
cout << endl;
filled.insert(filled.begin() + 2, 99);
for (int val : filled) {
cout << val << " ";
}
cout << endl;
// 중간삽입은 기존 원소들은 뒤로 다 밀어야해서 O(N)으로 비효율적
cout << "size : " << filled.size() << ", capacity : " << filled.capacity() << endl;
// capacity()는 용량 -> 초과시 2배씩 늘어남 O(N), 대충 크기알면 reserve()사용하는게 효과적
set<int> s = { 3, 1, 3, 2, 5 };
for (int v : s) {
cout << v << " ";
}
cout << endl;
s.insert(2);
s.insert(8);
for (int v : s) {
cout << v << " ";
}
cout << endl;
s.erase(2);
s.erase(3);
for (int v : s) {
cout << v << " ";
}
cout << endl;
s.clear();
cout << "Size after clear : " << s.size() << endl;
float a1 = 0.3;
float a2 = 0.2;
a2 += 0.1;
bool a3 = a1 == a2;
cout << a3 << endl; // float라 1출력
double b1 = 0.3;
double b2 = 0.2;
b2 += 0.1;
bool b3 = b1 == b2;
cout << b3 << endl; // double이라 정밀 오차값으로 인해 0출력
map<string, int> myMap = { {"Apple", 1}, {"Banana", 2}, {"Cherry", 3} };
myMap.at("Banana") = 20;
try {
myMap.at("Durian") = 4;
}
catch (out_of_range& e) {
cout << "예외 발생 : " << e.what() << endl;
}
for (auto& p : myMap) {
cout << p.first << ": " << p.second << endl;
}
auto result = myMap.insert({ "Banana", 10 });
if (!result.second) {
cout << "insert 실패 !" << endl;
}
for (auto& p : myMap) {
cout << p.first << ": " << p.second << endl;
}
vector<string> names = { "Alice", "Dan", "Bob", "Christina" };
sort(names.begin(), names.end(), comp);
for (const string& name : names) {
cout << name << endl;
}
vector<int> vec = { 10, 20, 30, 40, 50 };
auto it = find(vec.begin(), vec.end(), 30);
if (it != vec.end()) {
cout << "찾은 값 : " << *it << endl;
}
auto it2 = find(vec.begin(), vec.end(), 99);
if (it2 == vec.end()) {
cout << "값이 없습니다" << endl;
}
vec.push_back(10);
vec.push_back(10);
vec.push_back(10);
int res = count(vec.begin(), vec.end(), 10);
cout << "10의 개수 : " << res << endl;
int res2 = count(vec.begin(), vec.end(), 1);
cout << "1의 개수 : " << res2 << endl;
vector<int> v = { 1, 1, 2, 2, 2, 3, 3, 3 };
v.erase(unique(v.begin(), v.end()), v.end());
for (int val : v) {
cout << val << " ";
}
return 0;
}
부동소수점은 실수를 이진수만 사용하는 컴퓨터에 저장하는 방식 이 과정에서 오차가 조금씩 생김
예를들어 js에서 0.3 === 0.2+0.1은 다름
float a1 = 0.3;
float a2 = 0.2;
a2 += 0.1;
bool a3 = a1 == a2;
cout << a3 << endl;
이렇게 구성하니 출력이 1이나옴 왜그럴까???
C++에서 소수점 리터럴(0.3, 0.1 같은)은 기본적으로 double 타입으로 취급되는데 이것을 float로 타입으로 받았기 때문에 float로 변환하는 과정에서 double의 정밀한 오차값이 사라짐
double a1 = 0.3;
double a2 = 0.2;
a2 += 0.1;
bool a3 = a1 == a2;
cout << a3 << endl;
double로 변경하니 의도한대로 0출력함