[ 게임 개발 ] Caster 시스템 - Damage, Knockback

2025. 3. 5. 10:28게임개발

요즘 게임 코드 구조들을 짤 때 유니티 컴포넌트 시스템을 적극 활용하여

기능분할과 깔끔한 종속성 구조를 만드는 것을 즐기고 있다.

 

그중에서 제일 실용적으로 쓸만하고 마음에 드는 구조가 이 Caster라는 놈인데

현 졸업 작품 개발에도 활용하고 있는 기능이다.

 

말은 뭐 되게 대단한 거 소개하는 뉘앙스인데 꽤 간단하다

이런 식으로 각각 물리 캐스팅을 통해 감지했던 캐스트 구조를 

 

이런 식으로 감지는 Caster가 하고 기능별로 필요한 기능은 기능 캐스터들이

감지된 Target에 대한 정보만 받아 처리하는 방식이다.

 

 

그래서 이런 식으로 Caster구조를 만들어두면

기능에 따라 깔끔하게 분할된다.

 

캐스팅 시에 기능을 추가하고 싶다면 아래에

기능 캐스터들만 추가로 달아주기만 하면 되는 것이다.

 

 

 

 

 

 


 

이제 구현을 해볼 텐데

namespace Combat
{
    public interface ICastable
    {
        public void HandleSetData(CasterData data);
        public void Cast(Collider2D target);
    }
}

우선 ICastable이라는 인터페이스를 만들어준다.

그리고 Caster로부터 Collider를 받아 기능 구현을 해주게 될 것인데

설명의 편의 상 Caster를 메인캐스터, ICasterable을 구현한 캐스터들을 기능 캐스터라 명명하겠다.

 

HandleSetData() 메서드의 경우 메인 캐스터를 경유하여 외부에서 데이터를 받는 경우를 위해 만들어둔

장치인데. 외부의 객체가 기능 캐스터들을 참조하면 종속성 구조가 망가지기 때문에 이를 만들었다.

넘어오는 데이터는 모두 CasterData 클래스를 하위 구현하여 내부에 필요한 값들을 가지고 넘어오게 된다.

그리고 받았을 때 필요에 맞는 데이터 타입으로 변환하여 사용하게 된다.

 


 

ICastable을 만들고 나서는 메인 캐스터를 만든다.

우선 Caster에 필요한 요소는 크게 두 가지인데.

 

첫 번째는 콜라이더 감지를 통해서 캐스트 할 타깃을 지정하는 부분.

두 번째는 감지된 콜라이더를 본인이 가지고 있는 기능 캐스터들로 모두 호출해 실질적인

캐스팅 기능처리를 시키는 것이다.

Caster의 캐스팅 범위와 형태의 다양화를 위해 콜라이더 감지 부분은 기능 캐스터에 콜라이더들을 넘기는 부분만 구현하고 Caster는 하위 캐스터를 구현하여 Overlap이나 형태를 다르게 구현한다.

 

캐스팅에 필수적인 타깃 레이어와 최대 캐스트 수, 오프셋들, 그리고 기능캐스터 배열을 추가해 주고.

나중에 사용할 여러 확장성을 위해 이벤트들을 미리 만들어준다.

 

물리적 감지가 아닌 외부에서 임의로 타깃을 지정하여 캐스팅할 수 있게 public으로 강제 캐스트 함수를

만들어놓고 이를 내부에서도 그냥 사용할 것이다. 그리고 앞서 설명했던 CasterData를

SendCasterData()를 통해 보내주게 된다.

 

이렇게 모두 해주었다면 하위 Caster구현은 간단하다.

그냥 주어진 값들을 통해 타깃을 감지해 주고 기능캐스터들로 넘겨주기만 하면 된다.

CircleCaster의 경우 OverlapCircle을 사용한다.

 

이를 응용하여 방향과 제한거리를 추가로 받으면 RayCast를 활용한 StraightCaster 같은 것도 만들 수 있다.


 

Projectile(발사체) 같은 곳에도 사용을 하는 부분인데. 만약 발사체가 많은 탄막게임이나 그런 비슷한 것들을 만든다면 발사체에 콜라이더를 넣기보다 이런 Caster로 Overlap을 여러 번 돌리는 게 더 가볍다.

하지만 이렇게 할 때의 문제가 존재하는데. 특정공격으로 발사체를 무력화 시키거나

충돌로직이 필요한 경우 등 발사체가 양방향으로 상호작용해야 한다면

콜라이더를 어쩔 수 없이 써야 하긴 한다.

 

발사체 얘기가 나온김에 다음에는 Caster와 비슷한 구조를 활용한 발사체 관련 코드리뷰를 해볼것인