오늘은 블루프린트 비주얼 스크립팅 기초에 대해 공부했다. 블루프린트는 아주 심플하면서도 절묘하고 간편하면서도 복잡한 묘한 시스템이다. 코딩이 조소라면 블루프린트는 레고랄까. 원래도 만져본 적은 있지만, 제대로 알아가며 사용해보니 훨씬 간편한 느낌이다. 잊기 전에 이 기억들을 기록해 놔야겠다.
- 블루프린트란
- 언리얼 엔진에서 제공하는 비주얼 스크립팅 시스템
- 노드 기반
- 프로젝트의 프로토타입이나 간단한 로직을 기반으로 하는 게임들을 만들 때 사용 - 이벤트(Event)
- 일종의 트리거로, 어떤 상황에서 호출 될 것인지 약속하는 것
> BeginPlay : 게임이 시작될 때 한번만 실행되는 이벤트
> Tick : 매 프레임마다 실행되는 이벤트 - 변수(Variable)
- 데이터를 저장하고 관리하는 컨테이너
- 변수의 타입
> 부울(Boolean) : 참 / 거짓
> 바이트(Byte) : 정수 (0 ~ 255)
> 인티저(Integer) : 정수 (-21억 ~ 21억)
> 인티저64(Integer64) : 정수 ( -922경 ~ 922경)
> 플로트(Float) : 실수(소수점)
> 이름(Name) : 문자열. 엔진 내부에서 사용. 불변.
> 스트링(String) : 일반적인 문자열. (e.g 플레이어명)
> 텍스트(Text) : 문자열. 다국어 변환이 필요한 경우(e.g 퀘스트 설명)
*나중에 알아보기 : FName - 논리 연산(Boolean Logic)
- AND : 두 조건이 모두 참일 때만 True
- OR : 두 조건 중 하나라도 참이면 True
- NOT : 조건의 결과를 반대로 만듬
- XOR : 두 조건 중 하나만 참일 때 True
과제 1 텍스트 슈팅 게임 제작 및 버그 수정
1. 총알 발사 버그
현재 구현 상 마우스 클릭을 30번 이상하는 경우에도 총알이 발사가 됩니다.
30발 이상 총알을 발사하려고 하는 경우, 발사가 불가능하도록 버그를 수정해봅시다.

- 해결한 방법
Left Mouse Button Event가 발생하면, 브랜치를 통해 남은 총알이 0과 같은 값일 때는 카운트를 하지 않고
Print Text를 통해 재장전을 요구하는 텍스트를 띄우도록 했다.

2. 총알 재장전 버그
현재 구현 상 총알이 30발 가득차 있는 경우에도 총알이 재장전 됩니다.
총알이 가득차 있는 경우, 재전이 불가능하도록 버그를 수정해봅시다.

- 해결한 방법
R key Event 발생 시, 브랜치를 이용해 현재 총알 수가 최대치인 30과 같으면 장전을 실행하지 않고 Print Text를 통해
이미 장전이 되어있다는 사실을 텍스트로 띄우도록 했다.

과제 2 텍스트 슈팅 게임 기능 추가하기
1. 총알 피격 기능
총알을 맞으면 피해를 입어야 합니다.
Hp와 Damage라는 노드를 생성하고, 관련 로직을 작성해봅시다.

- 해결한 방법
T key Event가 발생하면 HP 인티저 변수에서 Damage 인티저 변수(10) 값을 차감하고, 그 값이 0보다 크면
새로운 HP값으로 설정되도록 했다. 그리고 HP가 0과 같거나 더 작아지면 사망상태가 되도록 세팅했다.
사망한 상태에선 조작이 불가능하도록 다른 이벤트에 사망여부 확인 브랜치를 걸어주었다.


*추가 - 부활

사망시엔 Q를 누르면 HP50상태로 부활하도록 히든 기능을 넣어놓았다.

2. 체력 회복 기능
총알 피격으로 입은 피해를 치료할 수 있어야 합니다.
Heal이라는 노드를 생성하고, 관련 로직을 작성해봅시다.


- 해결한 방법
방향키와 가까운 E Key로 이벤트를 발생시키도록 하고 현재 체력이 100보다 작아야 Heal이 진행되도록 했다.
여러 게임에서 채택했듯 치료할 땐 소요되는 시간이 있기 마련이라 3초 딜레이를 주었고, 딜레이를 시각적으로
표현하기 위해 텍스트 마지막 '.'을 초당 하나씩 늘려주었다. 그리고 회복값이 100을 넘어가도 최대 100까지만
채워지도록 했다.


과제 3 While Loop를 이용해 구구단 구현하기
블루프린트 반복문에는 For Loop 이외에도 While Loop가 있다는 것을 배웠습니다.
이번에는 While Loop를 이용해 구구단을 구현해봅시다.
반복문은 Index를 이용해 구구단의 로직을 구현했었는데, While Loop는 Condition을 이용해 이를 구현해야 합니다.
앞서 학습한 내용을 복습해보고, While Loop를 이용한 구구단을 구현해봅시다.

