Unity 개발일지

[C#] 콜백, delegate, event 실습하기 본문

C#

[C#] 콜백, delegate, event 실습하기

아머르 2024. 7. 3. 15:27

 

[확인문제]

 

1. 위 코드의 출력 결과는 무엇인가요? 그 이유는 무엇인가요?

더보기

7과 35가 출력된다.

첫번째 MathOperation은 Add메서드로 설정되어 3과 4를 더한 결과인 7을 출력

두번째 MathOperation은 Multiply메서드로 설정되어 7과 5를 곱한 결과인 35를 출력

 

2. 위 코드의 Main함수를 아래처럼 바꿔도 같은 방식으로 동작할까요? 그 이유는 무엇인가요?

더보기

같은 방식으로 동작한다.

Func는 C#에서 재공하는 내장 델리게이트 타입 중 하나로 매개변수를 받아 결과를 반환하는 메서드를 나타낸다.

Func<int, int, int>는 두개의 ins 매개변수를 받아 int 결과를 반환한다.

둘 다 동일한 시그니처(매개변수와 반환타입)을 가지므로 동일하게 작동한다.

 

3. 델리게이트를 사용하여 메서드를 매개변수로 전달하는 장점은 무엇인가요?

더보기

델리게이트를 사용하면 메서드를 매개변수로 전달할 수 있어 코드의 유연성과 재사용성을 높일 수 있다.

이를 통해 런타임에 실행할 메서드를 동적으로 결정할 수 있어 다양한 상황에 대처할 수 있다.

 

 

[설명문제]

1. 콜백이란 무엇인가요? 콜백을 사용해본 경험이 있을까요?

더보기

콜백은 다른 함수에 인수로 전달되는 함수로, 특정 작업이 완료된 후 호출됩니다.

콜백을 사용하여 비동기 작업이나 이벤트 기반 프로그래밍을 구현할 수 있다.

 

2. 델리게이트(delegate; 대리자)란 무엇일까요?

더보기

델리게이트는 메서드를 참조하는 타입 안전한 객체(컴파일 시점에서 타입 검사를 받아 잘못된 타입의 데이터가 사용되지 않도록 보장하는 것)으로, 변수처럼 전달하고 호출할 수 있다.

 

3. C#의 event란 무엇인가요?

더보기

이벤트는 특정 사건이 발생했을 때 호출되는 델리게이트로 주로 사용자 상호작용이나 상태 변경에 반응하는 코드를 작성할 때 사용된다.

 

4. Unity에서 사용하는 델리게이트 혹은 이벤트에는 어떤 것이 있나요?

더보기

UnityEvent : 유니티의 이벤트 시스템으로, Inspector에서 쉽게 이벤트를 연결할 수 있다.

Action, Func : 일반적인 델리게이트로, 게임 로직에서 자주 사용된다.

 

 

[실습문제]

 

<캐릭터 피격 기능 연결>

레이어가 데미지를 받을 때 여러 기능이 한번에 작동하도록 시스템을 만드려고 합니다.

상태 메시지가 출력되고, 피격 이펙트가 나오며, 피격 사운드가 재생되는 메서드가 구현되어 있는 상황입니다.

  • DisplayStatus : 데미지 상태를 출력하는 메서드입니다.
  • DisplayHitEffect : 피격 이펙트를 표시하는 메서드
  • PlayHitSound : 피격 사운드를 재생하는 메서드
  1. TakeDamage 함수 내에서 플레이어가 데미지를 받을 때 이벤트를 발생(Publish)시키는 코드를 작성합니다.
  2. DisplayAndSound 클래스의 생성자에서 이벤트 발생 시 호출될 메서드(DisplayStatus, DisplayHitEffect, PlayHitSound)를 연결합니다.

⚠️(주의!!!)

조건 : 데미지를 받는 로직을 처리하는 TakeDamage 메서드 안에서 DisplayStatus, DisplayHitEffect, PlayHitSound를 직접 호출하지 않고 코드를 완성해봅시다.

더보기

1. TakeDamage 메서드 코드 추가

public void TakeDamage(int damage)
{
    HP -= damage;

    PlayerDamagedEventArgs e = new PlayerDamagedEventArgs { Damage = damage };
    
    // 이벤트가 등록되어 있는지 확인하고 이벤트 발생
    PlayerDamaged?.Invoke(this, e);
}

 

 2. DisplayAndSound 메서드 코드 추가

public DisplayAndSound(Player player)
{
    // 각각의 이벤트 핸들러를 등록
    player.PlayerDamaged += DisplayStatus;
    player.PlayerDamaged += DisplayHitEffect;
    player.PlayerDamaged += PlayHitSound;
}

 

델리게이트에 =와 +=의 차이:

  • =: 델리게이트를 새로운 메서드로 설정합니다. 기존에 등록된 메서드가 있다면 모두 제거되고 새로운 메서드로 대체됩니다.
  • +=: 델리게이트에 새로운 메서드를 추가합니다. 이미 등록된 메서드가 있다면 해당 메서드들에 더해져 추가로 실행됩니다.
반응형