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