
리턴 타입 기존에 원래 있던 노드들을 함수로 합쳐줬지만, 이번에는 아에 새롭게 함수를 만드는 것을 테스트 해보자. 이벤트 그래프 좌측 칸의 함수 오른쪽에 있는 +버튼을 통해 함수를 생성할 수 있다. 생성하고 나면 위와 같이 해당 함수를 이벤트 그래프로 드래그하여 생성할 수 있다. 해당 함수를 더블 클릭하여 보면 처음에는 시작 노드만 존재한다. 그리고 오른쪽 디테일 탭을 보면 입력과 출력 칸을 볼 수 있다. 입력칸에 Text1 및 인티저를 설정해주면 시작노드 실행핀 아래에 해당 변수가 입력값으로 생기는 것을 볼 수 있다. 이를 테스트 삼아 Print string에 연결해주었다. 이벤트 그래프로 돌아가 보면 우리가 설정해준 입력값이 그대로 반영되어 있는 것을 볼 수 있다. 이번에는 출력 칸을 살펴보자. 출력..
문제링크 : https://www.acmicpc.net/problem/2417 2417번: 정수 제곱근 정수가 주어지면, 그 수의 정수 제곱근을 구하는 프로그램을 작성하시오. www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; ll N; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; ll tmp = sqrt(N); //제곱근 반환 if(tmp*tmp < N) tmp++; cout

함수 현재 레벨 블루 프린트 화면을 보면 다음과 같이 다소 복잡하게 보인다. 이를 위해 특정 기능을 가진 노드들을 묶어 하나의 함수로 깔끔하게 정리가 가능하다. 함수로 묶기에 앞서 원하는 노드들을 묶어 코멘트 블록을 묶는 방법도 있다. 원하는 노드들을 드래그 후 C를 누르면 위와 같이 코멘트 블록으로 표시된다. 해당 코멘트 블록은 우측 디테일 탭에서 이름 수정이 가능하다. 하지만 오히려 겉보기에 더 난잡하다고 느껴질 수도 있다. 우선 탄약을 발사하는 부분을 함수로 묶어준다. 플레이어 폰을 가져와서 충격을 주는 노드들 까지 모두 드래그하여 우클릭을 하면 함수로 접기가 존재한다. 이를 사용하여 하나의 함수로 묶어줄 수 있다. 위에 많은 노드들이 위와 같이 하나로 묶인 것을 볼 수 있다. 해당 함수는 좌측 상..

Booleans and Branches 저번에 탄약을 20개로 정하고 쏠 때마다 감소하도록 해주었다. 하지만 다 떨어졌음에도 불구하고 음수를 출력하는 것을 볼 수 있었다. 이를 위해 Branch 와 Boolean을 이용하여 탄약이 0개 미만이면 발사를 멈추도록 해줄 수 있다. 먼저 Booleans는 yes or no에 대한 데이터 타입이다. (참, 거짓) 그리고 branch는 위 Booleans 값에 따라 하거나, 하지 않거나를 결정한다. (참 -> 행동 o, 거짓 -> 행동 x) 또한 비교 연산자를 통해 크거나, 작거나, 같거나 등 비교를 통해 반환 받은 부울 또한 참고할 수 있다. 우선 우리는 탄약 갯수가 0개보다 많을 때만 발사가 이루어져야 한다. 이를 위해 우선 Greater 노드를 가져와 Get..
문제링크 : https://www.acmicpc.net/problem/6236 6236번: 용돈 관리 현우는 용돈을 효율적으로 활용하기 위해 계획을 짜기로 하였다. 현우는 앞으로 N일 동안 자신이 사용할 금액을 계산하였고, 돈을 펑펑 쓰지 않기 위해 정확히 M번만 통장에서 돈을 빼서 쓰기로 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int N, M, arr[100001]; int sum; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N >> M; for(int i=0; i> arr[..

