유니티 - 매니저(Manager)

2023. 1. 3. 00:40유니티/기능

객체 지향에서는 각각의 클래스가 독립되어야 한다.

한 가지 클래스에서 여러가지 기능을 추가하게 되면 추후 수정 시 힘들어질 수 있다.

 

명령을 수행하는 클래스를 컨트롤러(Controller)하며

컨트롤러에 명령을 내리도록 요청하는 클래스를  매니저 (Manager) 라고 한다.

컨트롤러 간의 상호작용은 매니저를 통해서 이루어지게 된다.

 

매니저는 한 가지 매니저가 여러개가 생성되지 않게 하기 위해 싱글톤을 사용한다.

만약 한 가지 매니저가 여러개 생성 된다면, 한 번 요청에 두 번의 명령 수행이 이루어질 수도 있다.

 

간단한 예제를 기록하겠다.

중요한 것은 매니저의 사용이기 때문에, 오브젝트는 간단하게 만들겠다.

 

public class Object : MonoBehaviour
{
    private int hp;
    private int damage;
    
    public int GetDamage(int _damage)
    {
        this.hp -= _damage;
        
        // ** 남은 체력을 로그에 남긴다.
        Debug.Log("남은 체력 : " + hp);
        
        // ** hp를 반환시킨다.
        return hp;
    }
}

public class Player : Object
{
    private void start()
    {
        hp = 100;
        damage = 10;
    }
}

public class Enemy : Object
{
    private void start()
    {
        hp = 20;
        damage = 2;
    }
}

 

 

오브젝트 A 와 B 가 있으며, 둘은 각각의 체력과 공격력을 가지고 있다.

부모 클래스에서는 데미지를 받을 수 있게 함수를 만들었다.

 

이 둘 간에 데미지를 주도록 명령을 내릴 데미지 매니저를 추가한다.

public class DamageManager() : MonoBehaviour
{
    // ** 싱글톤 인스턴스
    private static instance;
    
    public DamageManager Instance
    {
        get
        {
            if (instance == null)
                instance = this;
            
            return instance;
        }
    }
    
    // ** 데미지를 받을 타겟과, 적용할 데미지를 매개변수로 받는다.
    public int GiveDamage(GameObject _target, int _damage)
    {
        if (target != null)
            target.GetDamage(_damage);
    }
}

 

이제 각 컨트롤러에서 매니저 인스턴스를 받아와서 함수를 호출해주면 데미지를 넣을 수 있다.

 

public class Player : Object
{
    private void Start()
    {
        hp = 100;
        damage = 10;
    }
    
    private void Update()
    {    
        // ** 좌클릭 시 실행
        if (Input.GetMouseButton(0))
        {
            // ** 데미지를 줄 적 탐색.
            // ** 코드는 임시로 대충 사용하였다.
            GameObject enemy = GameObject.Find("Enemy");
            
            // ** 매니저 인스턴스에서 데미지 입히기 함수를 호출 
            DamageManager.instance.GiveDamage(enemy, damage);
        }
    }
}

// ** 프로그램 실행 후, 좌클릭 입력 시
// 남은 체력 : 15
// 남은 체력 : 10
// 남은 체력 : 5
// ...