카테고리 없음

[멋쟁이사자처럼 X 넥슨 MOD Suppoters Hackathon] 5주차 회고 <충돌 기능 구현하기 >

프로틴형님 2022. 8. 3. 23:53

충돌 기능 구현하기


Script Skeleton

  • 장애물에 맞으면 hp감소하고, hp가 0이 될 시 플레이어 상태를 조정한다.
  • 충돌기능은 TriggerComponent가 이미 존재하고 있으므로 이 것을 확장시켜 새로운 ComponentTrap_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의 IDPlayer의 ID와 맞는지 확인 후 다음 코드를 살펴보자.

 

  • Trigger Event가 발생했을 때, player가 잠깐 장애물과 떨어진 후, 키 입력을 하면 동시에 2번의 Trigger Event가 발생해 Hp가 2배로 차감되는 경우가 생길 수 있다.
    **MyDeskCreate ScriptsCreate Component** 후 Take_Damage_Component생성한다.

 

  • DefaultPlayer의 Property에 방금 만든 Take_Damage_Component를 추가시키고 Propertyboolean Take_Damage_Period = true 를 통해, 현재 player가 period가 참일 경우에만 Trap과 충돌하여 hp가 깎이도록 한다.

 

  • Trap_Trigger_Component로 돌아가보도록 하자.

 

  • TriggerEvent가 발생한 대상, 즉 player에게 Take_Damage_Periodtrue 값을 가지고, PlayerComponent.Hp - self.damage를 통해 현재 플레이어의 Hp - 해당 trap이 가지고 있는 데미지 값이 0보다 작거나 같다면, 플레이어는 사망 상태여야 한다.

 

  • 먼저 장애물에 부딪혔으므로 Take_damage_Period = false로 바꿔 두 번 trigger Event가 발생하지 않게 해준다.

 

  • 그 다음, Player의 StateTriggerBodyEntity.StateComponent:ChangeState(”DEAD”)로 만들어준다. 그런데 이 때 Player의 상태만 사망 상태로 만들어줄 뿐, 점프, 이동 등은 정상적으로 가능하다. 따라서 Player 사망 시 이동 및 점프가 불가능하도록 따로 함수를 만들어 실행시켜준다.


PlayerDead 함수 만들기

  • 먼저 Function: 에 “+”를 눌러 New 를 눌러 새로운 함수 PlayerDead를 만들어준다.
  • MovementComponent 에서 InputSpeed와 JumpForce 도 0으로 바꿔 player가 움직일 수 없게끔 만들어주는 함수이다.

 

  • 다시, 현재 Player의 State“DEAD”로 바꿨고, Player가 이동하지 못하도록 설정 해주었으므로, 사망 대기시간 5초를 wait(5)을 통해 5초동안 기다리게 만들었고, 다시 Player의 StateTriggerBodyEntity.StateComponent:ChangeState("IDLE")을 통해 IDLE 상태로 만들었다.

 

  • 그리고 다시 시작점으로 Player를 보내기 위해TriggerBodyEntity.MovementComponent:SetPosition(Vector2(3.4,-4))로 시작점으로 보내주었고, 다시 Player의 HPMaxHp로 설정했다.

 

  • 이후 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의 HPdamage만큼 차감하기
    • 3. 장애물과 닿았을때뒤로 밀려나기

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가 데미지를 입을 수 있는 상태로 바꿔준다.