유니티 RPG - 34. 전략패턴을 활용한 플레이어 무기시스템 설계
Intro
이번 포스팅에서는 전략(Strategy)패턴을 활용하여 플레이어가 가진 무기에따라
무기의 동작방식(공격방식)을 변경할 수 있는 무기시스템을 설계하고, 구현하려합니다.
우선, 공격과 관련된 부분을 새롭게 바꿀것이므로 기존의 공격 클래스 Attack과 관련된 애니메이터 설정은 미뤄두었습니다.
설계 개요
- Weapon (추상 클래스)
- 모든 무기의 기본 클래스
- 플레이어 무기에 따른 공격
- Concrete Strategy (예: Sword, Bow 등)
- “Weapon” 클래스를 상속받아, 각 무기별 공격을 구현
- 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();
}
}
}
-
전략패턴을 활용하여 무기시스템의 큰 틀을 잡아봤습니다.
-
아직 플레이어의 장착한 무기와의 연동, 애니메이션 등 작업이 많이 남아있습니다.
-
다음 포스팅에서는 무기타입에 따른 애니메이션을 실행하는것을 목표로하려합니다.
댓글남기기