내용에 대해 알기 전에 일단 기초적인 new 키워드를 통해 인스턴스 하나를 생성해봅시다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
void Start()
{
Managers mg = new Managers(); //단순히 인스턴스 생성만 하였다.
}
void Update()
{
}
}
스크립트를 플레이어에 붙여서 실행해 보겠습니다.

[경고]
'new' 키워드를 사용하여 MonoBehaviour를 생성하려고 합니다. 이것은 허용되지 않습니다.
MonoBehaviour는 AddComponent()를 통해서만 추가할 수 있습니다.
또는 스크립트가 ScriptableObject에서 상속하거나 기본 클래스를 전혀 상속하지 않을 수 있습니다.
그저 C#에서 하듯 인스턴스 하나 생성했을 뿐인데 MonoBehaviour를 상속받은 클래스의 인스턴스를 만들지 말아달라고 경고가 날아옵니다.😥
이 경고가 의미하는 바는 Managers클래스는 MonoBehaviour를 상속받았기 때문에 new를 통한 인스턴스 생성을 하지 말고 다른 방법(AddComponent())을 사용하라는 이야기입니다.
우리가 C#을 공부할땐
C# 콘솔 프로젝트를 만들고 => 클래스를 작성하고 => 메인 함수에 클래스의 인스턴스를 생성하여 => 해당 인스턴스 안에 있는 멤버함수를 사용하는 방식으로 만들었습니다.
하지만 유니티에서는 컴포넌트로 만들 클래스에 MonoBehaviour를 상속하고 이렇게 만든 스크립트 컴포넌트를 게임오브젝트에 연결하여 작동시킵니다.
MonoBehaviour는 기본 스크립트를 생성하면 기본적으로 상속되어 있는 클래스입니다.
기본적으로 상속되어있는만큼 유니티는 이 MonoBehaviour에 컴포넌트에 필요한 기본 기능을 담아서 제공합니다.
다시 말하자면 이 MonoBehaviour를 상속받아야만 컴포넌트로써의 기능을 쓸 수 있는 것입니다.

클래스는 MonoBehaviour를 상속받음으로써
(참고로 MonoBehaviour는
Object => Component => Behavior => MonoBehaviour 순서로 부모 객체를 상속받았습니다.)
new를 이용하여 인스턴스를 생성할 수 없는 MonoBehaviour를 상속받은 컴포넌트들은 어떻게 동작시킬까?
=> 컴포넌트를 게임오브젝트에 연결하여 작동시킨다.
컴포넌트들은 외부의 간섭을 받지 않는 독립적인 부품들인데 외부에서 컴포넌트들이 수행할 기능을 어떻게 알아차릴 것인가?
=> 메시지를 브로드 캐스트 방식으로 전달하여 이벤트 함수를 동작시킨다.(다음 포스트에서 배움)
사실 처음으로 하려던 것은 그저 클래스의 인스턴스를 생성해서 써먹으려는 것인데 이야기가 길어졌습니다.
Player 객체를 생성하는것은 MonoBehaviour 때문에 불가능 하므로 플레이어 컴포넌트를 가져와야 합니다.
다음 방법들은 Player 게임오브젝트에 연결된 Player 스크립트 컴포넌트를 찾아오는 방법들입니다.
public class FindObject : MonoBehaviour
{
void Start()
{
Player player = FindObjectOfType<Player>();
player.Attack();
}
}
public class FindObject : MonoBehaviour
{
void Start()
{
Player player = GameObject.Find("Player").GetComponent<Player>();
player.Attack();
}
}

public class FindObject : MonoBehaviour
{
public GameObject player;
void Start()
{
player = GameObject.FindWithTag("Player");
player.GetComponent<Player>().Attack();
}
}

public class FindObject : MonoBehaviour
{
public GameObject player;
void Start()
{
player.GetComponent<Player>().Attack();
}
}
public class UIManager : Singleton<UIManager> //싱글톤 상속
{
void Start() { }
void Update() { }
public void Print()
{
//ex)UI매니저에서 해야할 일
}
}
▲ 플레이어 클래스에 인스턴스를 알아올수있도록 설정한다
public class Player : MonoBehaviour
{
void Start()
{
UIManager UM = UIManager.Instance;
UM.Print();
}
}