첫 번째 예제에서는 Ninja
클래스의 기본 구조를 확인한다.
public class Ninja : MonoBehaviour
{
public string ninjaName;
public bool isKing;
void Update()
{
Debug.Log("My Name: " + ninjaName);
}
}
ninjaName
은 닌자의 이름을 저장한다.isKing
은 해당 닌자가 '왕'인지 아닌지를 판별한다.Update
메서드는 매 프레임마다 닌자의 이름을 콘솔에 출력한다.public class Ninja : MonoBehaviour
{
public static Ninja ninjaKing;
public string ninjaName;
public bool isKing;
void Start()
{
if(isKing)
{
ninjaKing = this;
}
}
void Update()
{
Debug.Log("My Name: " + ninjaName + ", Ninja King is " + ninjaKing);
}
}
public static Ninja ninjaKing
: 이 부분은 싱글톤 패턴의 핵심이다. static 키워드를 통해 클래스 레벨에서 단 하나의 Ninja
객체를 저장한다.Start()
메서드에서 isKing
이 true
일 경우, 해당 Ninja
인스턴스를 ninjaKing
에 저장한다. 이로써 단 하나의 '왕' 닌자만이 ninjaKing
에 할당되게 된다.Update()
메서드에서는 현재 닌자의 이름과 '왕' 닌자를 출력한다. 여기서 '왕' 닌자는 ninjaKing
변수에 저장된 닌자이다.public class ScoreManager : MonoBehaviour
{
private int score = 0;
public int GetScore()
{
return score;
}
public void AddScore(int newScore)
{
score = score + newScore;
}
}
이 코드는 점수를 관리하는 기본 클래스를 보여준다. 여기에는 점수를 가져오고 추가하는 메서드가 있다.
public class ScoreAdder : MonoBehaviour
{
public ScoreManager scoreManager;
void Update()
{
if(Input.GetMouseButtonDown(0))
{
scoreManager.AddScore(5);
Debug.Log(scoreManager.GetScore());
}
}
}
public class ScoreSubtractor : MonoBehaviour
{
public ScoreManager scoreManager;
void Update()
{
if(Input.GetMouseButtonDown(1))
{
scoreManager.AddScore(-2);
Debug.Log(scoreManager.GetScore());
}
}
}
이 코드에서는 마우스 버튼을 사용하여 점수를 추가하거나 감소시킨다. 각 객체는 ScoreManager
인스턴스를 참조해야 한다.
public class ScoreManager : MonoBehaviour
{
public static ScoreManager instance;
private int score = 0;
void Awake()
{
instance = this;
}
public int GetScore()
{
return score;
}
public void AddScore(int newScore)
{
score = score + newScore;
}
}
이 코드는 싱글톤 패턴을 적용한 점수 관리자를 보여준다. static
변수 instance
를 사용하여 전역에서 접근할 수 있는 단일 인스턴스를 제공한다.
public class ScoreAdder : MonoBehaviour
{
void Update()
{
if(Input.GetMouseButtonDown(0))
{
ScoreManager.instance.AddScore(5);
Debug.Log(ScoreManager.instance.GetScore());
}
}
}
이 코드에서는 ScoreManager.instance
를 통해 직접 점수를 추가하고 출력한다. 이로 인해 ScoreManager
인스턴스를 매번 참조할 필요가 없다.
public class ScoreManager : MonoBehaviour
{
public static ScoreManager GetInstance()
{
if (instance == null)
{
instance = FindObjectOfType<ScoreManager>();
}
return instance;
}
private static ScoreManager instance;
private int score = 0;
void Awake()
{
instance = this;
}
public int GetScore()
{
return score;
}
public void AddScore(int newScore)
{
score = score + newScore;
}
}
public static ScoreManager GetInstance()
: 이 메서드는 싱글톤 객체를 반환한다. 이 메서드를 통해 외부에서 싱글톤 객체에 접근할 수 있다.if (instance == null)
: instance
변수가 null
인지 확인한다. null
이라면 FindObjectOfType<ScoreManager>()
를 사용하여 ScoreManager
객체를 찾는다.private static ScoreManager instance;
: 싱글톤 객체를 저장할 static
변수이다.public class ScoreAdder : MonoBehaviour
{
void Update()
{
if(Input.GetMouseButtonDown(0))
{
ScoreManager.GetInstance().AddScore(5);
Debug.Log(ScoreManager.GetInstance().GetScore());
}
}
}
ScoreManager.GetInstance().AddScore(5);
: GetInstance
메서드를 사용하여 싱글톤 객체에 접근하고, 점수를 추가한다.Debug.Log(ScoreManager.GetInstance().GetScore());
: 마찬가지로 GetInstance
메서드를 사용하여 싱글톤 객체의 현재 점수를 출력한다.지연 생성은 객체가 실제로 필요한 시점까지 그 생성을 지연시키는 프로그래밍 패턴이다. 이 패턴은 초기 시스템 부하를 줄이고, 필요하지 않은 객체가 메모리를 차지하는 것을 방지하여, 성능을 향상시킬 수 있다.
public class ScoreManager : MonoBehaviour
{
public static ScoreManager GetInstance()
{
if (instance == null)
{
instance = FindObjectOfType<ScoreManager>();
if(instance == null)
{
GameObject container = new GameObject("Score Manager");
instance = container.AddComponent<ScoreManager>();
}
}
return instance;
}
private static ScoreManager instance;
private int score = 0;
void Awake()
{
instance = this;
}
public int GetScore()
{
return score;
}
public void AddScore(int newScore)
{
score = score + newScore;
}
}
if(instance == null)
: FindObjectOfType
를 통해 싱글톤 객체를 찾지 못했다면, 새로운 게임 오브젝트를 생성하고 ScoreManager
컴포넌트를 추가한다.GameObject container = new GameObject("Score Manager");
: 새로운 게임 오브젝트를 생성한다.instance = container.AddComponent<ScoreManager>();
: 새로 생성한 게임 오브젝트에 ScoreManager
컴포넌트를 추가하고, instance
변수에 할당한다.