[C#] Delegate(대리자) 정리(2)

muchan
muchan
∙∙조회 16

Delegate(대리자) 정리는 1탄에 이어서 쓰겠습니다.

Delegate(대리자) 정리(1)

내장 대리자

.NET은 자주 사용되는 대리자 형식을 미리 정의해 놓았음:

대리자설명
Action반환값이 없는 메서드
Action<T>T 매개변수를 받고 반환값이 없는 메서드
Func<TResult>반환값이 TResult인 메서드
Func<T, TResult>T 매개변수를 받고 TResult를 반환하는 메서드
Predicate<T>T 매개변수를 받고 bool을 반환하는 메서드

연습해보기

우선 플레이어의 공격 시스템을 구현하는데 버프 상황에 따라 공격 데미지가 다르도록 간단하게 구현해보겠다

SkillSystem.cs

csharp
using System;
using UnityEngine;

public class SkillSystem : MonoBehaviour
{
    public void ExecuteSkill(float baseDamage, Action<float> Damage)
    {
        Damage(baseDamage);
    }
}

기본 데미지와 Damage를 어떻게 처리할지 Action을 매개변수로 받는다

GameManager.cs

csharp
using UnityEngine;

public class GameManager : MonoBehaviour
{
    private SkillSystem skillSystem;

    private void Awake()
    {
        skillSystem = GetComponent<SkillSystem>();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            // 기본 공격
            skillSystem.ExecuteSkill(30f, (damage) => Debug.Log($"기본공격: {damage}"));
        }

        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            // 버프 공격
            skillSystem.ExecuteSkill(30f, (damage) => Debug.Log($"버프공격: {damage * 2f}"));
        }
    }
}
  • 1번을 누르면 기본 공격을 하는 로그를 찍는다
  • 2번을 누르면 버프 데미지로 공격하는 로그를 찍는다

실행 결과

여기서 Action을 Func로 바꿔서 직접 데미지를 계산해서 return해주는 형식으로 바꿔도 되고

Predicate를 사용하여 특정 값 이상일 때만 데미지를 입는 형식으로 구현도 할 수 있다.