상세 컨텐츠

본문 제목

[Unity] 유니티 일정시간마다 호출 관련

게임엔진관련/유니티 엔진

by AlrepondTech 2020. 6. 3. 22:52

본문

반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

 

출처: http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_QnA_etc&no=2687

 

수행 중인 coroutine을 외부에서 종료시켜야 할 때가 꽤 많은데요,어떻게 종료하시나요?


1. string argument를 받는 StartCoroutine()과 StopCoroutine()을 사용할 수 있는데, 그건 그 버전 StartCoroutine()이 오버헤드가 있다고 해서 찜찜하구요.
2. MonoBehaviour 당 수행하는 coroutine이 하나 뿐인 경우에는 StopAllCoroutines()를 쓰면 되겠지만, 뭔가 스마트해 보이지 않고,
3. 다음과 같이 공유 variable을 통해서 하는 수가 있는데,


...
// coroutine 실행
StartCoroutine(ACoroutine(curRoutineId);
// curRoutineId 는 member variable.
...


// coroutine
private IEnumerator ACoroutine(int thisRoutineId)
{
while (true)
{
yield return null;
if (thisRoutineId != curRoutineId)
break;


...
}
}


...
// coroutine 종료
curRoutineId++;
...


이 방법은 coroutine 쪽에서 yield를 종료할 때마다 공유 variable을 검사해야 돼서 코드가 지저분해지고, 오버헤드도 만만치 않을 것 같구요.


어떻게 하는 게 좋을까요?

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------

이런거 찾으시는건가요?

Coroutine currentRoutine;


void Start ()
{
currentRoutine = StartCoroutine (DoSomthingCo());
}


void StopCurrentRoutine ()
{
if (currentRoutine != null) {
StopCoroutine(currentRoutine);
currentRoutine = null;
}
}


IEnumerator DoSomthingCo ()
{
while (true)
{
// job
}
}

 

---------------------------------------------------------------------------------------------------------------------------------------------------

 

https://docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html

 

 

 

=================================

=================================

=================================

 

 

 

출처: https://neojsm.tistory.com/13

 

WaitForSeconds라는 메소드가 있는데 C#에서 쓰러면 조금 까다롭게 형식에 맞춰서 작성해줘야 한다.

위 예제와 같이 Awake라는 메소드에서 시간을 두번 출력할때 첫번째 시간을 출력 한 뒤 5초뒤에 두번째 시간을 출력하고자 하는경우 또는 일정시간마다 반복 재귀호출 되는 메소드를 작성하고 싶을때에
'IEnumerator' 라는 인터페이스를 사용하도록 해당 메소드 앞에 적어줘야 한다.

IEnumerator delayTime()
{

yield return new WaitForSeconds(1);

Debug.Log("time = " + Time.time );

}


 위와 같이 delayTime이라는 메소드를 적어주면 메소드가 호출되면 1를 기다렸다가 1초뒤에 Debug 문장이 실행된다.

IEnumerator 인터페이스를 사용하는 메소드를 실행하기 위해서는 
특정 호출 메소드를 이용해야 하는데

StartCoroutine(delayTime);


다른 메서드들 처럼 그냥 메서드명() 으로 호출하면 실행되지 않고 위와 같이 StartCoroutine(메서드명) 으로 호출해야 한다.


일정시간 간격으로 계속 반복되어 실행되는 메서드를 만들러면

void Start () {
        StartCoroutine(countTime, 1);
 }
  
    IEnumerator countTime(float delayTime)
    {
        Debug.Log("Time = " + Time.time);
        yield return new WaitForSeconds(delayTime);
        StartCoroutine( countTime, 1 );
    }


위와 같이 적어주면 countTime이 waitForSeconds 명령에 의해 일정시간 만큼 딜레이를 한 뒤 자기자신을 재 호출하게되어 
1초 간격으로 계속 반복 호출하도록 할 수 있다.



출처: https://neojsm.tistory.com/13 [Zico's Blog]

 

 

 

 

 

반응형

 

 

728x90

 

 

 

=================================

=================================

=================================

 

 

 

출처: https://m.blog.naver.com/PostView.nhn?blogId=rwans0397&logNo=220814097408&proxyReferer=https:%2F%2Fwww.google.com%2F

 

invoke를 사용한다면 원하는 함수를 일정시간만큼 지연할수있다. 유니티에서는 시간지연기능이 invoke말고도 코루틴이란 것도 있는데 유니티에서는 왜 시간지연 기능들을 사용할까?? 

Invoke,코루틴 시간지연을 사용하는 이유

만약 축구게임을 한다고하면 유니티에서는 축구선수를 이동시키는 이동함수를 update함수에서 프레임마다 실행하도록한다면 한프레임에 이동함수가 한번에 실행된다. 이러하면 축구선수들은 모두 순간이동을 한것처럼 보일것이다. 그래서 이동함수를 일정시간마다 지연해서 자연스럽게 보이도록한다.

Invoke 구조

 

void start(){ Invoke("tutorial",2); } void tutorial(){ ... }

 

Invoke("실행함수",지연시간); 이러한 구조이다. 위에서도 볼수 있드시 실행함수는 문자열로 입력하기 때문에 매개변수는 없어야한다. 위에 스크립트는 2초후에 한번 실행된다.

 

InvokeRepeating

void start(){ InvokeRepeating("enemy",2,1); } void enemy(){ ... }

 

만약 특정시간마다 반복하고싶다면 Invoke대신 InvokeRepeating을 사용하면된다. 위에 결과는 InvokeRepeating가 2초후 실행하고 1초마다 계속 실행한다 그리고 해당함수는 무한히 실행될것이다. 만약 InvokeRepeating이 실행하고 있는 함수를 중지하고싶다면 어떻게 해야할까??

 

CanelInvoke

void start(){ InvokeRepeating("enemy",2,1); CanelInvoke(); } void enemy(){ ... }

void start(){ InvokeRepeating("enemy",2,1); CanelInvoke("enemy"); } void enemy(){ ... }

 

위에 두개의 CanelInvoke는 InvokeRepeating을 중지한다. 첫번째는 모든 invoke를 중지하고 두번째는 특정함수만 중지하고싶다면 문자열로 입력하면된다.

 

 

=================================

=================================

=================================

 

 

 

출처: https://stackoverrun.com/ko/q/725514

 

Something like this:using

System.Timers;

const double interval60Minutes = 60 * 60 * 1000;

// milliseconds to one hour

 

Timer checkForTime = new Timer(interval60Minutes); checkForTime.Elapsed += new ElapsedEventHandler(checkForTime_Elapsed);

checkForTime.Enabled = true;

and then in your event handler:

void checkForTime_Elapsed(object sender, ElapsedEventArgs e)

{

    if (timeIsReady()) { SendEmail(); }

}

 

 

 

=================================

=================================

=================================

 

 

 

출처: https://sosal.kr/736

 

System 안에있는 타이머를 사용하면 된다.

using System.Timers;

 

 

 

class Program

{

    private static Timer aTimer;

 

    static void Main(string[] args)

    {

 

        // 2초의 interval을 둔 timer 만들기

        aTimer = new System.Timers.Timer(2000);

 

        // Hook up the Elapsed event for the timer.

        aTimer.Elapsed += OnTimedEvent;

        aTimer.Enabled = true;

 

        Console.WriteLine("Press the Enter key to exit the program... ");

        Console.ReadLine();

        Console.WriteLine("Terminating the application...");

    }

    private static void OnTimedEvent(Object source, ElapsedEventArgs e)

    {

        Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);

    }

}



출처: https://sosal.kr/736 [so_sal ]

 

 

=================================

=================================

=================================

 

 

 

*기타관련링크

- https://hyunity3d.tistory.com/367

- https://prosto.tistory.com/68

- https://m.blog.naver.com/PostView.nhn?blogId=dmhskang&logNo=220673335683&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

 

=================================

=================================

=================================

 

 

 

 

 

반응형


관련글 더보기

댓글 영역