본문 바로가기

블루프린팅/8. 제약조건및 게임플레이 목표

[CH08] 제약조건및 게임플레이 목표 생성

이장에서 다음의 처리를 공부한다.

플레이어가 질주 하는동안 스테미너를 감소시키고 플레이어가 질주하지 않을 때 스태미너를 재생

탄약이 떨어지면 플레이어의 총이 발사되는 것을 방지

플레이어가 탄약을 회복할 수 있도록 탄약 픽업 생성

타깃 제거 숫자를 기준으로 승리 조건을 정의

플레이어가 승리시 게임을 다시 하거나 종료할 수 있는 메뉴 생성

 

>>플레이어 액션 제한

SHIFT키를 누르면 플레이어의 이동 속도를 빠르게 했었는데 그러면 항상 그 기능을 사용하게 된다. 따라서 적당한 제한을 두어야 한다. 

 

스태미너 소모및 재생

이동속도향상기능의 제한을 위해 몇가지 변수를 만들고 사용시 체력을 소모하고 사용하지 않을 경우 체력을 재충전하는 커스텀 이벤트를 만들 것이다. 또한 스크립트를 구성하기 위해 다른 변수와 매트로를 생성한다.

 

변수생성

1. BP_FirstPersonCharacter를 열고 My Blueprint의 변수를 추가한다. 왼쪽은 기존변수 오른쪽은 추가할 변수이다.

컴파일 세이브후 변수들의 Default값을 설정한다.

isSprinting Boolean  
StaminaManagerName String ManageStamina
SprintCost Float 0.05
StaminaRechargeRate Float 0.01
StaminaDrainAndRechargeTime Float 0.2
SprintSpeed Float 2200
WalkSpeed Float 600

 

StopSprinting 매크로 만들기

이제 첫 번째 매크로를 만듭니다. 

1. 내 블루프린트 패널에서 매크로+를 클릭해 이름을 StopSprinting으로 변경한다. 디테일패널에서 Inputs, Outputs +를 눌러 실행타입(Exec) In, Out 출력파라미터를 생성한다. 그래프에 노드들이 생성된다.

2. 변수에서 IsSprinting을 끌어다 SET으로 배치한다.

3. 변수에서  WalkSpeed를 끌어다 GET으로 배치한다.

4. 컴포넌트 패널에서 캐릭터 무브먼트 컴포넌트를 클릭하고 이벤트그래프로 끌어 놓는다.

5. Character Movement 출력핀에서 선을 끌어 SET Max Walk Speed를 배치한다.

6. 모든 노드들을 다음과 같이 연결하고 완성한다. 컴파일후 세이브한다.

 

StartSprint 매크로 생성

질주를 세팅하는 매크로를 만들어 보자

1. 내 블루프린트 패널에서 매크로+를 클릭해 이름을 StartSprinting으로 변경한다. 디테일패널에서 Inputs, Outputs +를 눌러 실행타입(Exec) In, Out 출력파라미터를 생성한다. 그래프에 노드들이 생성된다.

2.  StopSprint매크로엣 처럼 다음과 같이 노드를 배치한다.

3. Branch노드의 Condition핀을 끌어 Does Timer Exit by Function Name노드를 추가한다. 변수에서 Stamina Manager Name을 GET으로 배치하고 Function Name과 이어준다.

4. Branch노드의 False출력 핀에서 와이어를 끌어서 Set Timer by Function Name노드를 추가한다. 노드의 흰색출력핀을 추력노드의 Out핀에 연결한다.

5. Get STamina Manager Name에서 와이어를 끌어 Set Timer by Function Name 핀에 연결한다.

6. Set Timer by Function Name 노드의 Time 핀에서 와이어를 끌어 GET Stamina Drain and Recharge Time 노드를 추가한다. 변수에서 끌어다 GET으로 놔도 된다

7. Set Timer by Function Name 노드의 Looping 입력 파라미터를 체크한다. Stamin Drain and Recharge Time 변수의 값이 0.2이므로 이 타이머의 기능/이벤트를 초당 5회 호출한다. 

8. 블루프린트를 컴파일한다.

9. 전체 그래프 모양이다.

ManageStaminaDrain 매크로 생성

ManageStaminaDrain 매크로는 플레이어의 스테미너를 소모하고 질주를 중지하는 조건을 확인한다.

1. 내 블루프린트 패널에서 매크로+를 클릭해 이름을 ManageStaminaDrain으로 변경한다. 디테일패널에서 Inputs, Outputs +를 눌러 실행타입(Exec) In, Out 출력파라미터를 생성한다. 그래프에 노드들이 생성된다.

