-
유니티 추상클래스로 깔끔한 코드 작성하기 / Unity Abstract Class유니티 2023. 9. 5. 13:21
추상클래스의 장점
추상클래스는 템플릿이라고 생각합니다.
함수를 반드시 구현해야 할 것을 명시해 추상클래스를 상속하는 개발자에게 명확한 안내를 제공합니다.
전 과거에 추상클래스의 필요성을 못 느꼈다가
비슷한 기능을 한데 묶어 간결하게 표현할 수 있는 걸 찾다가 매력에 빠지게 되었습니다.
오크와 고블린 예제
오크는 좌우로 움직이며 1초마다 몸통박치기 공격을 합니다.
고블린은 상하로 움직이며 2초마다 칼을 휘두르는 공격을 합니다.위 둘은 공통점이 움직인다, 공격한다입니다.
그러면 공통되는 Move 함수와 Attack 함수를 추상클래스로 구현해
상속을 받으면 공통되는 부분이 묶여서 함수가 간결해집니다.
공통으로 관리하면 데이터 처리에도 매우 효과적입니다.
부모 추상클래스 작성
using UnityEngine; public abstract class EnemyParent : MonoBehaviour { [SerializeField] float attackInterval; float attackTime; protected abstract void Attack(); protected abstract void Move(); void Update() { attackTime += Time.deltaTime; if (attackTime >= attackInterval) { attackTime = 0; Attack(); } Move(); } }
부모가 될 추상클래스는 abstract 키워드를 사용하여 만듭니다.
또 Update가 유니티에서 돌아야 하므로 MonoBehaviour를 상속받습니다.
자식에서 구현해야 하는 함수를 protected abstract로 쓰면 자식에서만 접근이 허용되는 추상함수가 됩니다.
attackInterval은 인스펙터에 노출되게 썼는데 부모에서 구현했기에 자식의 인스펙터에서도 보이게 됩니다.
자식 추상클래스 상속
새 스크립트 EnemyOrc와 EnemyGoblin을 만들어 EnemyParent를 상속받아
빨간 줄 쳐진 부분을 Alt + Enter를 눌러 추상클래스를 구현합니다.
using UnityEngine; public class EnemyOrc : EnemyParent { protected override void Attack() { // 몸통박치기 공격 print("EnemyOrc Attack"); } protected override void Move() { // 좌우로 움직이기 print("EnemyOrc Move"); } }
using UnityEngine; public class EnemyGoblin : EnemyParent { protected override void Attack() { // 칼을 휘두르는 공격 print("EnemyGoblin Attack"); } protected override void Move() { // 상하로 움직이기 print("EnemyGoblin Move"); } }
protected override로 자식은 함수 안에 실제로 동작 할 것을 구현합니다.
Attack과 Move함수의 호출은 모두 부모의 추상클래스에서 호출했기 때문에
자식은 매우 깔끔하게 구현에만 집중하면 됩니다.
EnemyOrc 게임오브젝트를 만들고 EnemyOrc 스크립트를 넣고 Attack Interval에 1을 넣습니다.
EnemyGoblin 게임오브젝트를 만들고 EnemyGoblin스크립트를 넣고 Attack Interval에 2를 넣습니다.
재생후 Console의 Collapse를 체크해보면
Move는 업데이트 매 프레임마다 호출되고,
EnemyOrc의 Attack은 1초마다, EnemyGoblin은 2초마다 호출됨을 알 수 있습니다.
추상클래스 사용 후 느낀점
추상클래스를 사용하면 이벤트를 받는 델리게이트 체인을 보통 Start에서 등록하잖아요?
이걸 자식에게는 숨길수도 있습니다.
그리고 private 변수와 함수로 추상클래스 내에서 공통된 내부로직을 돌리고 자식에게 숨길수도 있지요.
제가 멀티 솔루션 Photon 시리즈를 거의 다뤄봤는데 왜 추상클래스로 구현해놨는지 이제 이해가 되는 거 같습니다.
역시나 추상클래스는 남용하지 말고 공통된 부분이 필요할때 사용하길 추천드립니다.
'유니티' 카테고리의 다른 글
유니티 에셋 이지세이브로 진짜 쉽게 데이터 저장 / Unity Asset Easy Save Data Save and Load (0) 2023.09.21 유니티 모바일 시뮬레이터로 다양한 해상도 대응하기 / Respond to Wide Range of Resolutions with Unity Mobile Simulator (2) 2023.09.07 유니티 함수 내에서만 사용되는 지역함수 / Unity Local Function (0) 2023.09.05 유니티 튜플 사용법 / Unity How to Use Tuple (2) 2023.09.05 유니티 반응형 UI 기초지식 / Unity How to Make Flexible Responsive UI (0) 2023.08.31