👾 내일배움캠프/🎮 TIL & WIL

내일배움캠프 30일차 TIL - 스크립트 분리

리리핸 2023. 9. 21. 08:36

 

지난 번 Input Actions를 쓰면서 왜 CharacterController, PlayerInputController, Movement, AimRotation 등의 스크립트를 분리해서 관리하는지 이해하는 데 오래 걸렸다. 

이번에 Enemy 개체들이 추가되면서 이런 식으로 스크립트를 분리하면 확장성이 커진다는 걸 확실히 이해했다.

 

CharacterController를 통해 개체들의 (공통적인 로직이 적용되는) 움직임을 관리하고,

PlayerInputController, EnemyController(ContactEnemyController, RangeEnemyController)가 CharacterController를 상속받아서 추가적인 특징을 반영한 움직임을 구현하는 식으로 확장되어 사용된다.

Movement, Shooting, AimRotation 등의 동작 또한 해당 스크립트만 연결하면 메서드를 공유할 수 있어서 편리했다.


오늘은 개체들의 움직임이 아니라 속성값들을 관리하는 방법에 대해 배웠다.

공격력체력이라는 두 가지 속성을 중심으로 값을 저장하고 변경사항을 적용시키는 로직을 만들어보았다.

 

여러가지 속성이 포함되어 있는 공격력 데이터는 스크립터블 오브젝트를 통해 관리되었다. 스크립터블 오브젝트 또한 상속 구조를 통해 확장성을 높이는 형태로 활용되었다.

 

CharacterStatsController는 각 개체의 속성값들을 총괄하는데, 기본적인 속성값을 보관하는 CharacterStats 객체를 보관하고, 이 객체에 AttackSO 스크립터블 오브젝트를 할당하는 역할을 한다.

 

구체적으로 체력 관련 값들은  HealthSystem 과 DisappearOnDeath에 의해 컨트롤 되며, 

공격력 관련 값들은 근거리 공격의 경우 캐릭터 컨트롤러에서 (캐릭터 간의 거리, 움직임, 입력값들의 영향을 받기 때문) , 원거리 공격의 경우 RangedAttackController에 의해 컨트롤된다.

 

근거리 공격의 경우, 콜라이더와 레이어 마스크를 통해 충돌 대상을 인식하고 공격을 반영하는 형식인 반면,

원거리 공격의 경우, 각 캐릭터 컨트롤러(player 혹은 ranged enemy)가  shooting의 공격 관련 메서드를 호출하면서  ProjectileManager에 attackSO 정보를 넘겨주고, ProjectileManager에서 RangedAttackManager(각각의 프로젝타일의 움직임 및 생성 위치, 프리팹 등을 관리)의 메서드를 통해 화살을 생성한다.