유니티에서 게임을 만들다가 보면 Delay(지연)을 주고 싶을 때가 많은 데요. Delay를 주는 방법으로 여러 방법이 있겠지만 개인적으로 자주 사용하는 방법은 유니티의 Coroutine를 사용하여 많이 구현하는데요. 그런데 이 Delay 코루틴도 반복해서 사용하다보니깐 이거를 C# Extension Method를 활용해서 MonoBehaviour클래스에서 편하게 사용할 수 있도록 하면 좋겠다는 생각이 들었습니다.
먼저 C# Extension Method가 무엇이냐면, 이미 구현된 타입(클래스, 인터페이스,...)에 추가로 Method를 만들 수 있는 기능입니다. Extension Method 말 그대로 확장된(추가된) 메소드라고 생각하면 좋을 듯합니다.
아래는 보통 Delay를 주고 싶을 때 Coroutine을 사용하는 방법입니다.
using System.Collections;
using UnityEngine;
public class DelayExample : MonoBehaviour
{
void Start()
{
StartCoroutine(GiveDelay(3.0f)); //3초 Delay 주기
}
IEnumerator GiveDelay(float delayTime)
{
yield return new WaitForSeconds(delayTime);
print("Delay is Over!");
}
}
그런데 위에 코드에서 처럼 GiveDelay라는 IEnumerator 함수가 너무 자주 쓰이다 보니 반복되는 것이 싫어서 Extension Method를 활용해서 구현해보겠습니다.
using System;
using System.Collections;
using UnityEngine;
namespace CustomUse
{
public static class CustomExtension
{
public static IEnumerator GiveDelay(this MonoBehaviour mono, float delayTime, Action done)
{
yield return new WaitForSeconds(delayTime);
done?.Invoke();
}
}
}
CustomUse 라는 네임스페이스를 만들고 (그냥 개인적으로 제가 직접 구현한 것들을 구별하기 위해 지정한 namespace입니다. 꼭 필요한 것은 아닙니다). public static class CustomExtension을 만들어줍니다. 클래스 이름은 아무거나 해도 상관없지만 Extension Method를 활용하기 위해선 static으로 선언 해주셔야합니다. 그리고 GiveDelay 라는 Extension Method를 만들기 위해 public static으로 선언해주고 파라미터로 (this Monobehaviour mono ...)를 받아줍니다. 그래야지 Monobehaviour를 상속하는 클래스에서 접근이 가능합니다. 그리고 float delayTime 파라미터로 delay 할 시간을 넘겨주고 System.Action 을 파라미터로 받아서 delay 후에 실행될 것을 구현해 줄 수 있습니다. 이렇게 Extension Method를 구현해 준후에 아래와 같이 확 코드 줄 수가 줄어들게 사용할 수 있습니다.
using UnityEngine;
using CustomUse;
public class DelayExample : MonoBehaviour
{
private void Start()
{
StartCoroutine(this.GiveDelay(3.0f, () =>
{
print("3초 후에 발동!!");
}));
}
}
아까 제가 CustomUse 라는 namespace 안에서 Extension Method를 만들었기 때문에 using CustomUse를 해주는 것을 잊지말아야합니다.
이렇게 Extension Method를 다양한 방면으로 활용할 수 있는데요. 그런데 한편으로는 너무 무분별한 Extension Method는 실제 타입에 구현된 Method들과 이름이 같아지거나 타입의 정체성을 흐트릴수있는 혼란을 줄 수 있어서 무분별한 사용은 피하는게 좋다고 합니다~
'Unity & C#' 카테고리의 다른 글
[유니티 C#] Json 저장 & 불러오기 너무 쉽게 구현하기 (3) | 2021.11.12 |
---|---|
C# event에서 listener들을 unsubscribe하는 법 (0) | 2021.10.19 |
SourceTree에서 Git LFS 적용하기 (0) | 2021.09.30 |
List<T>를 상속받아 CustomList<T> 만들기 (0) | 2021.09.16 |
DOTween (HOTween v2)를 활용한 애니메이션 연출 (0) | 2021.09.16 |