코루틴(Coroutine)(feat. 스레드와 차이점)/적용해보기
코루틴이란
코루틴은 비동기적으로 실행되는 코드를 간소화할 수 있는 동시 실행 설계 패턴이다
경량 스레드라고도 부른다
코루틴과 스레드
비동기 작업이란 어떤 작업을 수행할 때, 그 작업이 끝나는 것만을 기다리지 않고 다른 작업을 수행하는 것이다
반대로 동기 작업은 해당 작업이 끝날 때까지 기다린 다음 다른 작업을 수행하는 것이다
코루틴과 스레드는 모두 비동기적이다
둘은 비슷해 보이지만 차이점이 있는데 코루틴은 여러 작업을 잘게 쪼개서
동시에 수행하는 것처럼 보이게 작업을 수행한다(concurrency)는 것이고,
스레드는 여러 작업을 정말로 동시에 수행한다는 것이다(parallelism)
단, 이때는 CPU의 코어에 따라 멀티 코어인 경우이다
유니티에서의 코루틴
유니티 Update 내에서 메서드를 호출했을 때 메서드에서 수행되는 모든 작업은 한 프레임의 Update 내에서 발생해야 한다
메서드의 수행시 중간 과정을 나타낼 수 없고 결과만 반환되는 것이다
코루틴은 어떤 작업을 처리할 때 시간 간격을 두고 처리할 수 있도록 도와준다
그래서 점진적인 수행이 필요한 경우에 이용하면 좋다
코루틴을 사용하면 현재 프레임의 실행을 일시정지하고 Unity에 제어 권한을 반환한 후
다음 프레임이 시작되면 일시정지했던 위치에서 계속 실행할 수 있다
Update를 호출하지 않아도 프레임을 넘길 수 있다는 뜻이다
C#에서는 코루틴 선언시 IEnumerator 반환타입을 선언해야 한다
코루틴을 실행하기 위해서 StartCoroutine을 사용해야한다
유니티 스크립트에서는 yield 구문을 포함하면 코루틴으로 인식되며
IEnumeraor 반환타입을 선언할 필요가 없다
코루틴을 실행하기 위해서 StartCoroutine을 사용하지 않고 일반 메서드처럼 호출할 수 있다
아래는 유니티 스크립트에서 코루틴 함수를 선언하고 호출하는 코드이다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Masaki : MonoBehaviour
{
Coroutine routine;
// Start is called before the first frame update
void Start()
{
this.routine = this.StartCoroutine(this.Move()); //코루틴 함수 시작
this.StopCoroutine(this.routine); //코루틴 함수 중지
}
//코루틴 선언
IEnumerator Move()
{
while (true)
{
this.transform.Translate(new Vector3(0, 0, 1) * 1 * Time.deltaTime);
yield return null; //실행이 일시정지 되고
//1프레임 건너뛴다
//yeild 안 적으면 무한 루프
if (this.transform.position.z >= 2)
break;
}
}
}
코루틴 이용해서 클릭한 지점으로 캐릭터 이동하기
코루틴의 장점을 이용할 수 있게 작성한 건지는 모르겠다
아직 이해가 부족한 것 같다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Misaki : MonoBehaviour
{
private bool isMove;
private Vector3 destination;
private void Start()
{
}
void Update()
{
if (Input.GetMouseButton(0))
{
RaycastHit hit;
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit))
{
destination = hit.point;
isMove = true;
}
}
StartCoroutine(Move());
}
IEnumerator Move()
{
if (isMove)
{
if (Vector3.Distance(destination, transform.position) <= 0.1f)
{
isMove = false;
}
var dir = destination - transform.position;
this.transform.forward = dir;
transform.position += dir.normalized * 1f * Time.deltaTime;
yield return null;
}
}
}
참고
https://solution94.tistory.com/107
[Android/안드로이드] 코루틴(Coroutine)과 스레드(Thread)는 뭐지?
2022.09.16 - [Development/Android] - [Android/안드로이드] JVM, JDK, JRE 얘들은 뭐지? [Android/안드로이드] JVM, JDK,JRE 얘들은 뭐지? 원래는 Coroutine과 Thread에 대해 알아보고 어떤 차이가 있는지, 어떻게 사용하는
solution94.tistory.com
https://velog.io/@haero_kim/Thread-vs-Coroutine-비교해보기
🤔 Thread vs Coroutine 전격 비교
비슷해보이는 두 녀석의 차이점을 파헤쳐보자!
velog.io
https://docs.unity3d.com/kr/2021.3/Manual/Coroutines.html
코루틴 - Unity 매뉴얼
코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있습니다. Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드입니
docs.unity3d.com
https://docs.unity3d.com/kr/560/Manual/Coroutines.html
코루틴 - Unity 매뉴얼
함수를 호출하면 값을 반환하기 전에 실행 완료됩니다. 이는 함수에서 수행되는 모든 액션이 하나의 프레임 업데이트 내에서 발생해야 한다는 것을 의미합니다. 시간이 지남에 따라 절차식 애
docs.unity3d.com
https://wergia.tistory.com/228
[Unity3D] Programming - 클릭한 위치로 캐릭터를 이동시키는 기능 구현하기
Programming - 클릭한 위치로 캐릭터를 이동시키는 기능 구현하기 작성 기준 버전 :: 2019.2 [이 포스트의 내용은 유튜브 영상으로도 시청하실 수 있습니다] 게임의 조작 방식에는 굉장히 다양한 방법
wergia.tistory.com