2 분 소요

Intro

이번 포스팅에서는 전략(Strategy)패턴을 활용하여 플레이어가 가진 무기에따라

무기의 동작방식(공격방식)을 변경할 수 있는 무기시스템을 설계하고, 구현하려합니다.

우선, 공격과 관련된 부분을 새롭게 바꿀것이므로 기존의 공격 클래스 Attack과 관련된 애니메이터 설정은 치워두었습니다.

설계 개요

  1. Weapon (추상 클래스)
    • 모든 무기의 기본 클래스
    • 무기에 따른 공격 전략을 설정하고, 전략에 따른 공격을 수행
  2. Concrete Weapon (예: Sword, Bow 등)
    • “Weapon” 클래스를 상속받아, 각 무기별 특징을 구현
  3. IAttackStrategy (인터페이스)
    • 공격 방식을 정의하는 인터페이스
    • 다양한 공격 전략을 클래스로 분리하여 확장 가능
  4. Concrete Attack Strategies (예: NormalAttack, SpecialAttack 등)
    • IAttackStrategy를 구현한 구체적인 공격 방식
  5. WeaponController (무기관리)
    • 현재 무기를 변경하거나, 무기의 공격 전략을 실행하는 역할

IAttackStrategy.cs

공격 전략 인터페이스입니다.

각 무기의 공격 방식이 다를 수 있으므로, 공격 전략을 인터페이스로 분리하여 유연성을 높입니다.

/*
                IAttackStrategy : 공격 전략 인터페이스
 */

public interface IAttackStrategy 
{
    void Attack();
}

NormalAttack.cs

구체적인 공격 전략입니다.

무기마다의 공격 로직을 별도의 클래스로 분리하였습니다.

/*
                NormalAttack : Concrete Attack Strategy - 기본 공격
    
 */
public class NormalAttack : IAttackStrategy
{
    // 기본 공격
    public void Attack()
    {
        Debug.Log("기본공격 수행!");
    }
}

Weapon.cs

Weapon 클래스는 공격 전략을 동적으로 변경하고, 현재 설정된 전략으로 공격을 수행합니다.

/*                  
                    Weapon : 무기 베이스 클래스
            - SetAttackStrategy() : 공격 전략을 동적으로 변경
            - PerformAttack() : 현재 설정된 전략으로 공격
 */
public abstract class Weapon : MonoBehaviour
{
    protected IAttackStrategy attackStrategy;

    // 전략 설정
    public void SetAttackStrategy(IAttackStrategy nextStrategy)
    {
        attackStrategy = nextStrategy;
    }

    // 공격 수행
    public void PerformAttack()
    {
        if(attackStrategy != null)
        {
            attackStrategy.Attack();
        }
        else
        {
            Debug.Log("공격 전략이 설정되지 않았음.");
        }
    }
}

Sword.cs

개별 무기 클래스로, 각 무기마다의 특징(기능)을 구현할 수 있습니다.

/*
                    Sword : 무기(검) 클래스
 */
public class Sword : Weapon
{
    private void Start()
    {
        // 기본 공격 전략 설정
        attackStrategy = new NormalAttack();        
    }

    public void ChargeAttack()
    {
        Debug.Log("기를 모아 공격");
    }
}

WeaponController.cs

WeaponController 클래스는 무기와 전략을 관리하는 클래스입니다.

/*
                    WeaponController : 무기 및 전략 관리

            - SetWeapon() : 현재 무기 변경
            - ChangeAttackStrategy() : 공격 전략 변경
            - Attack() : 현재 무기의 공격 실행
 */

public class WeaponController : MonoBehaviour
{
    private Weapon currentWeapon;

    // 현재 무기 세팅
    public void SetWeapon(Weapon newWeapon)
    {
        currentWeapon = newWeapon;
        Debug.Log("무기 장착");
    }

    // 공격 전략 변경
    public void ChangeAttackStrategy(IAttackStrategy newStrategy)
    {
        if(currentWeapon != null)
        {
            currentWeapon.SetAttackStrategy(newStrategy);
        }
        else
        {
            Debug.Log("무기가 장착되지 않았음");
        }
    }

    // 현재 무기 공격 실행
    public void Attack()
    {
        if(currentWeapon != null)
        {
            currentWeapon.PerformAttack();
        }
        else
        {
            Debug.Log("무기가 장착되지 않았음");
        }
    }
}

PlayerAttack.cs

테스트용으로 만든 클래스입니다.

플레이어 무기를 검으로 세팅하고 공격키 입력을통해 공격을 수행합니다.

public class PlayerAttack : MonoBehaviour
{
    [SerializeField] WeaponController weaponController;
    [SerializeField] Sword sword;
    private void Start()
    {
        weaponController.SetWeapon(sword);
    }

    private void Update()
    {
        if(Input.GetKeyDown(KeyCode.LeftControl))
        {
            weaponController.Attack();
        }
    }
}


  • 전략패턴을 활용하여 무기시스템의 큰 틀을 잡아봤습니다.

  • 아직 플레이어의 장착한 무기와의 연동, 애니메이션 등 작업이 많이 남아있습니다.

  • 다음 포스팅에서는 무기타입에 따른 애니메이션을 실행하는것을 목표로하려합니다.

댓글남기기