Unity C# 빌더 패턴으로 동적 게임 캐릭터 생성하기

개념

복잡한 객체의 생성 과정과 최종 표현을 분리하여, 동일한 생성 절차로 다양한 형태의 객체를 만들 수 있게 하는 설계 패턴입니다.

구성 요소

  • Builder: 객체의 각 부분을 생성하는 추상 인터페이스
  • ConcreteBuilder: Builder를 구현하여 실제 부품 조립 로직 처리
  • Director: Builder를 활용해 객체 생성 순서와 과정 관리
  • Product: 최종적으로 생성되는 복합 객체

Unity 구현 예시

최종 생성물 - Hero 클래스

using UnityEngine;

public class Hero
{
    public string Name { get; set; }
    public string Armor { get; set; }
    public string Weapon { get; set; }
    public string Skill { get; set; }

    public void DisplayInfo()
    {
        Debug.Log($"[{Name}] 장비: {Armor}, 무기: {Weapon}, 스킬: {Skill}");
    }
}

추상 빌더

public abstract class HeroFabricator
{
    protected Hero hero;

    public abstract void ForgeName();
    public abstract void ForgeArmor();
    public abstract void ForgeWeapon();
    public abstract void ForgeSkill();
    
    public Hero DeliverHero()
    {
        return hero;
    }
}

구체 빌더 - 전사 생성

using UnityEngine;

public class WarriorFabricator : HeroFabricator
{
    public WarriorFabricator()
    {
        hero = new Hero();
    }

    public override void ForgeName()
    {
        hero.Name = "붉은 전사";
    }

    public override void ForgeArmor()
    {
        hero.Armor = "플레이트 아머";
        Debug.Log("중갑을 제작합니다.");
    }

    public override void ForgeWeapon()
    {
        hero.Weapon = "대검";
        Debug.Log("양손 대검을 제작합니다.");
    }

    public override void ForgeSkill()
    {
        hero.Skill = "광폭화";
        Debug.Log("근접 전투 스킬을 습득합니다.");
    }
}

감독자 - 조립 순서 관리

using UnityEngine;

public class HeroForgeMaster
{
    public void Manufacture(HeroFabricator fabricator)
    {
        Debug.Log("=== 영웅 단조 시작 ===");
        fabricator.ForgeName();
        fabricator.ForgeArmor();
        fabricator.ForgeWeapon();
        fabricator.ForgeSkill();
        Debug.Log("=== 단조 완료 ===");
    }
}

클라이언트 실행

using UnityEngine;

public class HeroSpawnManager : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.H))
        {
            SpawnWarrior();
        }
    }

    void SpawnWarrior()
    {
        HeroFabricator fabricator = new WarriorFabricator();
        HeroForgeMaster master = new HeroForgeMaster();
        
        master.Manufacture(fabricator);
        
        Hero completedHero = fabricator.DeliverHero();
        completedHero.DisplayInfo();
    }
}

확장 - 마법사 빌더 추가

using UnityEngine;

public class MageFabricator : HeroFabricator
{
    public MageFabricator()
    {
        hero = new Hero();
    }

    public override void ForgeName()
    {
        hero.Name = "신비의 마법사";
    }

    public override void ForgeArmor()
    {
        hero.Armor = "로브";
        Debug.Log("마법 로브를 제작합니다.");
    }

    public override void ForgeWeapon()
    {
        hero.Weapon = "마법 지팡이";
        Debug.Log("원소 지팡이를 제작합니다.");
    }

    public override void ForgeSkill()
    {
        hero.Skill = "隕石 낙하";
        Debug.Log("파괴 마법을 습득합니다.");
    }
}

활용 장점

  • 복잡한 객체의 생성 단계를 체계적으로 분리
  • 같은 조립 과정으로 서로 다른 캐릭터 유형 생성 가능
  • 새로운 캐릭터 타입 추가 시 기존 코드 수정 없이 빌더만 확장
  • Unity 에디터에서 ScriptableObject와 결합해 데이터 기반 설계에 활용

태그: Unity C# Builder Pattern Game Development Design Pattern

7월 28일 21:34에 게시됨