내배캠 유니티 입문 팀프로젝트를 하는 중, 아이템에 대한 구현내용이 있었다.
팀원과 내가 아이템을 두가지 종류로 따로 만들어 합쳐야하는 상황이 왔다. 서로 구현 방향이 너무 달랐다.
- 내 구현 방식
- 아이템 abstract class를 만들고 이를 상속받는 각 아이템을 만들었다.
- 팀원의 구현 방식
- 아이템이 ItemType enum을 들고 있고, 플레이어에 부딪혔을 때 그에 맞춰서 효과를 적용하려고 했다.
둘 다 문제점이 명확하다. 내 구현방식이면 아이템이 생성될 때마다 프리팹을 만들어줘야하고 풀도 계속 늘려야한다. 얘도 확장에 열린듯 닫힌듯 하다
팀원의 구현방식이면 아이템을 만들 때마다 프리팹을 만들지 않아도되고, 풀도 늘려야하는 이유는 없지만, 아이템이 늘어날 때마다 swich 문에 케이스를 늘려줘야한다. 확장에 닫혀있으며 플레이어 패들에서 아이템 적용 효과를 전부 관리해야하니 단일 책임 원칙도 위반한다.
문득 생각나는게 있었다.
커맨드패턴..!
커맨드 패턴을 사용하면 런타임에 아이템에 행동을 붙여줄 수 있으니 굳이 프리팹을 따로 만들지 않아도되고, 플레이어 패들에서 swich문으로 행동을 나누어 주지 않아도 된다..!
완전히 합치는 일은 팀원에게 맡겨서 내 의견을 받아드렸을지는 모르겠지만 나는 아래와 같이 제안했다.
public interface IItemAffect
{
void Affect(GameObject target);
void EndEffect();
}
public class TimeControllItemEffect : IItemAffect
{
public void Affect(GameObject target)
{
// 시간 속도를 제어하기
// 몇초후 endeffect를 불러 시간이 돌아오도록 함
}
public void EndEffect(){}
}
public class ScreenControllEffect : IItemAffect
{
public void Affect(GameObject target)
{
// 스크린을 가리는 ui 부르기
// 몇초후 endeffect를 불러 ui가 닫히도록 함
}
public void EndEffect(){}
}
public class PaddleLongEffect : IItemAffect
{
public void Affect(GameObject target)
{
//target으로부터 패들을 늘리는 함수 실행
// 몇초후 endeffect를 불러 효과가 종료되도록 함
}
public void EndEffect(){}
}
public class Item : MonoBehaviour
{
public IItemAffect ItemEffect { get;private set; }
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.CompareTag("Player"))
{
gameObject.SetActive(false);
ItemEffect.Affect(collision.gameObject);
}
}
}
- 이렇게 커맨드 패턴을 활용해서 구현하게 되면, 런타임에 스프라이트, 행동, 기타등등을 설정해주면 되니 프리팹을 따로 여러개 만들 필요도 없고 패들에서의 지저분한 swich문의 사용도 막을 수 있다!
- 아이템의 효과 적용도 아이템이 직접하니 단일 책임 원칙도 지킬 수 있을 것으로 보인다
- 단점은 코드가 길어진다..
- 아이탬을 생성할때 쓰는 switch문은 막을 수 없을 것 같다. 이는 빌드패턴으로 해결이 가능할 것 같지만 아직 거기까지 책을 안읽었다..!
'Develop_Log' 카테고리의 다른 글
[ScriptableObject Loader] Excel에서 SO로 만들기 (0) | 2024.11.24 |
---|---|
[팀플젝 회고] 유니티 심화주차 (0) | 2024.11.22 |
유닛 스텟에 빌더패턴 적용 (1) | 2024.10.25 |
[TrobleShooting] ww로 달리기 구현 (0) | 2024.10.24 |
유니티 입문 주차 회고 (2) | 2024.10.22 |