0. 개요
오늘은 강의에서 처음으로 블루프린트를 다루었다.
어제 강의에서 처럼 액터를 배치하거나, 맵을 돌아다니거나 하지는 않았어서 재미가 덜 할 줄 알았지만, 역시 블루프린트도 코딩이라 생각해서인지 오히려 다른 즐거움이 가득했다.
특히 과제를 진행하는게 굉장히 재미있었는데, 오늘 배웠던 블루프린트의 다양한 노드들로 게임을 직접 만들어 보면서 이것저것 실험해보고, 게임 컨셉이나, 기믹을 구현하기 위한 로직 등 다양하게 생각해보고 적용해볼거리가 많아서 어제와는 다른 느낌으로 많이 즐거웠던 것 같다.
이전에 C++, DirectX 11 때는 시각적인 요소까지 직접 구현해야하고, 엔진측 코드도 많이 수정했어서 바빴어서 그랬는지 잘 모르겠지만.. 그때와는 또 다른 편하게 온전히.. 과학상자나 레고를 조립하며 놀듯한 느낌을 받았다.
오늘 TIL 기록은 기억해야할 부분이나 몰랐던 부분 그리고 사용한 노드들 위주로 정리를 해볼까 한다.
이후 과제는 따로 노션에 정리해둔 자료가 있기 때문에 블로그에는 어떤 과제를 했는지 간단한 소개와 결과 영상이나 이미지, 디버깅한 것 정도만 기록할 것이고, 발표 후기는 어제처럼 작성할 예정이다.
1. 블루프린트에 들어가기 앞서 사용한 셋팅 및 기능
◉ 레이아웃 설정
에디터 상단 메뉴 -> 창 -> 레이어 카테고리에 레이아웃 설정, 저장, 제거 등 레이아웃에 관한 기능들이 있다.
나중에 레이아웃을 만져서 잘 못찾을 경우가 발생하면, 해당 레이아웃 불러오기로 큰 시간을 들이지 않고 복구할 수 있을 것 같다.
◉ 프로젝트 시작 레벨 설정하기
에디터 상단 메뉴 -> 편집 -> 프로젝트 세팅
에 들어가서 위 사진과 같이 맵 & 모드에 있는 에디터 시작 맵과 게임 기본 맵을 설정해주면 된다.
에디터 시작 맵 : 에디터를 시작할 때, 처음 진입할 레벨
게임 기본 맵 : 다른 맵이 로드되지 않은 경우 기본적으로 로드되는 맵
◉ level 블루프린트 생성 시기
레벨 블루프린트는 level과 페어로 level이 생성될 때 함께 생성된다.
즉, level 마다 본인의 레벨 블루프린트를 하나씩 가지고 있다.
2. 오늘 사용한 블루 프린트 노드
◉ 메세지 출력
⦁ Print Text
기능 : 문자열이 담겨있는 Text 변수를 전달하거나 직접 입력하여 원하는 메세지를 스크린(뷰포트)나 로그 기록으로 남길 수 있다.
TextColor로 색상 지정이나 Duration으로 스크린 상에서 메세지 유지 시간을 정할 수 있다.
로그창에는 Duration과 관계 없이 한번 기록되면 끝까지 유지되는 것 같다.
Print Text 노드와 유사한 Print String 이라는 노드도 있는데,
print string, print text 차이는
print string은 기본적으로 string을 입력받고 디버깅에 사용한다.
print text는 text를 입력받고 다국적 언어를 출력함에 유리하다.
⦁ Format Text
기능 : C++에서 포멧 문자를 사용해 변수의 값을 문자열에 넣을 수 있는 것과 유사하게 특정 포맷 문자를 사용해 변수의 값을 문자열에 넣을 수 있다. (설명이 애매해서.. 주말에 다시 정리해 적어야겠다.)
주의할점 : C++과 다르게 언리얼에서는 '{}' 안에 변수명을 기입해 주어야 한다.
또, 해당 변수명은 단지 입력핀의 이름이 될뿐이지 입력으로 들어올 변수와 이름이 동일해야할 필요는 없다.
◉ 형변환
⦁ ToText
기능 : Integer 타입 변수를 입력받아 Text 타입으로 변환해 출력해준다.
To Text와 똑같이 To Integer, To String, To Float 등.. 형변환 노드들은 이름이 다 To가 붙도록 만들어 진것 같다.
(과제를 진행할때는 convert to integer 라는 노드를 봤던거 같은데.. 지금 보니까 to integer만 있다.. 뭐지.. 많이 피곤한가..?)
⦁ Enum to String
기능 : Enum 항목을 해당 Enum 항목 이름으로 바꾸어준다.
C++에서 Enum과 Enum Class를 사용할 때 공부했던 것 처럼 언리얼에서도 사실 0, 1, 2.. 등의 숫자인데, 이를 별칭처럼 이름을 붙여주는 것으로 구현되어 있는것 같다.
이번에 과제를 진행하면서 언리얼의 Enum이 Integer가 아닌 Byte로 이루어진 항목들이라는 것을 알 수 있었다.
이와 유사하게 Enum to Name이라는 노드가 있는데, 해당 노드는 Enum 블루프린트 자체의 이름 Enum Class로 치면, Enum Class 자체의 명칭을 반환한다.
⦁ Byte to Enum
기능 : Byte 타입을 Enum의 항목으로 타입 변환을 해준다.
◉ 사칙연산
기능 : 우리가 알고있는 사칙연산이다.
노드를 검색할 때, +, -, *, / 로 검색이 가능하다.
또, 핀 추가를 통해 입력핀을 늘릴 수 있다.
!! 나누기 주의할 점 !!
1. 인자 a,b중 하나가 0이면 보통 프로그래밍에서는 100/0과 같은 경우는 지원을 하지 않는데, 블루프린트에서는 0으로 계산되어 나온다.
때문에 주의해야 한다.
2. 100/99를 해 출력해보면 1로 출력되는데 이는 인티저 / 인티저라 인티저로 출력되어서 소수자리가 짤리는 것이다.
따라서 플로트로 변경해 사용하면 소수자리까지 계산된 값이 출력된다.
이전에 몰랐던 사실인데, 증감 연산 노드도 존재했었다..!
◉ 비교 연산
노드를 검색할 때 >, <, ==, <= ... 등으로 검색해 쉽게 찾을 수 있다.
주의 사항 : 비교를 할때, '<' 나 '>' 처럼 앞과 뒤가 중요한 비교 연산자는 첫 번째 값이 위쪽이다.
즉, A > B 면 A가 위쪽 입력핀, B가 아래쪽 입력핀이다.
◉ 논리 연산
연산자 | 설명 |
AND | 두 조건이 모두 참일 때만 결과가 True가 된다. |
OR | 두 조건 중 하나라도 참이면 결과가 True가 된다. |
NOT | 조건의 결과를 반대로 만든다. |
XOR | 두 조건 중 하나만 참일 때 True가 된다. |
해당 노드들을 검색할 때는 뒤에 Bool을 붙여주면 쉽게 찾아진다.
(오늘 해당 노드를 찾을 때 너무 해맸었다.. ㅠ)
◉ 흐름 제어
⦁ Branch
기능 : C++의 if문 처럼 컨디션에 조건을 전달해 해당 결과가 참이냐 거짓이냐에 따라 분기를 나누어 준다.
Branch의 실행핀에는 여러개의 출력핀이 들어올 수 있다. (해당 부분이 유용한것 같았다.)
⦁ Sequence
기능 : 실행 흐름을 여러 개의 출력으로 분리하고, 순차적으로 각 출력 핀을 실행하는 노드이다.
단순히 Then 0을 시작으로 Then N까지 순차적으로 출력이 진행되는 노드이다.
하지만 오늘 사용해보니, 복잡한 블루프린트의 가독성을 높이는데 큰 도움이 되었다.
⦁ Filp Flop
기능 : 실행 흐름을 번갈아가며 두 개의 출력 핀으로 구분하여 실행하는 노드이다.
하나의 실행 핀을 입력받아 두 개의 출력 핀이 번갈아 실행된다.
반복적으로 번갈아 실행되는 동작을 간단히 구현할 수 있는 장점이 있고, 상태 전환을 쉽게 관리할 수 있다.
⦁ Switch On
◉ 반복
⦁ For Loop
기능 : C++의 for문과 같다.
First Idx 부터 Last Idx까지 Idx 개수 만큼 반복한다.
Idx는 현재 Idx 값이 출력되는 곳이다.
Loop Body는 Loop를 탈출하지 못했을 때 실행되는 출력핀이고,
Completed는 Loop를 탈출 했을 때 실행하는 출력핀이다.
!!!! 주의할점 !!!! : 언리얼 블루프린트에서는 Last Idx수까지 돈다.
즉, C++에서의 for문 조건이 for( int idx = 0; idx <= 10; ++idx)라는 조건인 셈이다.
⦁ While Loop
기능 : C++의 While 문과 같다.
Condition에 While문 조건을 전달한다.
Loop Body와 Completed는 For Loop와 동일하다.
-> 개인적으로 블루프린트 While Loop보다 C++ 코드로 친 While문이 훨씬 간결하고 가독성이 좋은것 같다..
반대로 For Loop는 가독성이 괜찮은것 같다.
◉ 키 입력
키보드나 마우스 입력을 받을 수 있다.
하지만, 언리얼에서 키입력은 Pressed와 Released 즉, 누르는 순간과 해제되는 순간 2가지만 입력받을 수 있다.
더 찾아보니 해당 입력은 액션 매핑된 것들이고, 키를 누르고 있으면 이벤트가 발생하는 입력은 축 매핑을 해줘야 하는 것들인것 같다.
매핑을 하면 기본적으로 프로젝트에서 이동값이나 점프력 등등에 사용할수 있는 scale도 지정이 가능한 것 같다.
(해당 내용은 이후 수업 때 더 자새하게 배우고, 또 그때 자새히 정리할거 같아서 우선 이런게 있구나~ 정도로만 기록하겠다.)
◉ Event
⦁ Event BeginPlay
기능 : 이밴트 노드로 게임이 실행될 때 한번만 발생되어 실행되는 이밴트이다.
오늘 사용할 때는 해당 BeginPlay에서 게임에 필요한 변수들을 초기화 해주었다.
⦁ Event Tick
기능 : 이전 자체엔진을 만들었을 때는 엔진의 전체 흐름을 한번 수행하는 사이클을 틱으로 만들었었다.
언리얼에서의 tick도 마찬가지인지 확인해봐야 하지만, 일단 유사하게 매 프레임마다? 호출되는 이밴트이다.
오늘 사용할 때는 일정 시간이 흐르면 공격하는 몬스터의 공격을 구현할 때 사용했다.
◉ Delay
기능 : Duration으로 입력받은 초가 지나야 다음 실행핀이 실행되는 노드이다.
말 그래도 딜레이를 주어 일정 시간이 지나면 다음 노드가 실행되는 노드이다.
오늘 사용해보니, Delay 노드는 약간 예약을 해서 동작하는 건가..? 싶은 부분이 있었다.
(따라서 주말에 다시 찾아서 공부하고 정리해볼 예정이다.)
3. 변수및 타입
◉ 변수 생성
변수 카테고리의 +버튼을 누르면 변수를 추가할 수 있고, 변수의 이름과 타입을 정해줄 수 있다.
또, 변수를 클릭한 뒤 디테일 패널을 살펴보면, 초기 값등을 설정해 줄 수 있다.
◉ 다양한 변수의 타입
⦁ 부울 (Boolean) : 참/거짓 두 가지 상태만 가짐
⦁ 바이트 (Byte) : 정수. 가장 크기가 작다. (0 ~ 255)
C++로 치면 unsigned char인거 같다.
⦁ 인티저 (Integer) : 정수. 일반적인 정수 (-21억 ~ 21억)
⦁ 인티저64 (Integer64) : 정수. 가장 크기가 크다.
보통 인티저로 충분하지만, 엄청나게 큰 수를 다루어야 할 경우에 인티저64를 쓴다고 한다.
⦁ 플로트 (Float) : 실수. 정밀도가 더 우월함
⦁ 네임 (Name) : 문자열. 엔진 내부에서 사용, 불편인 경우
게임 내에서 무언가를 식별하는 조각이다. 스트링과 스트링 비교보다 네임과 네임 비교가 더 빠르게 구현되어 있다.
-> 따라서 게임 내에서 식별자로 사용되는 타입이다.
⦁ 스트링 (String) : 문자열. 일반적인 문자열
⦁ 텍스트 (Text) : 문자열. 퀘스트 설명같이 다국어 변환이 필요한 경우에 사용
4. 컴파일
만든노드를 컴퓨터언어로 바꿔서 저장한다 정도로 생각하시면 편하다고 한다.
우리가 프로그래밍한 언어를 컴퓨터가 이해하는 언어로 변환해 저장한다.
보다 깊은 내용은 주말을 이용해 다시한번 복습하고 정리해보려고 한다.
5. 새로 알게된 다양한 기능 및 단축키
◉ level 생성 단축키
Ctrl + N : 새로운 레벨을 만들 수 있다.
◉ 블루 프린트 변수 Set, Get 노드 쉽게 추가하기
alt + 변수 Drag&Drop : 변수 Set 노드 생성
ctrl + 변수 Drag&Drop : 변수 Get 노드 생성
◉ 이밴트 그래프 내 블루프린트 포커싱하기 (대략적인 위치)
방법 1. Home 키을 누른다.
방법 2. 좌측 이밴트 카테고리에서 이벤트를 우클릭하고 포커싱을 클릭한다.
◉ 노드 정렬
정렬할 노드들을 드래그하고, Q를 누르면 정렬이 된다.
-> 어느정도만 정렬이되는 느낌이다.
-> 따라서 한번에 노드들을 많이 깔게 되었을때 이용하면 좋을 것 같다.
◉ 이밴트 그래프 내 노드 탐색창 여는 방법
원래는 우클릭만 알고있었는데, Tab을 눌러도 열린다...!!
◉ 이밴트 그래프 코멘트 다는 팁!
C 버튼 클릭 : 코멘트 생성
코멘트 영역 안에 넣을 노드들을 드래그한 뒤, C를 누르면 한번에 코멘트 영역에 넣을 수 있다.!
◉ Add Reroute Node
해당 기능을 사용하면 노드를 연결하는 선들을 더 보기 좋게 정리 할 수 있다.
첨부된 사진을 보면 알 수 있드시 생성된 점에 실행핀을 연결해 원하는 선 모양을 만들 수 있다.
6. 과제 소개
1. 텍스트 슈팅게임 버그 고치기
과제1. 총알 발사 버그 수정하기
현재 구현 상 마우스 클릭을 30번 이상하는 경우에도 총알이 발사가 됩니다.
30발 이상 총알을 발사하려고 하는 경우, 발사가 불가능하도록 버그를 수정해봅시다.
<해결 방법>
Branch 노드를 이용해 총알(Bullet)의 값이 0보다 크다면, 기존 방식대로 총알을 발사해주고, 값이 0 이하라면,
총알이 없습니다! 남은 총알 개수 : 0
이라는 메세지를 출력해주도록 구현했다.
<후기>
그래도 2년간 C++로 코딩을 하면서 기능 구현에 익숙해져서인지, 쉽게 할 수 있었다.
또, 단순히 Branch를 추가해주면 끝나기 때문에 복잡할 것이 없었다.
과제2. 총알 재장전 버그 수정하기
현재 구현 상 총알이 30발 가득차 있는 경우에도 총알이 재장전 됩니다.
총알이 가득차 있는 경우, 재전이 불가능하도록 버그를 수정해봅시다.
<해결 방법>
총알 발사 버그와 마찬가지로 Branch를 이용해 쉽게 해결할 수 있었다.
현재 총알의 개수가 30인지 아닌지를 컨디션으로 전달해 30이라면
이미 총알이 가득 차 있는데요..? 를 출력해주고 장전이 발생하지 않도록했다.
만약 현재 총알이 30이 아니라면,
재장전 완료 남은 총알 수 : {Count}를 출력해주도록 구현했다.
<후기>
해당 과제도 단순히 앞쪽에 Branch 하나를 추가해주면 끝나는 과제라 빠르게 넘어갈 수 있었다.
하지만, 직접 Branch를 사용해보면서 익숙해질 수 있어서 좋았다..!
과제3. While Loop를 이용해 구구단 구현하기
<후기>
처음 완성해 실행시켜 보았을 때 구구단 2단만 출력이 되는 문제가 발생했었다.
생각해보니 그 이유는 2중 while문을 돌릴 때, 2번째 While문의 컨디션으로 주었던 B < 9 조건을 수행할 때, 변수 B가 초기화 되지 않아서 계속 9인 상태로 있었기 때문에 최종적인 print text 노드가 실행되지 않았던 것이었다.
때문에 2번째 while문에서 루프 탈출 시 변수 B의 값을 다시 0으로 초기화 시켜주는 부분을 추가해 해결했다.
아직은 블루프린트보다 C++ 코드가 더 익숙해서 그런지 블루프린트를 이용해 구현하는 것이 시간이 조금 걸리고, 문제가 발생해도 해당 부분을 찾는게 시간이 조금 걸렸다.
=> 그래도 C++에서도 While문을 돌릴 때 신경썼었던거 같은데.. 코딩테스트만 준비하다보니 감을 잃은것 같다..
그래도 지금 처럼 노력하면, 큰 성장을 하겠지..!
과제4. 열거형을 이용해 가위, 바위, 보 게임 구현하기
<조건>
1. 열거형으로 가위, 바위, 보를 지정한다.
2. 플레이어의 값은 키보드 입력으로 결정한다.
3. 컴퓨터의 값은 랜덤 함수로 결정한다.
4. 플레이어의 승/무/패 결과를 출력한다.
<해당 과제를 진행하면서 알게된 것>
1. Branch
Q,W,E 중 하나라도 키입력을 받으면, 가위바위보 게임을 진행하고 싶었는데, 대부분의 노드가 실행핀을 하나만 연결할 수 있어서 곤란한 상황이 발생했었습니다.
찾아보니 Branch가 단순히 분기만 나누는 것이 아니라 여러 실행핀을 한대 묶어서 진행할 수 있다는 것을 알게되어 원하던 결과를 낼 수 있었습니다.
2. convert to Integer
열거형의 이름을 메세지로 출력하고 싶었는데, 열거형Get 노드에서 출력핀을 Print Text 노드의 입력핀에 바로 연결할 수 없어 곤란했습니다.
C++에서는 Enum값이 사실 0,1,2와 같은 정수 형태인데 이를 별칭을 붙여주듯이 사용한다는 것을 생각나서 integer로 형변환해 사용했었습니다.
어느정도 예상했던대로 이렇게 하면 단순히 0 : 0과 같은 출력형태가 되어 다른 방법을 찾아보게 되었습니다.
3. Enum to Name
조금 더 찾아보니 Enum값을 Name으로 변환해주는 노드를 발견했습니다.
하지만 사용해보니 Enum to Name 노드는 열거형 블루프린트 자체의 이름을 출력해주는 것이었습니다.
때문에 열거형 블루프린트의 이름이었던 가위바위보 : 가위바위보(AI)로 출력이 되어서 원했던 결과를 얻을 수 없었습니다.
4. Enum to String
마지막으로 Print Text는 Text 타입을 입력받아야하기 때문에 선택하지 않았던 Enum to String 노드를 사용해 봤는데, 해당 노드는 열거형 블루프린트의 항목들의 이름으로 출력을 해주기 때문에 원하는 결과를 얻을 수 있었습니다.
5. 출력 메세지 고정
뷰포트에서 출력 메세지가 계속 사라지는게 마음에 들지 않아 고정해둔 뒤, 다음 메세지가 출력되면 이전 메세지를 지우고, 새로운 메세지를 띄우고 싶었습니다.
Duration의 값을 늘리면 어느정도 해소가 되긴하지만, 원하는 방법은 아니라 찾아보게 되었습니다.
검색 능력 부족으로 문서에서 해당 내용을 찾지는 못했지만, 레딧과 UDC를 확인한 결과 뷰포트나 로그에 출력되는 메세지는 단지 개발과정을 위한 기능인데, 고정할 필요가 있을까요..? 하는 의견을 많이 보게 되었습니다.
생각을 해보니 이러한 로그 출력은 개발에서 디버깅을 하거나, 기능이 제대로 구현되었는지 체크할 때 유용하게 사용하는 기능이지 게임에서 보여주는 기능은 아니라 이걸로 게임 메세지를 띄우는것은 이상하다 생각했습니다.
따라서 나중에 UI를 배우게 되면, UI쪽을 활용해 이러한 메세지들을 출력하는 방식으로 가는게 맞다 생각해 출력 메세지는 고정하지 않는 방향으로 구현하게 되었습니다.
굳이 이런 방법을 사용하겠다면, Duration을 0으로 만든 print text를 tick event 노드에 연결해 사용하면 된다고는 하지만 몇가지 이유로 이렇게 구현하지 않게 되었습니다.
추가로 Duration을 음수로 전달하면, 환경 설정의 경과시간을 사용한다고 나와있습니다.
<후기>
이전에는 사용해보지 않았던 열거형을 사용해볼 수 있어서 좋았다.
거기다 가위, 바위, 보를 선택할 때 키는 어떻게 할까?
( Q,W,E로 설정했는데, 이유는 가위, 바위, 보 키가 각 각 R(Rock), S(Scissors), P(Paper)로 설정하면 키보드에서 너무 중구난방이라 생각하여 QWE로 사용하기 편하게 구현했습니다. )
개선할 사항은 없을까?
버그는 발생하지 않을까? 등등 다양한 고민을 해보고 직접 테스트 해보는 시간이었어서 매우 즐거웠다. ㅎㅎ
과제5. 텍스트 슈팅 게임 기능 추가하기
<추가 구현한 기능들>
하나하나 다 설명하면 글이 너무 길어질 것 같고, 이미 노션에 작성해둔게 있어서 블로그에서는 어떤 것들을 구현했는지 정도만 기록하겠다.
1. 플레이어 체력 구현하기
2. 몬스터 스테이터스 구현하기
3. 적 공격 기능 및 피격 기능 구현하기
a. 몬스터 공격 기능
b. 플레이어 피격 기능
c. 플레이어 사망 체크 및 사망 처리
d. 몬스터 공격력을 랜덤으로 변경
4. 총알 피격 기능
a. 몬스터 사망 체크
b. 몬스터 피격 기능
c. 몬스터 사망 처리
d. 몬스터 사망 시 조작 막기
5. 체력 회복 기능
6. 메세지 색상 변경
7. 버그 발생 및 해결
a. 몬스터 사망처리 버그 발생
<후기>
오늘한 과제들 중 가장 많은 시간을 할애한 과제였다.
어떤 기능들을 구현하지..? 어떤 컨셉으로 만들지..? 어떤 게임 규칙을 토대로 만들지..? 플레이어와 몬스터 스테이터스 수치는 몇으로 하지..? 등 엄청 많은 고민을 할 수 있었다.
사실 기능 구현은 이미 게임 모작을 3차례 진행해 보았기 때문에 생각보다 쉽게 쉽게 넘어 갈 수 있었지만, 블루프린트가 익숙하지도 않고, 원하는 노드를 쉽게쉽게 찾을 수 없어서 시간이 더욱더 많이 들었다.
하지만 하나하나 찾아보면서 적용해보고, 다양한 고민을 해볼 수 있어서 너무 즐거운 시간이었다.
보통 C++이나 언어를 처음 배우면, 텍스트 게임 만들기 과제를 많이 내주시는 것 같은데, 전부터 만들어보고 싶은 텍스트 게임이 있었다.
사이버 펑크 세계관을 배경으로 스토리를 진행하면서, 전투가 발생하고 최종적으로 그동안 선택했던 선택지를 바탕으로 최종적인 엔딩을 볼 수있는 그런 게임을 만들어보고 싶었다.
(막 복잡하고 긴 스토리가 아니라 그냥 미션 하나 수행하는 정도로 짰었다.)
이번 과제를 보자마자 만들고 싶었던 텍스트 게임이 생각났고, 마침! FPS 장르라서 진행해보려고 했지만, 전투 구현만으로도 시간이 부족하고, 메세지를 원하는 순서대로, 원하는 순간까지 유지 및 삭제를 쉽게 할 수 없는 한계에 부딪혀서 결국 이루지 못했다.
적어도 마탄의 사수를 오마주한 7발 마지막 탄환, 일정 확률로 공격회피, 크리티컬 발생, 포션의 갯수.. 등 시도해보고 싶은 기믹이나 기능은 많았는데, 다 만들지 못해 아쉬웠다.
적어도 위에서 언급한 기능들은 시간이 날때 조금씩 구현해볼까 한다.
(다른 과제들로 인해 너무 늦어져서 이미 블루프린트에 익숙해졌다면.. 추가는 안할거 같지만.. 지금으로썬 해보고 싶다.)
7. 발표 후기
오늘도 역시 다들 엄청난 실력들을 보여주셨다..! 한 조는 벌써 분업해서 UI, 충돌처리, 사운드, 컨트롤러 등등 아직 배우지 않은 기능들을 사용해 게임 프로토타입을 만드셨다.
또 한분은 텍스트게임에 사운드를 넣고, 실제 텍스트 게임 진행과 유사하게 구현해 보다 생동감 있는 게임을 만들었다.
몬스터 탐색시 메세지가 출력되고 저벅저벅 걷는 효과음이 발생한다거나, 총을 쏠때 탕탕! 소리가 나는등 사운드가 추가되니 좀 더 게임의 완성도가 높아보였다.
확실히 다들 열정이 뜨거우신것 같았다. 이런 분위기 속에서 성장해 나갈 수 있어서 너무 다행인것 같고, 좋은 기회인것 같다.
인상 깊었던 발표를 보면서 인상 깊었던 부분이 몇개 있어서 기록해두려 한다.
1. 가위바위보 게임
플레이어와 AI의 선택 결과에 따른 승리 판정을 나처럼 Branch를 많이써서 구현하시지 않고, 알고리즘?을 구현해 사용한 것을 보고 놀랐었다.
나는 enum이 결국 숫자(언리얼에서는 Byte) 타입으로 구성되어있다는 것 까지는 알아냈지만, 이를 활용해 승리판정 알고리즘을 만들지는 몰랐다.
0 묵
1 찌
2 빠
로 enum을 설정하면,
'0 + 1 = 1' == '묵 +1 = 찌'
'1 + 1 = 2' == '찌 + 1 = 빠',
'2 + 1 = 3(0)' == '빠 + 1 = 묵'
로 볼 수 있다.
즉, +1 을 한 결과는 본인이 이기는 결과를 얻을 수 있다.
까지는 이해했는데.. 주말에 발표 영상을 얻으면 보고 분석을 해보고, 그게 아니면 혼자서 연구를 조금해 정리해야겠다..
2. 가위바위보 게임
나는 Switch on을 하나 사용하고 나머지를 Branch를 사용해 승리 패배를 확인하도록 구현했었다.
하지만 Switch on만을 이용해 구현하신 분도 계셨는데 오히려 Branch로 하는것보다 깔끔하게 나올거 같아서 괜찮아 보였다.
Branch는 컨디션도 달아야하고, 변수도 주렁주렁 달리고 True, False에서 출력핀 나오고.. 너무 복잡해진다..
3. 가위바위보 게임
한분은 승리 조건 판별에서 and, or 연산자를 활용했는데, 이 방법도 해보면 좋을 것 같다고 생각했다.
4. 플러그인
언리얼 멀티 에디터 플러그인이라는게 있는데, 정확한 것은 조사해 봐야겠지만, 다른 사람과 함께 프로젝트를 실시간으로 작업할 수 있는 기능을 지닌 플러그인으로 보여서 너무 유용할 것 같았다.
아직 베타 플러그인이라서 버그가 있을 수 있지만, 그래도 한번쯤은 사용해보고 싶었다.
아마.. Figma같은 사이트 처럼 팀원들이 실시간으로 함께 작업할 수 있는 기능 같다.
8. 오늘을 마치며..
계속 기록하는 것 처럼.. 오늘은 내가 원하는 기능들을 만들어보고 실험할 수 있어서 좋았다.
발표를 보면, 아직 많이 부족하구나 느끼긴 하지만, 더 노력해서 따라잡고 싶다는 생각이 더 컷던것 같다.
오늘은 다양한 블루프린트 노드들을 배우고, 그 노드들을 활용해 간단한 기능 구현들을 해볼 수 있어서 좋았다. ㅎㅎ
오늘의 과제 - 튜터님의 한줄평 [ >ㅅ< (b) 따봉 감사합니다.]
ㄴ구조체 사용이 좋았고, 진행하면서 알게된 부분, 찾아본 부분을 잘 기술해서 좋았다고 해주셨다.ㅎㅎ
오늘을 마치며.. 내일도 화이팅!!
01:21... 퇴그은...
'프로그래밍 > Unreal 부트캠프' 카테고리의 다른 글
TIL 2024.12.23 기록 (0) | 2024.12.23 |
---|---|
TIL 2024.12.20 기록 (0) | 2024.12.20 |
TIL 2024.12.19 기록 (3) | 2024.12.19 |
TIL 2024.12.17 기록 (1) | 2024.12.17 |
TIL 2024.12.16 기록 (1) | 2024.12.16 |