성엽이
KKIMSSI
성엽이
전체 방문자
오늘
어제
  • 분류 전체보기 (454)
    • :) (2)
    • C프로그래밍이론 (9)
    • C++프로그래밍 (64)
      • STL (1)
    • C# (2)
    • Visual studio 10.0 (9)
    • AT91SAM7S256 (21)
    • 논리회로 (14)
    • AVR2560 (11)
    • TCPIP (16)
    • NetWork (4)
      • Ubuntu Linux (2)
    • Assembly (21)
    • UNIX 프로그래밍 (6)
    • RFID 분석 (1)
    • Win32 API (7)
    • Cortex-M3 (4)
    • Unity (91)
    • Flutter (9)
    • OwnProject (11)
      • It's mine (5)
      • 마인드스톰 실습 (1)
      • 보고서 자료 (2)
      • RPi B+ (2)
    • ETC (25)
      • 상식 (3)
    • MFC (40)
    • PostgeSQL (18)
    • 영상제어 (6)
      • VFW_영상처리 (1)
    • Python (0)
    • Java (30)
      • SpringBoot (2)
      • Javascript (1)
      • JSP (13)
      • Spring (8)
    • Oracle (4)
      • SQL (3)
    • HTML (6)
      • Thymeleaf (1)
      • CSS (1)
      • Bootstrap (3)
    • IDE (1)
      • VS Code (1)
    • Android (2)
    • Privacy Policy (0)
    • MYSQL (2)
      • MariaDB (2)
    • AWS (5)
    • 개인공부 (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록
  • 관리자
  • 글쓰기

공지사항

인기 글

태그

  • WINAPI
  • MFC
  • ARM Reverse Engineering
  • Boot Code 분석
  • 문자열 나누기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
성엽이

KKIMSSI

카테고리 없음

[Unity] Simple async EventHandler in Unity using Cysharp/UniTask

2023. 5. 17. 15:18

https://gist.github.com/JanikHelbig/8228e3fc6e118757faa8a61c3d8370af

 

Simple async EventHandler in Unity using Cysharp/UniTask

Simple async EventHandler in Unity using Cysharp/UniTask - EventHandlerAsync.cs

gist.github.com

 

EventHandler 에 등록된 함수'들'의 Invoke 후에 작업이 모두 완료되기까지 기다리게하는 유틸

 

UniTask 사용.

 

 

EventHandlerAsyncExtensions.cs


using Cysharp.Threading.Tasks;
using System;

public delegate UniTask EventHandlerAsync(object sender, EventArgs e);

public static class EventHandlerAsyncExtensions {
    public static UniTask InvokeAsync(this EventHandlerAsync handler, object sender, EventArgs e) {
        Delegate[] delegates = handler?.GetInvocationList();

        if (delegates == null || delegates.Length == 0)
            return UniTask.CompletedTask;

        var tasks = new UniTask[delegates.Length];

        for (var i = 0; i < delegates.Length; i++) {
            tasks[i] = (UniTask)delegates[i].DynamicInvoke(sender, e);
        }

        return UniTask.WhenAll(tasks);
    }
}

 

 

ExampleInvokeAsync.cs


    public static event EventHandlerAsync OnChangedAsync;

	private void Start(){
    	StartCoroutine(UpdateAll());
	}
    
	private IEnumerator UpdateAll() {
        yield return UpdateAllInvokeAsync();
    }

    private async UniTaskVoid UpdateAllInvokeAsync() {
        await OnChangedAsync.InvokeAsync(this, EventArgs.Empty);        
    }

 

ExampleOnChanged.cs


    private void OnEnable() {        
        ExampleInvokeAsync.OnChangedAsync += Example_OnChangedInvokeAsync;                
    }

    private void OnDisable() {        
        ExampleInvokeAsync.OnChangedAsync -= Example_OnChangedInvokeAsync;                
    }

    private UniTask Example_OnChangedInvokeAsync(object sender, EventArgs e) {        
        // Do Something works..
        UpdateAnything();        
        return UniTask.CompletedTask;
    }
저작자표시
    성엽이
    성엽이

    티스토리툴바