컴포넌트, 매니저

·2023년 4월 6일
0

Unity

목록 보기
3/22

📌컴포넌트(Component)

클라이언트 : 영화를 찍는것과 유사
서버 : 본인의 식당을 운영하는것과 유사

Play상태에서 수정한것들은 다 사라진다

Component패턴

유니티의 중요한 철학
모든 코드를 부품화 한다.
큐브

빈오브젝트에 위와 같이 추가하면

동일한 큐브를 만들 수 있다.

컴포넌트 보충설명

OOP관점 클래스 설계시에
상속을 이용할 것인지 아니면 컴포넌트를 이용할 것인지 선택한다.
IS-A 관계면 상속
Has-A 관계면 컴포넌트
ex) 오크는 몬스터다(Orc Is-A Monster)
플레이어는 인벤토리를 갖고 있다(Player Has-A Inventory)

컴포넌트 : 기능들을 부품화해서, 코드의 의존성을 줄이고 재활용성을 줄인다.


📌매니저


꿀팁
컴포넌트 용도로 사용될 C#과 그냥 사용될 C#을 구분하자

1.전역을 사용하는 매니저를 만들고 싶다

Test.cs
Manager.cs
두개의 코드가 있고

Test.cs에서

Manager mg = new Manager();

하고 유니티 실행을 해보면 아래와 같은 오류가 뜬다

MonoBehaviour은 뭘까?

MonoBehaviour을 상속받아야 유니티에서 컴포넌트로 사용할 수 있다.

(부모)
Object
Component
Behaviour
MonoBehavior
(자식)
상속형태이다

오브젝트의 설명
Base class for everything attached to a GameObject.

2.설계적인 문제발생

Manager의 MonoBehaviour을 삭제하고나면 오류가 뜨지않지만 start, update는 컴포넌트로 들어가 있을때 실행되는 설계적인 문제 발생

3.설계적인 문제해결

빈 게임오브젝트에 MonoBehaviour 붙은 Manager을 넣으면 해결된다.


📌싱글톤(Singleton)


꿑팁
툴에서 그래고 드롭, UI를 클릭해서 이리저리 만드는 방식은 코드로 구현가능

유니티 브레이크 포인트 잡기

Visual Studio위에 유니티에 연결을 클릭하고 브레이크 포인트를 잡는다.
Unity에서 play하면 브레이크 포인트 잡히는걸 볼 수 있다.

싱글톤패턴

특정 클래스에 인스턴스 한개만 있기를 원할때 사용

static을 하나 만들어서 전역으로 사용할거 만듬

//Manager.cs
static Managers Instance; //유일성이 보장된다.
public static Managers GetInstance() { return Instance; } //유일한매니저를 갖고온다

//누군가는 가지고 와야한다
    void Start()
    {
        Instance = this;
    }

문제1 발생

하지만 여기서 @Managers1,2,3,4 이렇게 여러개 있을경우 위와 같이 쓰면 자기 자신이 왕이라고 서로 덮어쓰는 문제가 생겨난다.

문제1 해결

   void Start()
    {
        GameObject go = GameObject.Find("@Managers");
        Instance = go.GetComponent<Managers>();
    }

이렇게 쓴다면 @Managers1,2,3,4 있더라도 @Managers만 받아오기 때문에 덮어쓰는 문제 해결

외부에서사용할때는 GetInstance()로 가져와서 사용한다.

//Player.cs
    void Start()
    {
        Managers mg = Managers.GetInstance();
    }

문제2 발생

여기서 게임 오브젝트에 @Managers가 없다면 받아오는 mg의 값은 null이 되서 사용하려면 오류가 난다.

문제2 해결

  static void Init()
    {
        if (s_Instance == null)
        {
            GameObject go = GameObject.Find("@Managers");
            if(go == null)
            {
                go = new GameObject { name = "@Managers" };
                go.AddComponent<Managers>();

            }

            DontDestroyOnLoad(go); //삭제되지 않게 막아줌?
            s_Instance = go.GetComponent<Managers>();
        }
    }
}

이런식으로 Init를 만들어서 Instance가 null이라면 @Managers를 찾아서 없다면 게임 오브젝트를 만들어서 Managers 컴포넌트를 추가해준다.

전체코드

Manager.cs

public class Managers : MonoBehaviour
{

    static Managers s_Instance; //유일성이 보장된다.
    public static Managers Instance { get { Init();  return s_Instance; } }

    // Start is called before the first frame update
    void Start()
    {
        Init();
    }

    // Update is called once per frame
    void Update()
    {

    }

    static void Init()
    {
        if (s_Instance == null)
        {
            GameObject go = GameObject.Find("@Managers");
            if(go == null)
            {
                go = new GameObject { name = "@Managers" };
                go.AddComponent<Managers>();

            }

            DontDestroyOnLoad(go); //삭제되지 않게 막아줌?
            s_Instance = go.GetComponent<Managers>();
        }
    }
}

Player.cs

public class Player : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Managers mg = Managers.Instance;
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

참고자료


Part3: 유니티 엔진
섹션 1.유니티기초

컴포넌트 보충설명

profile
개인공부저장용(하루의 기록)

0개의 댓글