2023-11-28 TIL(Unity 최종 프로젝트 27일차)
오늘은 플레이어 애셋을 바꾸고 나서 몬스터에게 타격판정이 안 들어가는 것을 확인하고 수정하는 작업과
플레이어 사망 시 부족했던 로직에 대해서도 구현했다.
먼저 몬스터에게 타격판정이 들어가도록 하는 것 중에 한가지 배운 점으로는, 애니메이터에 이벤트를 추가하는 기능에 대해서 알게 되었다.
애니메이터 창에서 보면 Add Event 라는 기능이 있는데, 해당 기능을 사용하여 애니메이션이 실행되는 중 원하는 프레임에 지정해서 이벤트 호출을 할 수 있는 기능이었다. 해당 기능을 사용해서 다른 팀원분이 만들어 두셨던 기능을 적용했다. 하지만 공격판정이 일어나질 않아서 아직 해결은 못했다...
그리고 두 번째로는 사망 시 부족했던 구현에 대해서도 해결했다. 플레이어의 체력이 0이 되고 나면 죽는 애니메이션이 호출되고 더 이상 피격을 받으면 안 되는데 적에게서 계속 인식이 되어서 피격판정을 받아 맞을 때마다 애니메이션이 계속해서 재생되는 현상이 발생했다.
아무래도 플레이어의 인식을 가지고 있는 적관련 스크립트를 수정하는 것보다 플레이어가 죽으면 타격판정을 받지 않도록 구현하기 위해서 사망 시 콜라이더를 삭제하도록 해야 했다.
PlayerDeadState
public class PlayerDeadState : PlayerBaseState
{
public PlayerDeadState(PlayerStateMachine playerstateMachine) : base(playerstateMachine)
{
}
public override void Enter()
{
base.Enter();
StartAnimation(stateMachine.Player.AnimationData.DeadParameterHash);
DisablePlayerCollider();
}
public override void Exit()
{
base.Exit();
}
private void DisablePlayerCollider()
{
CapsuleCollider playercollider = stateMachine.Player.GetComponent<CapsuleCollider>();
CharacterController characterController = stateMachine.Player.GetComponent<CharacterController>();
if(playercollider != null && characterController != null)
{
playercollider.enabled = false;
characterController.enabled = false;
}
}
public override void Update()
{
base.Update();
}
}
처음에는 그냥 Collider만 GetComponent로 가져와서 비활성화시키도록 코드를 작성했는데,
플레이어에게는 CharacterController와 CapsuleCollider 두 개의 컴포넌트가 적용되어 있기 때문에
한 가지만 비활성화가 되어서 여전히 같은 현상이 일어났었다. 그래서 Player의 스크립트를 살펴보니
CapsuleCollider는 따로 호출하도록 코드가 작성이 안되어있어서 조금 수정을 하고 해당 기능을 작동해 보았더니
사망 시 두 개의 컴포넌트가 동시에 비활성화되어서 더 이상 피격을 받지 않도록 구현이 잘 되었다.
콜라이더를 활성화, 비활성화하는 것을 응용하여 구르기 시에는 피격판정을 받지 않는 것이 기획 의도였기 때문에 RollState에서도 똑같이 적용을 시키면 될 것 같다.
그리고 앞으로 할 일은 플레이어 조작감 최적화와 PlayerCondition 부분에서 플레이어 스탯 구현하는 것을 하다가 날려먹어서 다시 구현하는 것. 그리고 피격 시 애니메이션이 출력되는 것도 고려해 보아야겠다.