디지털 양피지/Unity3D2015. 2. 17. 13:27


일반적으로 Singleton이라 불리우는 객체는 Singleton Pattern을 따르는 객체로 오직 하나의 Instance 만을 허용하는 class 를 말한다. 이러한 객체는 관리하기 쉽고 동기화 문제의 발생을 줄이지만 여러 쓰레드에서 접근할 경우 반드시 동기화 문제를 해결해야 한다. 아래는 Unity3D에서 사용하기 위한 Singleton 예제이다.


public sealed class GameData {


private static volatile GameData uniqueInstance;

private static object _lock = new System.Object();

// 생성자를 private로 만들어 외부에서 생성하지 못하도록 만든다.

private GameData(){

}

public static GameData Instance {

get{

lock(_lock){

if(uniqueInstance == null){

uniqueInstance = new GameData();

}

}

return uniqueInstance;

}

}

}


==> 일반적으로 싱글톤 클래스를 만드는 방법과 동일하다. 생성자를 private 로 선언하고 자신의 객체를 외부에서 접근할 수 있도록 static 멤버 변수와 함수로 만들어 객체에 접근 할 수 있도록 한다.


==> 위의 예제에서는 singleton 객체를 상속 받을 수 없도록 sealed 한정자를 사용하였다. 더 좋은 방법은 Singleton Templete을 만들어 사용하거나 Base class를 만들어 사용하면 좋다.


==> uniqueInstace 변수를 volatile 로 선언을 하고 다시 lock으로 동기화 하고 있는데 중복으로 volatile 한정자는 필요 없어 보인다.


==> C#에서는 함수를 override 할때도 virtual과 override 한정자를 사용해야 한다. 그렇지 않으면 부모의 함수가 그냥 불리운다. 부모 클래스에서는 자식 클래스에서 재정의 할 함수에 대해 virtual 한정자를 써주고, 자식 클래스에서는 변경할 함수에 override 한정자를 작성해 주어야 한다.


==> Animation Window에서는 Event를 추가할 수 있는데 override한 메소드는 보이지 않는다. 이럴때는 Animation Window에서 보일수 있도록 임의의 함수를 만들고 그 함수를 콜 할 수 있도록 한다.


==>여러 Scene에서 사용할 경우 DontDestroyOnLoad를 통하여 Destroy 되지 않도록 하면 계속 사용할 수있다.


Posted by 빨간 양말