변수현재 발사체는 갯수 조절 없이 무한으로 발사할 수 있다.발사체의 갯수를 정해 일정 갯수를 발사하면 더 이상 발사가 불가능하게 만드는 것이 더 바람직하다.이를 위해서 변수가 필요하다. 변수란 정보를 담고, 조작하고, 참조하는걸 뜻한다.핵심은 정보를 담는 것이다.예를 들어 탄약이라고 이름 붙인 상자를 생각하면 된다.해당 상자에 20이라는 값을 넣고, 탄약이 얼마나 남았는 지를 체크해준다.탄약이라는 이름, 20이라는 데이터, 정수라는 형식을 가지게 된다. 우선 레벨 블루 프린트의 좌측을 보면 변수를 추가하는 부분이 바로 보인다.여기서 탄약이라는 이름의 변수를 추가해주고, 타입을 정수(인티저)로 바꿔준다. 해당 변수의 기본값 설정이 가능한데, 우선 레벨 블루 프린트를 컴파일을 해주면 위 이미지의 빨간 박스로..

충돌 메시저번에 만들었던 선반에 이어 선반 및 바닥에 배럴을 추가해준다.특히 바닥에 놓은 배럴은 배럴 위에 배럴을 쌓아 탑을 형성해준다.이후 플레이를 해보면 선반에 있는 배럴과 배럴 탑이 모두 위로 튀어 오르는 것을 볼 수 있다. 이는 언리얼에서 충돌을 계산하는 방식 때문에 일어나는 문제이다.먼저 와이어 프레임으로 보면 다음과 같이 복잡한 메시로 볼 수 있다. 이후 플레이어 콜리전으로 전환하면 다음과 같은 울퉁불퉁하여 충돌이 깔끔하게 일어날 것 같지 않은 메시를 볼 수 있다. 이를 고치기 위하여 우선 배럴 메시를 더블 클릭하면 해당 메시에 대한 에디터가 나온다.여기서 콜리즌에 대한 수정이 가능하며, 우선 기존의 울퉁불퉁한 콜리전을 삭제해준다. 그리고 다음과 같이 10면체 Z 단순화 콜리전을 추가해주..
문제링크 : https://www.acmicpc.net/problem/2470 2470번: 두 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int N, arr[100001]; int L, R; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for(i..

액터 컴포넌트 이번엔 기존의 액터에 여러 개의 요소를 추가하고 이를 하나의 액터처럼 움직이도록 물리학 적용해준다. 이를 위해 기존에 배치했던 선반 메시를 이용한다. 현재 선반은 양쪽 지지대만 있고 내용물이 없는 상태이다. 해당 메시는 SM_Rack01이고 안에 내용물은 SM_Rack02이다. SM_Rack02를 단순히 끌어서 SM_Rack01에 붙이는 것을 시도해볼 수 있다. 이 경우 겉으로 보기엔 멀쩡해보이지만 실제 플레이를 해서 발사체를 발사해 맞춰보면 물리학이 비정상적으로 적용하고 있는 것을 확인이 가능하다. 이를 위해 SM_Rack02 메시를 뷰포트로 드래그 하는 것이 아닌 SM_Rack01을 누르고 우측 디테일 탭에 해당 메시의 StaticMeshCOmponent아래에 자식 요소로 들어가도록 드..

Material과 Light 먼저 이전 레벨에 있던 기능인 발사체를 Space바로 발사하는 기능이 현재 레벨에는 존재하지 않는다. 따라서 이전 레벨의 레벨 블루 프린트에서 해당 기능들을 전부 복사하여 현재 레벨의 블루 프린트로 옮겨준다. 기능은 옮겨줬지만 현재 바닥과 천장 및 벽에 아무것도 없기에 이를 고쳐준다. 여기서 사용되는 것이 Material로 일종의 스킨을 끼우는 것이라 생각하면 된다. 이를 위해 우선 콘텐츠에 사용가능한 Material를 보고 어떤 것을 선택할지 골라야 한다. 위 이미지와 같이 콘텐츠 폴더에 필터링을 걸러 Material만 따로 보는 것이 가능하다. 이후 예시로 M_Ground_Moss라는 Material를 벽면에 적용해본 모습이다. 이름에서 유추가능하듯이 풀밭이 쓰워진 것을 ..
문제링크 : https://www.acmicpc.net/problem/1072 1072번: 게임 김형택은 지금 몰래 Spider Solitaire(스파이더 카드놀이)를 하고 있다. 형택이는 이 게임을 이길 때도 있었지만, 질 때도 있었다. 누군가의 시선이 느껴진 형택이는 게임을 중단하고 코딩을 하기 시 www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int X, Z; ll Y; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> X >> Y; Z = Y*100/X; if(Z>=99) //승률 1..

