Time Units

Time 유닛에는 Timer, Cooldown, Wait 유닛들이 있다.

Wait

Wait 유닛은 스크립트 실행을 지연(delay)시킨다. 지연(delay)은 정해진 시간(초)이 될 수도 있고 계속 진행하기 전에 이행해야 하는 조건이 될 수도 있다.

 

Unity의 비동기성(실행이 지연되는 기능 또는 동작)은 코루틴(coroutine)으로 처리하고 있다(멀티쓰레드 방식이 아니다). Wait 유닛을 사용하려면 코루틴처럼 스크립트가 동작해야 한다고 비주얼 스크립팅에 알려야 한다. 그 방법은 스크립트를 시작시키는 초기 이벤트의 Coroutine 체크박스에 체크해 주면 된다. 그래프 인스펙트에는 다음과 같이 보인다.


Coroutine

Coroutine
Coroutine


이벤트 유닛에 작은 이중 화살표 아이콘이 나타나 코루틴으로 실행되고 있음을 알려준다.

Coroutine 확인란이 활성화되지 않은 경우, 런타임시에 발생하는 에러는 포트가 Wait 유닛에 도달할 때만 '코루틴에서 트리거될 수 있음'을 나타내는 것이다.

 

모든 Wait 유닛은 루프(loops)와 시퀀스(sequences) 내부에서도 사용가능하다.



Wait For Seconds

 

Wait For Seconds 유닛은 가장 단순하고 가장 자주 사용되는 Wait 유닛이다. 이 유닛은 실행을 일정 시간(초) 단위로 지연시킨다. (역자주-아래 예시는 마우스 클릭시 5초후에 "Waited!"라는 메시지가 콘솔에 출력된다.)


Wait For Second Unit
Wait For Second Unit


Wait Until


Wait Until 유닛은 주어진 조건이 충족될 때까지 실행을 멈추게 한다. 아래 예시는 A < 1 조건이 될 때까지 "Close enough"는 콘솔에 출력되지 않는다. 즉, A < 1 인 상태가 되는 순간 출력이 된다.


Wait Until Unit
Wait Until Unit


Wait While


Wait While 유닛은 Wait Until 유닛과 정반대이다. 즉, 주어진 조건이 충족되는 한 실행을 멈추고 있다. 아래 예시는 A > 1인 조건인 동안 콘솔에 "Close enough"이 출력되지 않는다. 즉, A > 1이 아닌 상태가 되는 순간 출력이 된다.


Wait While Unit
Wait While Unit


Wait For Frame 


이름이 의미하듯이 Wait For End Of Frame 유닛과 Wait For Next Frame 유닛은 Unity의 업데이트 루프의 특정 지점이 충족될 때까지 실행을 지연시킨다. 자세한 내용은 Execution Order of Events를 참조하면 된다.


Wait For Frame Units
Wait For Frame Units


Wait For Flow


Wait For Flow 유닛은 모든 입력 스크립트들이 최소한 한 번은 모두 처리 될 때까지 실행을 지연시킨다. 여러 Events 또는 Frames에 걸쳐 발생하는 조건들을 그룹화하는데 매우 유용한 방법이다. 다른 프로그래밍 언어에서는 이 개념을 "Promises(약속들)"이라고 부르기도 한다.


Wait For Flow Unit
Wait For Flow Unit
 
Cooldown

Cooldown Unit
Cooldown Unit

Cooldown 유닛은 입력 스크립트가 제한된 횟수만 트리거될 수 있는 경우 시간 제한을 줄 수 있다.

Cooldown이 완료되면 입력 스크립트가 Ready 포트로 전송되고 그렇지 않으면 Not Ready 포트로 전송된다.

Duration 포트는 Cooldown이 다시 완료될 때까지 걸리는 시간을 의미한다. Unscaled가 체크되면 시간 척도(time scale)를 무시하게 된다.

Tick 포트는 Cooldown이 활성화된 상태일 때 매 프레임마다 호출된다. 어떤 액션(Action)이 다시 호출될 수 있을 때까지 남은 시간을 업데이트해서 표시하는 GUI 코드를 작성할 때 유용하다. 이를 위한 두 가지 옵션이 있다.

  • Remaining : Ready가 될때까지의 시간(초)을 반환한다.
  • Remaining % : Ready에서 Not Ready까지의 구간에 대응되는 0과 1사이의 값을 반환한다. 

Cooldown이 Ready가 되자마다 Completed 포트가 작동된다. 이 포트가 트리거되도록 입력 스크립트를 지속적으로 전달할 필요는 없다.

끝으로 Cooldown을 강제로 Ready 시킬 수도 있고, Reset port를 트리거하여 내부 타이머를 재설정할 수도 있다.

아래의 예는 Cooldown이 있는 단순한 사격 시스템으로 다음 사격 가능 시간 까지 남은 시간을 비율로 표시해주는 이미지 바와 시간 값을 표시해주는 텍스트가 있는 UI 스크립트 그래프이다.


Cooldown Unit
Cooldown Unit 예시


Timer


Timer Unit
Timer Unit


타이머 유닛은 일시정지가 가능한 프로세스를 구현하거나 모니터하는 유닛이다.

Duration 포트는 Cooldown이 다시 완료될 때까지 걸리는 시간을 의미한다. Unscaled가 체크되면 시간 척도(time scale)를 무시하게 된다.

Timer는 Start 입력이 트리거 될 때 시작되며, 이후에 Started 출력을 트리거한다.

Pause 입력으로 일시 중지 시킬 수 있고, Resume 입력으로 재시작 시킬 수 있다. 또는 Toggle 입력으로 이러한 상태간 전환을 할 수도 있다.

Tick 포트는 타이머가 활성화되어 있는 동안 매 프레임마다 호출된다. 시간 측정을 얻는 방법에는 두 가지 옵션이 있다.

  • Elapsed : 타이머가 시작된 이후의 시간을 반환한다(경과 시간)
  • Remaining : 타이머가 완료될 때까지의 시간을 반환한다(남은 시간).

측정값은 절대 시간(초)값을 얻을 수 있고 또는 0과 1 사이의 비율 값(%)으로 얻을 수도 있다. 이는 Lerp를 작성할 때 유용하다.

Timer가 종료되자 마자 Completed 포트가 트리거된다.

아래 예시는 단순한 자동파괴 시스템인데, 파괴되기 전까지 점진적으로 스프라이트가 붉게 변해간다.


Timer Unit
Timer Unit


<원문>

https://docs.unity3d.com/Packages/com.unity.visualscripting@1.7/manual/vs-time.html

댓글

이 블로그의 인기 게시물

EMACS - 파일 열기, 저장, 도움말

EMACS - 검색 및 바꾸기

EMACS, CLISP, SLIME 설치