저번에 가위바위보 게임을 간단하게 만들 때 기본적인 개념에 대한 이해는 끝나서 제가 모르는 부분만 다시 정리했습니다.
목차
- 블루프린트 변수
- 블루프린트 변수 노드 Get, Set
- 사칙연산 트러블 슈팅
- Flip Flop이란?
- 블루프린트를 이용한 게임 만들기
- 텍스트 슈팅 게임
- While Loop를 이용한 구구단 만들기
- 열거형을 이용한 가위바위보 게임 만들기
이렇게 다양한 타입의 변수가 있습니다. 기본적인 타입만 정리했습니다.
부울(Boolean)
: true(1) 또는 false(0)를 가집니다.바이트(Byte)
: 0~255까지의 정수입니다.인티저(Integer)
: 약 -21억~21억까지의 정수입니다.인티저64(Integer64)
: 인티저로도 감당 안되면 쓰는 가장 큰 정수형입니다.플로트(Float)
: 실수입니다. 정수에서 소수점이 추가됩니다.네임(Name)
: 비교할 때 훨씬 빠른 스트링입니다.스트링(String)
: 문자열을 뜻합니다. 예시로 "안녕하세요."텍스트(Text)
: 스트링을 포함한 문자열입니다. 다국어 변환이 가능해서 퀘스트나 시나리오 설명할 때 쓰면 좋을 거 같습니다.Get은 ctrl+drag
로 빠르게 가져올 수 있습니다.
Set은 Alt+drag
로 빠르게 가져올 수 있습니다.
Var 1을 10으로 설정하고 Var 2를 0으로 나누어 봤습니다.
다른 프로그래밍 언어에서는 0으로 나누면 오류가 뜨겠지만,
블루프린트에서는 값이 0으로 잘 출력 됩니다.
그래서 의도치 않은 동작이 발생할 수 있으니 주의해야 합니다.
Var 1을 10, Var 2를 9로 설정했습니다.
결과는 1이 나왔습니다.
정수 나눗셈에서는 소수점 뒷자리가 모두 날아가 버린다는 걸 깨달았습니다.
실행 흐름을 번갈아가며 두 개의 출력 핀으로 구분하여 실행하는 노드입니다.
저는 R키를 누르면 A와 B가 반복 출력되게 만들었습니다.
다음과 같이 R키를 누를때마다 반복적으로 번갈아 실행되는 걸 볼 수 있습니다.
이런식으로 텍스트 슈팅 게임을 만들었습니다!
1) 총알 발사 버그
현재 구현 상 마우스 클릭을 30번 이상하는 경우에도 총알이 발사가 됩니다.
30발 이상 총알을 발사하려고 하는 경우, 발사가 불가능하도록 버그를 수정해봅시다.
총알을 30발로 두고 발사했을 때 남은 총알이 0이 되면 더이상 발사가 되지 않아야 하는데 계속 발사가 되었습니다.
저는 총알 발사 관련 노드들 사이에 Branch를 추가했습니다.
남은 총알이 0보다 같거나 클 때만 발사할 수 있게 조건(condition)을 넣었습니다. 그러면 총알이 0이 될 때까지만 줄어들고 총알 갯수가 0이 되면 줄어들지 않습니다.
그리고 Print Text로 남은 총알이 없을 때 재장전하라는 문장이 출력되게 했습니다.
2) 총알 재장전 버그
현재 구현 상 총알이 30발 가득차 있는 경우에도 총알이 재장전 됩니다.
총알이 가득차 있는 경우, 재전이 불가능하도록 버그를 수정해봅시다.
또 Branch를 사용했습니다.
30발을 제외한 경우는 모두 장전할 수 있게 != 30인 경우 true로 총알 재장전 노드들이 실행되게 하였습니다.
Bullet이 30발일 때는 Branch에 조건이 False가 되어
재장전이 되지 않는다는 문구를 출력되게 했습니다.
총알을 발사하고 장전만 할 수 있는 게임은 재미가 없습니다.
두가지 기능을 추가해보았습니다.
총알을 맞으면 피해를 입어야 합니다.
총알을 쏘면 남은 총알의 개수를 알려주는 문장 이후
적의 HP가 내려간게 보이도록 다음 문장이 출력되게 했습니다.
이런식으로 Enemy HP-DAMAGE를 설정해 총을 쏠 때마다 무조건 적이 맞게 했습니다. 지금은 적이라는 오브젝트가 없어 텍스트로 피격 기능을 구현했습니다.
하지만, 적의 체력이 0이 되어도 적은 사망하지 않고 게임이 계속 진행되었습니다. 그래서 적의 체력이 0이 되면 게임이 종료되게 하였습니다.
Print Text를 추가해 게임 시작시 나오는 문장을 추가해서
좀 더 게임처럼 만들었습니다.
Branch와 Print Text를 추가해 좀 더 노드가 깔끔히 보이게 하고
좀 더 게임처럼 만들었습니다.
적의 HP와 총알의 DAMAGE를 계산해 적의 남은 체력을 계산하는 노드를 구성해 클릭 한번에 적의 HP가 줄어든 게 보이도록 적 HP를 나타내는 문장이 출력되게 했습니다.
그리고 중간에 Branch를 넣었는데 적의 HP가 0이 되어도 게임이 끝나지 않아 Branch의 condition이 False가 되면 엔딩 문장도 나오게 했습니다.
엔딩을 봤으면 재시작도 있어야 합니다.
T키를 눌러 재시작할 수 있도록 만들었습니다.
게임이 다시 시작되어야 하니 적의 HP와 총알 개수, condition도 리셋해주었습니다.
총알 피격으로 입은 피해를 치료할 수 있어야 합니다.
저 자신을 쏘고 HP를 회복할 순 없으니 HP가 줄어든 적의 HP가 최대 체력까지 올라가도록 만들었습니다.
여기서 적을 처치해 게임이 끝났는데도 R, H키가 작동되었습니다.
그래서 condtion 변수를 만들었고
이렇게 키 이벤트 후의 노드들이 시작되기 전에 Branch를 넣어서 condition이 false면 작동못하게 막아두었습니다.(게임이 끝나면 R키와 H키가 작동되지 않게)
While Loop를 이렇게 연결하면 첫번째 While Loop안에 두번째 While Loop가 들어있게 됩니다.
즉, 두번째 While Loop가 끝나도 다시 첫번째 While Loop로 돌아갑니다.
열거형으로 가위바위보 게임의 결과를 출력하려면 열거형 블루프린트가 2개 필요했습니다.
이번엔 Random Integer로 열거형의 Index(순번)를 들고 와야 했습니다.
Integer의 값이 0, 1, 2라면 각 열거형의 요소들은
위에서부터 순서대로 0, 1, 2 순의 Index(순번)를 가집니다.
결국 열거형으로 결과를 출력하기 위해선 인티저를 열거형으로 바꿔야 합니다.
Integer(인티저)→Byte(바이트)→Enum(상수)로 변환하면 되는데요.
팀원분들이 알려주셔서 깨달았습니다. 감사합니다.
그리고 구글 검색을 해도 결과가 바로 나오는걸 확인했습니다.
구글링을 잘 활용하겠습니다.
가위, 바위, 보를 비교하는 조건이 필요했습니다.
인티저로 만들어 놓은 게 있어서 활용해봤습니다.
설명하면 가위, 바위, 보 순으로 0, 1, 2의 값을 가집니다.
Power가 이기는 경우의 수는 (1,0),(2,1),(0,2)
비기는 경우의 수는 (0,0),(1,1),(2,2)
지는 경우의 수는 (0,1),(1,2),(2,0)입니다.
Power는 내가 낼 행동(가위, 바위, 보),
Com Power는 컴퓨터가 낼 행동(가위, 바위, 보)을 의미합니다.
Power는 0이고 ComPower가 2일때만 true를 반환합니다.
이기는 경우의 수 중 (0,2)에 해당됩니다.
Com Power는 2가 못 들어가니
Power가 이기는 경우의 수는 (1,0),(2,1)에 해당됩니다.
이기는 경우면 true를, 비기는 경우면 false를 반환합니다.
그렇기에 1 또는 2의 조건 중 true가 하나라도 있으면
Power가 이기는 모든 경우의 수가 나오게 됩니다.
그래서, OR노드를 써서 두 조건을 묶었습니다.
이기는 경우는 확실히 나누었으니
비기는 경우와 지는 경우를 나누어야 합니다.
그래서 Branch를 하나 더 써서
Power와 Com Power가 같은 경우라면 True로 비기는 경우를 출력
아니라면 이제 남은게 지는 경우밖에 없으니 False로 지는 경우를 출력!
기능을 추가할 때 흐름에 대한 이해를 하지 못하면 예상한 대로 작동하지 않을 수 있음을 배웠습니다. 특히 While Loop를 2번 쓸 때 어떤 순서로 작동되는 지 몰라서 많이 해멨습니다.
공부 방법
작은 단위로 노드를 연결하고 배치해 최대한 실험합니다.
그래도 안되면 구글링을 합니다.
그래도 안되면 다른 사람의 블로그를 뒤져봅니다.
그래도 안되면 gpt에게 물어봅니다.
그래도 안되면 튜터님이나 팀원분들에게 물어봅니다.
매주 평일 다른 분들의 발표회를 듣는데 정말 ppt나 구글스프레드시트, 언리얼 엔진 에디터 등 발표 자료가 너무 깔끔하게 잘 정리되어 있습니다.
언리얼 엔진 레벨 블루프린트에서
비슷한 기능들이 있는 노드들에 C를 눌러 설명을 추가하면 매우 좋습니다!!
추가로 정렬은 드래그 후 Q를 눌러 1번 정렬한 뒤 조금씩 정렬하면 좋습니다
상수란? 값이 고정되어 변하지 않는 수
변수를 쓰면 0, 1, 2 같은 숫자로 그 변수의 기능을
기억하게 되는데 많이 헷갈립니다.
그래서 열거형에서는 각 상수의 의미를 명확히 알 수 있도록
직관적인 이름을 사용하는 것이 좋습니다.
중간 중간 낭비하는 시간이 너무 많습니다.
라이브 세션을 듣는데 준비 시간이라던가
잠깐 누군가를 기다려주는 시간, 오류 해결하는 시간 등
예상 외로 낭비되는 시간이 많습니다.
그 시간에 잠깐씩 블로그를 작성하거나 실습의 결과물을 만들면 좋을거 같습니다.
물론 다시 강의가 시작되면 바로 돌아와야 합니다