일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- delegate
- 직렬화
- 코루틴
- inputsystem
- 스파르타내일배움캠프
- BGM
- 효과음
- 람다식
- UI
- InputManager
- 메서드
- 유한상태머신
- ObjectPool
- soundmanager
- unity
- 자료구조
- 비선형자료구조
- skybox
- LINQ
- Generic
- 프로그래머스
- script
- 인터페이스
- 배열
- c#
- 유니티
- invokec#events
- 스택
- FSM
- 장애물달리기
- Today
- Total
Unity 개발일지
[C#] 콜백, delegate, event 실습하기 본문
[확인문제]
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 : 피격 사운드를 재생하는 메서드
- TakeDamage 함수 내에서 플레이어가 데미지를 받을 때 이벤트를 발생(Publish)시키는 코드를 작성합니다.
- 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;
}
델리게이트에 =와 +=의 차이:
- =: 델리게이트를 새로운 메서드로 설정합니다. 기존에 등록된 메서드가 있다면 모두 제거되고 새로운 메서드로 대체됩니다.
- +=: 델리게이트에 새로운 메서드를 추가합니다. 이미 등록된 메서드가 있다면 해당 메서드들에 더해져 추가로 실행됩니다.
'C#' 카테고리의 다른 글
[C#] 상속과 인터페이스 실습하기 (0) | 2024.07.05 |
---|---|
[C#] Struct(Stack 메모리) vs Class(Heap 메모리) 실습하기 (0) | 2024.07.04 |
[C#] 객체지향 프로그래밍 실습하기 (0) | 2024.07.02 |
[C#] 객체와 한정자 실습하기 (0) | 2024.07.01 |
[C#] Generic (0) | 2024.06.28 |