Game Development, 게임개발/개발

C#/Unity Event - 개념

게임이 더 좋아 2022. 1. 8. 11:57
반응형
728x170

 

Event에서 간단하게 정리하려고 한다.

알아보자

 


 

 

무엇이냐???

 

Event는 C#이 지원하는 하나의 기능으로

특정한 일(event)이 있어났음을 외부의 이벤트 가입자(subscriber)들에게 알려주는 기능을 한다.

즉, 외부와의 커플링, Coupling을 줄이기 위한 도구 중 하나이다.

 

 


 

왜쓰냐??

 

위에서 말했다시피 Coupling을 줄여줌은 물론

Event가 발생했을 때만 Subscriber된 함수가 실행됨으로

Update로 항상 지켜보지 않아도 된다는 장점이 있다.

-> 하지만 해당 Event를 발생시키는 것은 Update로 봐야한다는 단점도 존재한다.

 

결국 Event의 Event도 어차피 누군가는 감지를 해야 발행할 수 있으니까..?

 

어떻게 사용하는 지를 보면서 더 감을 잡도록 하자.

 

 


 

어떻게 쓰냐???

 


이벤트에 가입하는 외부 가입자 측에서는 이벤트가 발생했을 때 어떤 명령들을 실행할 지를 지정해 주는데

이를 이벤트 핸들러라 한다.

이벤트에 가입하기 위해서는 += 연산자를 사용하여 이벤트핸들러를 이벤트에 추가한다.

반대로 이벤트핸들러를 삭제하기 위해서는 -= 연산자를 사용한다.

**일반적으로 delegate를 써서 Event 함수의 등록,제거를 진행한다.

 

하나의 이벤트에는 여러 개의 이벤트핸들러들을 추가할 수 있으며

이벤트가 발생되면 추가된 이벤트핸들러들을 모두 차례로 호출한다.

 

 

 

코드로 예를 들어보자면

// 클래스 내의 이벤트 정의
class MyButton
{
   public string Text;
   public event EventHandler Click; //Click이라는 Event를 만듦

   public void MouseButtonDown()
   {
      //Click이라는 Event가 발생했다면..?
      if (this.Click != null)
      {
         Click(this, EventArgs.Empty); //해당 Click에 있는 핸들러들을 해당 인수를 넣어 호출
      }
   }
}

// 이벤트 사용
public void Run()
{
   MyButton btn = new MyButton();   // Btn이라는 해당 클래스 객체 생성

   // btn_Click 핸들러에 함수 추가(Event 발생 시 실행시킬 함수)
   btn.Click += new EventHandler(btn_Click);
   btn.Text = "Run";
   //....
}

void btn_Click(object sender, EventArgs e)
{
   MessageBox.Show("Button 클릭");
}

 

 


요약

1. Event는 클래스 간의 Coupling을 줄여줌

-> Event 발행자는 어떤 함수가 실행될지 모름

-> Event 수신자는 어떤 Event가 발생했는지 모름

 

2. Event는 항상 지켜보지 않아도 된다.

-> Event가 발생될 때만 실행되므로 Update로 어떤 변수를 지켜보거나 상태를 지켜보고있지 않아도 된다.

 

3. Delegate로 Event를 등록하면 관리를 잘해주어야 한다.

-> 원치 않은 실행을 막기 위해서는 실행 후 EventHandler에서 제거를 필요로 한다.

 

++4. Event의 상위 호환을 쓰고 싶다면 Reactive Programming을 써보자

-> Unity에서는 UniRx를 지원한다.

 

 

 

 


 

참고

https://www.csharpstudy.com/CSharp/CSharp-event.aspx

 

반응형
그리드형