본문 바로가기
언리얼_엔진_게임개발_공부/언리얼 블루프린트

[언리얼/블루프린트] 구구단, 슈팅 게임, 가위바위보 로직 구현

by jaboy 2024. 12. 18.

 

구구단 (while loop 사용)

Nested while loop 으로 구구단 로그에 출력

처음에 B를 다시 1로 Set 하는 걸 깜빡해서 왜 안되지 했다.

C++ 코드로 메모장에 써보니 문제를 바로 깨달아서 추가했다.

슈팅 게임 로직 구현

슈팅 게임 로직 구현

과제 내용

- 30발 이상 발사하려고 하는 경우 발사가 불가능하도록 수정

- 30발 가득 차 있는 경우 재장전 불가하도록 수정

- 총에 맞았을 때 HP가 Damage 만큼 깎이는 로직 작성

- Heal 로 피해를 치료하는 로직 작성

 

추가로 구현해 본 내용

- 플레이어와 적 각각의 HP, 공격력 Attack, 명중률 Hit Rate 변수 생성

- 플레이어의 경우 MP 와 MP Use 변수 생성하여 Heal 사용 시 MP를 소진하도록 함

- 총알 발사 후 Hit Rate 를 퍼센티지로 보고 확률에 따라 Hit / Miss 되도록 구현

- Tick 이벤트에 딜레이를 사용해 플레이어의 HP 가 적의 Hit Rate에 따라 확률적으로 감소하도록 함 (플레이어가 피격당하는 상황)

- Tab 키로 Attack 과 Hit Rate 가 바뀌게 함 (총을 바꾸는 상황)

- 재장전 키 누르면 2초 딜레이 후에 재장전 되도록 수정

- 플레이어 혹은 적이 피격 당할 때마다 각자의 HP 를 체크해 0보다 작거나 같으면 게임 일시정지

 

 

추가한 변수

Fire

마우스 왼쪽 버튼 인풋 이벤트 (Left Mouse Button) - 총알 1발 소진

 

Hit or Miss

랜덤으로 생성한 인티저가 Hit Rate 보다 작거나 같을 때 Hit --> Enemy HP 가 Attack 값만큼 감소

 

Reload

총알 수가 Max Bullets 보다 작으면 2초의 딜레이 후 Max Bullets 로 재장전

 

Swap Weapon

Flip Flop 사용하여 Attack 20 / Hit Rate 20 인 무기와 Attack 10 / Hit Rate 40 인 무기 번갈아 선택

 

Heal

My MP 가 MP Use 보다 크거나 같으면 (MP가 충분하면) My HP가 Heal 만큼 증가하고 My MP가 MPUse 만큼 감소

 

Player 피격 상황

Delay 사용하여 2초마다 0~100 랜덤 인티저 생성 --> Enemy Hit Rate 보다 작은 경우 피격 --> My HP 가 Enemy Attack 만큼 감소

 

Game Over

- 위에서 적에 대한 공격이 적중하거나 적의 공격을 받는 경우 실행

- Enemy HP 또는 My HP 가 0보다 작거나 같으면 게임 일시정지

가위바위보 로직 구현

Enum 열거체 활용

* Random Integer --> Integer to Byte --> Byte to Enum EMoves 로 컴퓨터의 값을 랜덤 생성

 

---

언리얼 블루프린트 팁

단축키 관련

- 노드를 여러 개 선택하고 Q 누르면 정렬

>> 가장 오른쪽 노드에 링크된 가장 위의 케이블 기준 수평 정렬

- Alt+클릭으로 핀에 링크된 케이블 분리 가능

- 우클릭 대신 Tab으로도 액션 불러오기 가능

 

변수 관련

- 변수 Ctrl+드래그 : Get / Alt+드래그 : Set

- 변수 만들고 컴파일 후 우측 디테일 패널에서 기본값 설정

 

텍스트 관련

- Format Text 에서 {} 이용해 인풋 값을 텍스트에 넣을 수 있음

 

이벤트 노드 관련

- 키 입력 이벤트는 '키' + keyboard + '키' 로 검색

 

플로우 컨트롤 관련

- For Loop - 마지막 인덱스를 포함한다.

 

열거형 Enumerator

- 열거형 - 콘텐츠 드로어에서 우클릭 - 블루프린트 - 열거형

- Switch on [EnumeratorName] - 인풋으로 열거형 변수를 받아 각 항목별 액션 실행

 

주의!

>> divide by 0 해도 에러 없이 컴파일 및 실행이 된다. (리턴 값 0)

>> division 할 때 소숫점 필요하면 float 으로 나누어야 한다.