유니테스크를 사용하며 알게 된 것들 몇가지를 정리해보았음.
더 좋은 방법이나 추가 팁이 있을 경우 공유해주면 좋은거에요.
LinkedTokenSource
간단히 설명하자면 CancellationToken을 n개를 결합하여 새로은 토큰을 만듦.
예시 !
workCts를 cancel시키거나 destroy될 때, 둘 중 하나만 cancel시켜도 위 작업이 중단됨.
그런데 궁금한 점이 생겨서 테스트 해보았음.
linekdCts의 IsCancellationRequested는 어떻게 되는거지?
작동시켜본 결과는 다음과 같음.
linkedCts를 만든 부모Cts를 cancel시키면 linkedCts의 IsCancellationRequested도 true가 됨.
하지만 반대로 linkedCts를 cancel시킨다고 부모Cts가 true가 되지는 않음.
와 신기해 !
참고사항
IsCancellationRequested는 true에서 false로 바뀔 수 없음.
(cancel 후 새로 생성해주기)
UniTask.SupressCancellationThrow()
await을 하다가 cancel 되었는지 여부에 따라 무언가를 하고 싶을 수가 있음.
try catch를 사용해서 해결할 수도 있지만,
성능이 중요할 때 유니티에서 exception 던져주는건 비추천되므로 대체할 수 있는 방법.
현재 1초짜리 작업이 있고 3초 뒤에 cancel시키는 경우 완료했어 ! 라는 메시지가 출력됨.
하지만 위에서 말한 대로 cancel되었을 때와 완료되었을 때 다른 작업을 해주고 싶은 경우
위와 같이 SupressCancellationThrow를 사용하면 cancel되었는지 여부와 반환값을 받을 수 있음.
테스트 해보면 DoSomething의 딜레이가 1초일 때는 완료했어 ! 5초일 때는 완료 못했어 ! 를 출력함.
CancellationToken.Reg*isterWithoutCaptureExecutionContext
Cancel 되었을 때 무언가 해주고 싶다면 요런 것을 사용할 수도 있음.
C# Task 버전은 Reg*ister(금칙어)고 UniTask버전은 위 소제목과 같음.
아마 exception 발생 안시키려고 변형된 버전인 것 같음.
Task에서 변형된 버전은 https://github.com/Cysharp/UniTask 의 Compare with standard task api 항목 체크
요런 식으로 람다식을 이용해 간단하게 등록해주면 cancel 될 시에 해당 일을 함.
DoSomething이 완료되었는지와 관계 없이 Cancel되면 실행되고
여러번 cancel 호출 하더라도 한번만 cancel되므로 한번만 동작함.
Addressables
Resources나 AssetBundle보다 간편한 어드레서블 !
동적으로 로드해야 할 때 사용함.
유니티는 monobehaviour에서 async await 사용을 하지 않으므로
콜백 등록해주고 지저분한 느낌이 있는데 유니테스크를 이용하면 깔끔하게 사용 가능.
대략 요런 느낌으로 사용하면 될 것 같음.
뉴비이므로 잘못된 정보가 있을 수 있으니 양해바람.
UniTask의 정보가 별로 없으므로 공부하고 싶다면
그냥 Task를 공부하면 될 듯 싶음 !
근데 넘나 어려운것...
자료추
코드 스샷 어떻게 저렇게 이쁘게 찍음? 뭔 프로그램임
Snappify 라고써있는거보먼 그냥 사이트인가
네 그 사이트에 텍스트 복붙하면 사진으로 뽑아주는거에요.
System.Threading.CancellationTokenSource 관리 타입이라 가비지 생김 그래서 유니태스크 문서에서도 성능이 중요하면 TimeoutController 쓰라고 하고 있음
프로파일러로 확인했었는데 잘못 봤나 봄. 감사한거에요
슨상님 좋은 정보 감사합니다! 제가 아직 뉴비테스크인데 도움이 많이 되네용!
뉴비테스크끼리 돕고 사는거에요 !