1 분 소요

Intro

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

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

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

설계 개요

  1. Weapon (추상 클래스)
    • 모든 무기의 기본 클래스
    • 플레이어 무기에 따른 공격
  2. Concrete Strategy (예: Sword, Bow 등)
    • “Weapon” 클래스를 상속받아, 각 무기별 공격을 구현
  3. WeaponManager (무기관리)
    • 플레이어가 착용중인 장비에맞춰 무기세팅
    • 무기별 애니메이션 적용

Weapon.cs

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

/*                  
                    Weapon : 무기 베이스 클래스
            - Attack() : 현재 무기로 공격
 */
public abstract class Weapon : MonoBehaviour
{
    public WeaponType type;

    // 데미지 등
    public abstract void Attack();

    protected abstract void OnTriggerEnter(Collider other);
  
    // 공격 판정 On/Off
    public abstract void SetHitBox(bool isEnabled);
}

Sword.cs

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

/*
                    Sword : 무기(검) 클래스
 */
public class Sword : Weapon
{
    // 공격 데미지 등
    public override void Attack()
    {
        Debug.Log("기본공격 수행!");
    }

    protected override void OnTriggerEnter(Collider other)
    {
        
    }

    public override void SetHitBox(bool isEnabled)
    {

    }
}
  • 콜라이더를 On/Off 하여 애니메이션 이벤트를통해 공격판정을 구현할것입니다.

WeaponManager.cs

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

/*
                    WeaponManager : 무기전략 및 무기별 애니메이션 설정

            - SetWeapon() : 현재 무기 설정
 */
public class WeaponManager : MonoBehaviour
{
    private Weapon currentWeapon;

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

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

PlayerAttack.cs

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

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

public class PlayerAttack : MonoBehaviour
{
    [SerializeField] WeaponManager weaponManager;
    [SerializeField] Sword sword;

    private void Start()
    {
        weaponManager.SetWeapon(sword);
    }

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


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

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

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

image

댓글남기기