- 해결한 방법
인티저 변수 A와 B를 추가하고 A는 2단, B는 X1부터 시작하는데 증감연산자를 활용할 예정이라 각각 1 더 작은
1과 0으로 기본값을 지정해주었다. 그리고 B는 증감값까지 더해 최종 9까지 올라가면 Complete된 후 다시 0으로
세팅되어 다음 루프를 돌 수 있도록 했다. 그리고 M을 누를 때마다 루프를 작동 시킬 수 있도록 A역시 Complete시에
초기값 1로 세팅되도록 했다. 그 후 곱셈연산과 Format Text 노드를 이용해서 화면에 A X B = Result 값을
표시하도록 했다.

과제 4 열거형을 이용해 가위바위보 구현하기
지금까지 학습한 내용을 바탕으로 가위바위보를 구현해봅시다.
주요하게 구현해야 하는 알고리즘은 다음과 같습니다.
- 열거형으로 가위, 바위, 보를 지정한다.
- 플레이어의 값은 키보드 입력으로 결정한다.
- 컴퓨터의 값은 랜덤 함수로 결정한다.
- 플레이어의 승/무/패 결과를 출력한다.





- 해결한 방법
누메릭 1, 2, 3 키에 각각 바위, 가위, 보가 할당되도록 열거형 변수를 사용해 세팅하였고 플레이어가 실행키를
누르면 Random Integer를 통해 0, 1, 2 중에 하나를 랜덤하게 지정하여 컴퓨터의 가위바위보 값을 정하도록 했다.
인티저와 열거형 함수는 Byte To Enum 노드를 통해 연결하였다. 그리고 3가지 방법을 전환해가며 써 볼 수 있도록
커스텀 이벤트를 사용해 노드를 분할해주었다. 그 후 바이트 변수(0,1,2 만 필요하기에)와 Switch On노드를 이용하여
선택가능한 분기점을 만들었다.
1번 스크립트
Switch On노드를 사용해서 모든 경우의 수에 맞춰 바로 진행되도록 만든 방식이다. 구조가 단순하다.
2번 스크립트
플레이어와 컴퓨터의 열거형 값을 비교하여 무승부를 먼저 골라낸 다음, 무승부가 아닐 경우 승패만 가려내어 결과를
도출하는 방식이다. 구조가 복잡하다.
3번 스크립트
열거형의 숫자값 간 차이를 이용해서 승패무를 가려내는 방식이다. 해당 열거형 숫자값의 이름은 각각
0: Rock, 1: Scissors, 2: Paper 이다. 플레이어의 열거형 변수의 숫자값에서 컴퓨터의 열거형 변수의
숫자값을 뺀다. 그 값이 -1일 경우 플레이어가 승리한다. 값이 0일 경우 무승부이고, 1 또는 -2일 경우
플레이어가 패배한다. 그 결과를 각각 부울 함수로 만들어 준 후 브랜치로 분기를 주어 패, 무, 승 순서로
확인한 후 결과를 도출하도록 했다. 말은 길지만 구조가 가장 단순하다.



해당 과제를 통해 열거형과 Switch노드의 활용법을 조금 알게된 것 같다. 여러 옵션을 주거나 이용할 때 유용하게 사용할 수 있을 것 같다. 또, 겉으로 봤을 때 텍스트로 되어있다고 해서 텍스트로만 생각하지 말고 해당 데이터가 가지고 있는 정보를 최대한 활용할 수 있도록 해야겠다.
추가 용어 정리
- While Loop와 For Loop의 차이
둘 다 반복문이지만 사용 목적과 작동 방식에 차이가 있다.
| 특징 | While Loop | For Loop |
| 반복 조건 | 조건이 참일 때 실행 | 고정된 시작/종료 값 사이에서 실행 |
| 반복 횟수 | 유동적 (조건에 따라 변경 가능) | 명확하게 설정된 횟수만큼 반복 |
| Index 제공 여부 | 없음 | 제공 |
| 사용 예시 | 조건이 언제 끝날지 모를 때 사용 | 반복 횟수가 명확한 작업에 사용 |
| 예 | 체력이 다 찰 때까지 회복 | 0~10까지 아이템을 순차적으로 생성 |
While Loop는 조건이 '참'인 동안 무한 반복하기에, 조건이 영원히 '참'인 경우 무한루프에 빠져 때에 따라 과부하를 일으킬 수 있다. 반드시 적절히 종료되도록 조건을 설정해야한다.
'게임 개발 공부 > 언리얼엔진' 카테고리의 다른 글
| UE5 - Git lfs (0) | 2025.01.07 |
|---|---|
| 언리얼 엔진 5 - 캐릭터 애니메이션 (2) | 2024.12.20 |
| 언리얼 엔진 5 - 블루프린트를 이용한 플레이어 캐릭터 무브먼트 작성 (3) | 2024.12.19 |
| 언리얼 엔진 5 - 기본 용어 2 (3) | 2024.12.17 |
| 언리얼 엔진 5 - 기본 용어 1 (5) | 2024.12.16 |