안녕하세요

프로그램 과정에서 막혔던 문제들에 대한 해결책 정리


페이지 목록

2025년 11월 28일 금요일

[유니티][Unity] view.OnHit += (collider2D, fireballView) => OnFireballHit(collider2D, model, view); 코드 분석

 view.OnHit +=  : view 객체의 OnHit 이벤트에 새로운 동작 추가

(collider2D,fireballView) : 이벤트가 발생할 때 전달되는 매개변수(파라미터) 목록

=> : 람다 연산자 왼쪽의 입력을 받아서 오른쪽 코드를 실행하라는 의미

OnFireballHit(...) : 이벤트가 발생했을 때 실제로 실행될 Presenter의 메소드

(collider2D, model, view) : OnFireballHit 메소드로 전달되는 인수(Arguments)


이 코드가 하는 일

 1. View에서 이벤트 발생: View에서 OnHit 이벤트가 발생하면 Presenter로 알림

2. Presenter의 반응(람다 실행) : OnFireballHit 메소드를 실행한다.

3. 데이터 전달: collider2D와 model view 객체를 OnFireballHit 메소드에 함께 전달한다


여기서 (collider2D,fireballView)는 파라미터이기에 사실 (a,b) 와 같이 적어도 된다. 넘어 오는 파라미터 값의 의미를 알 수 없기 때문에 알 수 있는 표현을 쓰는 것이다.


근데 왜 매개변수가 2개인데 3개의 인수가 생기지?? 이것은 풀어보면 알 수 있다.

// 람다 표현식:
// view.OnHit += (collider2D, fireballView) => OnFireballHit(collider2D, model, view);

// 위 코드를 풀어서 쓰면:

view.OnHit += delegate(Collider2D collider2D, FireballView fireballView)
{
    // 이벤트가 발생했을 때 이 내부 코드가 실행됩니다.
    // 여기서 Presenter의 메소드를 호출합니다.
    OnFireballHit(collider2D, model, view);
};

이렇게 2개의 파라미터가 넘어오지만 실제 메소드는 3개의 인수를 가진다고 보면 된다.

그러면 의문이 생기는 것이 fireballview는 쓰이지도 않는데 왜 선언하는 것인가?

 그것은 처음에 만들 때는 collider2D 와 fireballView가 둘다 쓰일것으로 예상했지만 실제 사용하는 데에서는 collider2D만 사용하게 되어서 생긴 것이다.

 그럼 왜 fireballview를 적어서 헤깔리게 하느냐, 이것이 C#9.0 이상에서는 변수 이름 대신 밑줄(_)을 써서 사용하지 않는 매개변수를 표현할 수 있게 해줬다. 

 (collider2D, _ ) => ... 이렇게 사용하면 된다.

 그럼 delegate는 뭐냐? 다음에 설명하겠다.


구글 AI를 참조하여 작성하였습니다.

댓글 없음:

댓글 쓰기