어떤 곳에서든 전역 접근 가능하도록 만드는 것
public class CharacterManager : MonoBehaviour
{
private static CharacterManager instance;
public static CharacterManager Instance
{
get
{
if (instance == null)
{
instance = new GameObject("CharacterManager").AddComponent<CharacterManager>();
}
return instance;
}
}
public void Awake()
{
if(instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(this);
}
}
}

Manager 스크립트에 프로퍼티 선언 (캡슐화, 접근 제한을 위해)

해당 스크립트에서 CharacterManager.Instance.Player = this; 를 이용하여 Player 오브젝트를 CharacterManager에 등록.
다른 스크립트에서 Player의 내용을 참조할 수 있게 된다.
메서드 체이닝
instance = new GameObject("CharacterManager").AddComponent<CharacterManager>();
intance에 오브젝트를 만들고 CharacteManager(현재 컴포넌트)를 할당한다.
이렇게 연속적인 메서드를 실행시키는 구조를 메서드 체이닝이라고 한다.
※ 기본적으로 모든 스크립트는 오브젝트에 있어야 실행해야 되는데 위 방어코드 같은 경우는 오브젝트가 없는 상태에서 실행되야 하기 때문에 모순 같아 보인다.
이러한 코드가 실행 가능한 이유는 CharacterManager.Instance.Player = this;처럼 다른 오브젝트에서 Instance를 호출하면 CharacterManager의 instance가 생성되기 때문이다.