지오메트리 브러시 기존에 있는 레벨을 수정하며 만드는 것보단 처음부터 직접 만들어 보고자 우선 새 레벨을 만들어준다. 새 레벨을 만들고 레벨 블루 프린트를 생성했던 버튼 바로 좌측에 있는 버튼을 누르면 액터 배치 패널을 가져올 수 있다. 그러면 위와 같은 이미지가 뷰보트 좌측에 생기고 여기서 지오메트리를 선택한다. 바로 아래로 보면 다양한 블록들을 불러올 수 있는데, 해당 기능은 언리얼에 내장된 기능이며 지오메트리 브러시 (BSP) 라 부른다. 브러시는 만들어내면서 구성하거나 뺴면서 조각이 가능하다. 이번에는 큰 박스 브러시 내부에 기존 박스 브러시 보다 작은 박스 브러시를 이용해 내부를 빼서 공간을 만들 예정이다. 먼저 박스를 뷰포트에 생성하는데 우리는 이를 벽으로 사용할 것이므로 우측 아웃라이너 창에..

에셋 가져오기 이번에는 현재 에셋만으로는 월드가 다소 심심하므로 나무 상자와 배럴같은 외부 에셋을 가져와 월드에 추가해준다. 이는 에픽 게임즈 런처의 마켓플레이스에서 다운이 가능하다. 마켓 플레이스에는 다양한 유료/무료 에셋들이 존재한다. 이번 강의에서는 Industry Props Pack 6라는 무료 에셋을 다운받아 사용하였다. 해당 에셋을 다운받고 사진과 같이 라이브러리를 보면 다운받은 에셋이 존재한다. 아래 프로젝트에 추가 버튼을 눌러 원하는 프로젝트에 바로 추가가 가능하다. 추가를 해주고 다시 언리얼로 돌아오면 콘텐츠 브라우저에 에셋팩이 존재하는걸 바로 확인할 수 있다. 해당 에셋팩의 Maps에 있는 showcase를 통해 해당 에셋팩이 어떤 에셋들을 가지고 있는지 확인이 가능하다. 해당 show..
문제링크 : https://www.acmicpc.net/problem/17485 17485번: 진우의 달 여행 (Large) 첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2 ≤ N, M ≤ 1000)이 주어진다. 다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다. www.acmicpc.net #include using namespace std; typedef long long ll; typedef pair pii; const int MAX = 987654321; int N, M, arr[1001][1001], dp[1001][1001][3]; //직전 방향 체크 int func(int y, int x, int dir) { if(y >..

전방 벡터본질적으로 전방 벡터는 회전한 x 방향을 가진다.이는 회전한 다음에 전방을 가리키는 벡터라는 뜻이다. 전방 벡터는 항상 길이가 1이다.이러한 특징을 이용하여 어떠한 방향으로 어떤 크기의 충격을 적용하고 싶을 때 전방벡터를 원하는 값으로 곱하기면 하면 얻을 수 있다. 전방 벡터는 Actor에있는 기능인 Get Actor Forward Vector를 통해 얻을 수 있다.지금은 발사체에 대해 다루고 있으므로 발사체에서 연결해주면 된다.하지만 이를 단순히 바로 임펄스에 연결하면 아주 미약한 힘이 전달되는 것을 확인이 가능하다.이는 전방 벡터의 길이가 1인데, 언리얼의 기본 단위는 cm여서 초속 1cm가 적용된 것이기 때문이다.이를 위해 Mulitply를 이용하여 곱해줄 수 있다.처음 Multiply이를..