UnityEvent 클래스
Button 을 추가했을 때 Editor 상에 OnClick 이벤트 처리를 해주는 부분을 스크립트상에서 활용할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using System;
public class Timer : MonoBehaviour
{
public static UnityAction RoundEnd = null;
public int timeLeft;
private Text timer;
public int roundLength;
public void StartTimer()
{
timeLeft = roundLength;
timer = GetComponent<Text>();
StartCoroutine(Clock());
}
IEnumerator Clock()
{
while (timeLeft > -1)
{
timer.text = (timeLeft--).ToString();
yield return new WaitForSecondsRealtime(1f);
}
if (RoundEnd != null)
{
Debug.Log("여기는 Timer RoundEnd");
RoundEnd.Invoke();
}
}
}
현재 프로젝트 상에 Timer.cs 로 30초가 지나면 게임이 끝나고 재시작하는 부분을 활용한 것이다.
// 활성화될때마다 호출 > Scene 이 켜질 때
void OnEnable()
{
Timer.RoundEnd += OnRoundEnd;
//Debug.Log("Timer.RoundEnd OnEnable : " + Timer.RoundEnd);
}
// 비활성화될때마다 호출 > 꺼질때
void OnDisable()
{
Timer.RoundEnd -= OnRoundEnd;
//Debug.Log("Timer.RoundEnd OnDisable : " + Timer.RoundEnd);
}
void OnRoundEnd()
{
Debug.Log("여기는 Timer RoundEnd 2");
StopAllCoroutines();
StartCoroutine(_OnRoundEnd());
}
// 시작버튼
public void OnRoundStart()
{
Debug.Log("AppManager.OnRoundStart()");
StopAllCoroutines();
// 실행
StartCoroutine(_OnRoundStart());
}
AppManager.cs 부분, OnEnable로 시작하자마자 Timer에 있는 public static UnityEvent RoundEnd 변수에 시작코루틴이 있는 함수를 넣어준다.
다른함수들도 더 넣어둘 수 있다.
private void OnEnable()
{
Timer.RoundEnd += EnableGravity;
Timer.RoundEnd += SetInitialReferences;
}
예시로 Ball.cs 에 있는 코드
그러면
if (RoundEnd != null)
{
Debug.Log("여기는 Timer RoundEnd");
RoundEnd.Invoke();
}
위의 코드에서 Invoke() 를 하면 현재 담겨있는 모든 함수를 같은 시간에 부를수 있다.
스크립트 내에서 원하는 타이밍에 EventTrigger 를 한번에 발생 시키고 싶으면 사용하면 될 것 같다.
'Unity' 카테고리의 다른 글
[Unity] 유니티 컷씬 넣기 / LoadScene additive (0) | 2020.05.27 |
---|---|
[Unity] 유용한 비주얼 스튜디오 단축키 (0) | 2020.04.23 |
[Unity3D] Animation - Animation Event 사용법(5.6기준) (0) | 2020.04.10 |
[Unity] yield return 종류 (0) | 2020.04.08 |
[Unity] GraphicRaycaster (UGUI 레이캐스팅 하기) (0) | 2020.04.08 |