Unity/Design pattern for Unity

strategy pattern _ 스트래티지 패턴 [전략 패턴]

minquu 2022. 12. 31. 18:02
반응형

☝스트래티지 패턴이란?

 - 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여,

    객체의 행위를 동적으로 바꾸고 싶을 경우 직접 수정하지 않고, 잔략 클래스를 바꿔주기만 함으로 써, 행위를 유연하게        확장하는 방법

 

 

즉, 객체가 할 수 있는 행위들을 전략으로 만들고, 만약 수정이 필요한 경우 전략 클래스만 바꿈으로서 수정이 용이하게 함

 

---

 

인터페이스 제작 

// IWeapon 인터페이스
// Shoot();
public interface IWeapon
{
    void Shoot();
}

IWeapon 이라는 인터페이스가 있음, 

Shoot() 메서드를 구현해야함

 

 

인터페이스 접근점 제작

public class MyWeapon
{

    // 접근점
    private IWeapon weapon;


    public void SetWeapon(IWeapon weapon)
    {
        this.weapon = weapon;
    }

    public void Shoot()
    {
        weapon.Shoot();
    }
}

 

MyWeapon 클래스에서

IWeapon 인터페이스 변수를 지정해줌

 

SetWeapon(IWeapon weapon)으로 인터페이스를 받아서 IWeapon 인터페이스 변수에 넣어줌

SetWeapon 를 통해서 MyWeapon 클래스에 weapon를 바꿔줌

 

Shoot() 를 호출해주면

자신이 가지고있는 인터페이스 IWeapon의 Shoot() 메서드를 호출 해 줌 

 

 

인터페이스 구현한 클래스 제작

 

using UnityEngine;

public class Missile : IWeapon
{
    public void Shoot()
    {
        Debug.Log("미사일이 발사 되었습니다.");
    }
}

 

using UnityEngine;

public class Bullet : IWeapon
{
    public void Shoot()
    {
        Debug.Log("총알이 발사 되었습니다.");
    }
}

 

using UnityEngine;

public class Arrow : IWeapon
{
    public void Shoot()
    {
        Debug.Log("화살이 발사 되었습니다!");
    }
}

 

각각 무기 개념의 클래스를 만들어 주었음.

전부 IWeapon 인터페이스를 구현하고 있음

Shoot() 메서드를 호출하면 각 무기의 맞는 로그가 출력 됨

 

 

관리 및 호출 담당 클래스 (매니저) 제작

 

using UnityEngine;

public class WeaponManager : MonoBehaviour
{
    MyWeapon myWeapon;

    private void Start()
    {
        myWeapon = new MyWeapon();
    }

    public void ChangeBullet()
    {
        myWeapon.SetWeapon(new Bullet());
    }
    public void ChangeMissile()
    {
        myWeapon.SetWeapon(new Missile());
    }

    public void ChangeArrow()
    {
        myWeapon.SetWeapon(new Arrow());
    }

    public void Fire()
    {
        myWeapon.Shoot();   
    }
}

 

Start 시 Myweapon 인스턴스 해줌

 

ChangeBullet(), ChangeMissile(), ChangeArrow() 를 호출 시 myWeapon의 SetWeapon 메서드를 호출하면서

각 무기 클래스를 파라미터로 보내줍니다.

 

즉,  IWeapon 파라미터로 넘겨주면서 MyWeapon 클래스의 IWeapon 변수에 파라미터로 넘어온 클래스의 인터페이스가 들어갑니다.

 

Fire() 호출 시 myWeapon의 IWeapon 변수의 Shoot()이 호출 됩니다.

 

---

 

유니티

 

빈 오브젝트를 만들어서 WeaponManager.cs 를 넣어줍니다.

그리고 4개의 버튼을 만들어 줍니다.

 

 

각 버튼에 WeaponManager를 OnClick 이벤트에 넣고, 버튼에게 맞는 함수를 호출해줍니다.

 

 

마지막 Fire 버튼은 Fire 함수를 호출해줍니다

 

이런 결과물이 나오게 된다.

 

----

 

📃 정리

 만약 무기가 바뀌게 되고, 무기 클래스만 바꿔주면 된다. Fire()를 호출하기만 하면 어떤 무기가 바뀌어도 IWeapon 인터페이스를 구현하고 있으면 작동하게 된다.

반응형