충돌 기능 구현하기
Script Skeleton
- 장애물에 맞으면 hp감소하고, hp가 0이 될 시 플레이어 상태를 조정한다.
- 충돌기능은 TriggerComponent가 이미 존재하고 있으므로 이 것을 확장시켜 새로운 Component인 Trap_Trigger_Component를 제작한다.
- Component를 새로 만들었다면 먼저 해당 Trap의 데미지를 조정할 수 있도록 Property에 damage를 넣어준다.
- 작동 로직
TriggerEvent가 발생→ 해당 TriggerEvent가 발생한 대상이 Player인지 확인
→ (맞을 시) 플레이어의 Hp - Trap의 데미지가 0보다 클 때 : HP만 감소,
0보다 작거나 같을 때 : 플레이어 사망 및 5초후 부활 설정 - TriggerEvent 발생 시 다음 작업을 실행시켜야 한다.
⇒ Entity Event Handler > ‘+’ 클릭 > TriggerEnterEvent 추가
TriggerEvent 발생 시 충돌 기능 구현하기
- Trigger Event 발생시, 대상이 Player인지 확인해준다.
- if문을 통해 TriggerBodyEntity의 ID가 Player의 ID와 맞는지 확인 후 다음 코드를 살펴보자.
- Trigger Event가 발생했을 때, player가 잠깐 장애물과 떨어진 후, 키 입력을 하면 동시에 2번의 Trigger Event가 발생해 Hp가 2배로 차감되는 경우가 생길 수 있다.
⇒**MyDesk
→Create Scripts
→Create Component
** 후 Take_Damage_Component를 생성한다.
- DefaultPlayer의 Property에 방금 만든 Take_Damage_Component를 추가시키고 Property에
boolean Take_Damage_Period = true
를 통해, 현재 player가 period가 참일 경우에만 Trap과 충돌하여 hp가 깎이도록 한다.
- Trap_Trigger_Component로 돌아가보도록 하자.
- TriggerEvent가 발생한 대상, 즉 player에게 Take_Damage_Period 가 true 값을 가지고,
PlayerComponent.Hp - self.damage
를 통해 현재 플레이어의 Hp - 해당 trap이 가지고 있는 데미지 값이 0보다 작거나 같다면, 플레이어는 사망 상태여야 한다.
- 먼저 장애물에 부딪혔으므로
Take_damage_Period = false
로 바꿔 두 번 trigger Event가 발생하지 않게 해준다.
- 그 다음, Player의
State
를TriggerBodyEntity.StateComponent:ChangeState(”DEAD”)
로 만들어준다. 그런데 이 때 Player의 상태만 사망 상태로 만들어줄 뿐, 점프, 이동 등은 정상적으로 가능하다. 따라서 Player 사망 시 이동 및 점프가 불가능하도록 따로 함수를 만들어 실행시켜준다.
PlayerDead 함수 만들기
- 먼저 Function: 에 “+”를 눌러 New 를 눌러 새로운 함수 PlayerDead를 만들어준다.
- 또
MovementComponent
에서 InputSpeed와 JumpForce 도 0으로 바꿔 player가 움직일 수 없게끔 만들어주는 함수이다.
- 다시, 현재 Player의
State
를“DEAD”
로 바꿨고, Player가 이동하지 못하도록 설정 해주었으므로, 사망 대기시간 5초를wait(5)
을 통해 5초동안 기다리게 만들었고, 다시 Player의State
를TriggerBodyEntity.StateComponent:ChangeState("IDLE")
을 통해 IDLE 상태로 만들었다.
- 그리고 다시 시작점으로 Player를 보내기 위해
TriggerBodyEntity.MovementComponent:SetPosition(Vector2(3.4,-4))
로 시작점으로 보내주었고, 다시 Player의HP
를MaxHp
로 설정했다.
- 이후
TriggerBodyEntity.Take_Damage_Component.Take_Damage_Period = true
를 통해 Player의 데미지를 받는 주기를 다시 True로 설정해 Trap과 닿으면 Hp가 깎이도록 설정해준다.
- 또한 InputSpeed와 JumpForce, Mode가 다 0이거나 nil로 되어 있으므로 다시 돌려주는
PlayerAlive()
라는 함수를 실행시켜준다. 다음은 PlayerAlive 함수 내용이다.
- 해당 함수에서는 InputSpeed,JumpForce,Mode를 원래대로 바꿔주는 함수이다.
- Player의
**Take_Damage_Period == true**
: 부딪힐 수 있는 상태 - Hp - damage가 0보다 작은 상황이 아닐때
- 1.
Take_Damage_Period = false
로 바꿔줘 TriggerEvent가 연속으로 발생하는 경우 막기 - 2. Player의 HP를 damage만큼 차감하기
- 3. 장애물과 닿았을때는 뒤로 밀려나기
- 1.
⇒ TriggerBodyEntity.RigidbodyComponent:SetForce(Vector2(-1 * _UserService.LocalPlayer.PlayerControllerComponent.LookDirectionX,3)) 의 Vector2의 값을 -1*LookDirectionX 으로 설정
→ 바라보는 방향의 뒤로 힘을 가해주면서 뒤로 밀려나게 된다.
wait(0.75)
사용
⇒ Player가 피격 후 0.75초동안 triggerEvent가 발생하지 않게 한다.
- 이후 다시
**Take_Damage_Period = true**
로 바꿔주면서 Player가 데미지를 입을 수 있는 상태로 바꿔준다.