전략 패턴
여러 가지로 사용해볼수도 있는데 같은 동작을 분류 할때 사용된다
예시를 들어보자면 텍스트 적을때 한국어 인지 외국어인지 등등 또는
플레이어가 공격하는데 검, 단검, 도끼, 활, 총, 지팡이 등등 으로 공격한다면 이걸 if나 switch로 구분해줘야한다
거기에 따라 사운드 모션 다양해지는데 이걸 묶어서 하나의 패턴으로 플레이어 상태에 따라 지정해서
보여주는 패턴이다.
그래서 결국 공격한다는 비슷한 동작을 하지만 구현된건 다른 전략들을 공통의 인터페이스로 상속받아서
각각 클래스로 구현하고 동적으로 보여주는 패턴이다.
설명만 보면 상태 패턴이나 FSM이랑 비슷해보이는데 한번 구조를 보면서 이야기 시작해보겠다.
전략 패턴 구조
보면 Styategy에 execute()을 실행하면 거기에 맞는 Styategy를 돌려준다.
코드로 보자면
먼저 Iweapon.cs 를 만들어준다.
그후에 상속 받을 무기들을 만들어준다 간단하게 예시로 만들기위해서 2개만 만든다.
using UnityEngine;
public interface IWeapon
{
void AttackWeapon();
}
Knife.cs
using UnityEngine;
public class Knife : IWeapon
{
public void AttackWeapon()
{
Debug.Log("Attack Knife");
}
}
Dagger.cs
using UnityEngine;
public class Dagger : IWeapon
{
public void AttackWeapon()
{
Debug.Log("Attack Dagger");
}
}
그리고 내가 가진 무기를 저장하고 관리해줄 클래스를 만들어주자
PlayerController 에서 해도 괜찮지만 여기선 간단하게 하기위해
MyWeapon.cs 으로 만들었다.
using UnityEngine;
public class MyWeapon : MonoBehaviour
{
private IWeapon weapon;
public void SetWeapon(IWeapon weapon)
{
Debug.Log($"SetWeapon {weapon.ToString()}");
this.weapon = weapon;
}
public void AttackWeapon()
{
weapon.AttackWeapon();
}
private void Start()
{
SetWeapon(new Knife());
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
SetWeapon(new Knife());
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
SetWeapon(new Dagger());
}
if (Input.GetKeyDown(KeyCode.A))
{
AttackWeapon();
}
}
}
기본 무기를 Start 에 Knife로 셋팅하고
1 2 눌러서 무기 교체 하고 A로 어택 하는방식이다.
간단하게 구현했지만 무기에 MonoBehaviour 같이 상속받아서 구현하고싶은 행동을 구현해도 괜찮다.
예시
using UnityEngine;
public class Knife : MonoBehaviour, IWeapon
{
public void AttackWeapon()
{
Debug.Log("Attack Knife");
}
private void Start()
{
// ...
}
private void Update()
{
// ...
}
}
결과
유니티로 가서 MyWeapon.cs 를 오브젝트 하나 생성해서 넣고 실행후 키입력을해보자.