2.  StopSprint매크로엣 처럼 다음과 같이 노드를 배치한다.

3. Branch의 Condition입력핀에서 AND노드를 추가하고 입력으로 >노드를 추가하면서 다음과 같은 그래프를 만든다 

4.오른쪽 Player Stamina SET의 인풋핀에서 선을 끌어 Max를 추가하면서 다음과 같이 그래프를 완성한다.

5. 전체 그래프 연결은 다음과 같다.

ManagerStaminaRecharge 매크로 생성

플레이어의 스태미너가 1까지 가득 찰때까지 재 충전 한다. 1이되면 Branch에서 타이머를 클리

1. 내 블루프린트 패널에서 매크로+를 클릭해 이름을 ManagerStaminaRecharge 으로 변경한다. 디테일패널에서 Inputs, Outputs +를 눌러 실행타입(Exec) In, Out 출력파라미터를 생성한다. 그래프에 노드들이 생성된다.

2. 우선 Branch를 추가하고 다음과 같이 연결한다

3. 변수 Player Stamina SET을 배치하고 다음과 같이 배치한다. MIN은 Float▼f Min(Float)를 선택한다. 1을 설정한다. 충전값이 최고치 1이 넘어가면 1로하기 위한 노드다. 

4.  Branch Condition입력핀에서 Nearly Equla(Float)를 배치 변수 Player Stamina GET을 배치해 연결한다. Near Equal의 B입력 옆의 상자에 1을 입력한다. Stamina최고치가 1인데 최고치를 검사하는 노드다

5. 전체 그래프 연결도 입니다.

Sprint 입력 액션 이벤트 업데이트

새로운 스테미너 시스템을 사용하려면 Sprint입력 액션 이벤트를 수정해야 한다.

1.  My Blueprint InputActionSprint를 더블클릭하면 이벤트로 이동한다.

2. InputAction Sprint 주변의 노드를 다 지우고 다음과 같이 매크로를 연결해준다. 이상태로 컴파일 하면 동일한 동작을 한다.

3. Start Sprinting 앞에 Branch노드를 넣고 조건으로 PlayerStamina > Sprint Cost를 다음과 같이 추가한다. 

4. 교재에서는 PlayerStamina >= Sprint Cost를 표현하고자 PlayerStamina == Sprint Cost Boolean을 추가후 OR Boolean의 출력을 연결해주었다.

ManageStamina 커스텀 이벤트 만들기

이제 플레이어가 질주 중인지 확인하고 적절한 매크로를 호출해서 스테미나를 소모하거나 재충전하는 ManageStamina커스텀 이벤트를 생성하다. 과정은 

1. 이벤트그래프의 빈공간을 우클릭후 커스텀이벤트 추가, 이름을 ManageStamina로 변경한다

2. 플레이어가 질주하고 있는지 확인하고 적절한 매크로를 실행하기 위해 다음과 같이 노드를 추가한다.

3. 컴파일 세이브 후 플레이해본다. 달리는 중 SHIFT를 누르면 스테미너가 떨어지고 누르지 않으면 속도가 떨어지면서 재충전된다. SHIFT+W는 동작하지 않았다 W를 먼저누르고 나중에 SHIFT를 눌러야 달렸다

 

탄약이 없을때 발사 액션 방지

현재 탄약을 계속쏘면 0이하로 되지만 제약이 없다. 탄약수가 0이 되면 총을 발사 하지 못하게 한다.

 Blueprints폴더의 BP_weapon_component(구버전 BPRifle)  블루프린트를 연다.

1. 블루프린트 패널의 그래프 카테고리에서 OnFireProjectile 커스텀이벤트를 찾으라고 했는데 없었다.

 2.가장 비슷한게 EnhancedInputAction IA_Shoot이고 Triggered출력이 SpawnActior로 연결되어 있어 발사체 발사를 트리거 하는것 같았다 확인을 위해 ALT클릭으로 끊어보니 발사체가 발사되지 않았다. 끊어진 상태로 교재의 노드들을 추가했다.

3. 다음과 같이 노드들을 연결하고 최종 출력은 SpawnActor BP FirstPersonProjectile과 연결해준다. 로직은 총알의 갯수가 0이상일 경우만 Trigger를 다음 노드로 전달해준다. 복잡해 보이는이유는 PlayerCurrentAmmo가 BP_FirstPersonCharacter의 변수라 형변환을 한거고 현재 레벨의 인스턴스와 연결하다보니 이렇게 되는것 같다.ㅠㅠ

4. 컴파일후 실행해보면 Ammo가 0에서 더 이상 발사가 안된다.