본문 바로가기

-----Unity 3d----/Tips

클래스(class)간의 정보 공유

  들어가며...

 

일반적으로 A라는 클래스의 변수 또는 메소드에 public으로 선언해두고, B라는 클래스에 new 연산자를 이용하여 A 객체와 그 인스턴스를 만들어 사용을 하는데. 유니티에서는 .GetComponent<Class Name>() 을 사용하는 것을 추천하고 있다. 

 

그 이유는 MonoBehaviour클래스를 상속 받은 클래스의 경우 new 연산자로 인스턴스를 만들게 되면, 유니티에서 불규칙적으로 생성자를 여러번 호출하기 때문이라고 한다 (심지어 Editor mode에서도 호출한다.).

 

그래서 유니티에서는 생성자에서 초기화하지 않고, Override된 Awake나 Start 함수에서 초기화하는 것을 추천하고 있다.

 

  How To...

 

[클래스 A]

  1. public class A : MonoBehaviour
  2. {
  3.     public GameObject IncludingB;
  4.     B b;
  5.     int temp;
  6.  
  7.     void Start()
  8.     {
  9.         b = IncludingB.GetComponent<B>();
  10.     }
  11.        
  12.     void OnGUI()
  13.     {
  14.         GUI.Label(new Rect(10510030), temp.ToString());
  15.  
  16.         if (GUI.Button(new Rect(103010030)"-10"))
  17.         {
  18.             b.CalcHP();
  19.         }
  20.     }
  21.  
  22.     void Update()
  23.     {
  24.         temp = b.HP;
  25.         Debug.Log("HP : " + temp);
  26.     }
  27. }
  28.  

[클래스 B]

  1. public class B : MonoBehaviour
  2. {    
  3.     private int hp;
  4.    
  5.     void Awake()
  6.     {    
  7.         hp = 100;
  8.     }
  9.  
  10.     public void CalcHP()
  11.     {
  12.         hp -= 10;
  13.     }
  14.  
  15.     public int HP
  16.     {
  17.         get
  18.         {
  19.             return hp;
  20.         }
  21.  
  22.         set
  23.         {
  24.             hp = value;
  25.         }
  26.     }
  27. }

 

빈 게임 오브젝트를 하나 만들어 클래스B를 넣고, Main Camera에는 A를 넣었다.





버튼을 누르면 -10이 label에 적용된다.



 

 

  마치며...

 

유니티로 첫번째 프로젝트를 했을때 생성자를 사용했더니 알 수 없는 버그들이 불규칙적으로 나타나고, 클래스간 정보 공유를 하려고 모든 변수 및 메소드를 static으로 지정하여 엄청나게 고생했다.