1. 실행 이미지

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CarController3 : MonoBehaviour
{
    [SerializeField] private Button startBtn;
    [SerializeField] private Transform flagGo;
    private Text btnText;
    private Vector2 startPosition;
    private bool isMoving = false; // 차가 이동 중인지 추적하는 변수

    void Start()
    {
        btnText = startBtn.GetComponentInChildren<Text>();
        btnText.text = "Start";
        startPosition = this.transform.position;

        // 버튼 클릭 이벤트 리스너 추가
        startBtn.onClick.AddListener(() =>
        {
            isMoving = true;
            this.transform.position = startPosition;
        });
    }

    void Update()
    {
        if (isMoving)
        {
            // 차를 오른쪽으로 이동
            this.transform.Translate(transform.right * 2f * Time.deltaTime);
            float distance = flagGo.position.x - transform.position.x;

            if (distance > -0.8f)
            {
                btnText.text = distance.ToString();
            }
            else if (distance <= -0.8f)
            {
                btnText.text = "End";
                isMoving = false; // 이동 중지
                Debug.Log("이동완료");
            }

        }

        
    }
}

2. 기존의 코드

 

using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class CarController2 : MonoBehaviour
{

    [SerializeField] private Button startBtn;
    [SerializeField] private Transform flagGo;
    private Coroutine coroutine;
    private Text btnText;
    private Vector2 startPosition;
    void Start()
    {
        btnText = startBtn.GetComponentInChildren<Text>();
        btnText.text = "Start";
        startPosition= this.transform.position;
        startBtn.onClick.AddListener(() =>
        {
            if (coroutine != null)
            {
                StopCoroutine(coroutine); // 이미 실행 중인 코루틴 중단
            }

            this.transform.position = startPosition;
            this.coroutine = this.StartCoroutine(this.CoMove(() =>{
                Debug.LogFormat("이동을 모두 완료했습니다.");
            }));
        });
        
    }
    IEnumerator CoMove(Action callback)
    {
        while(true)
        {
            this.transform.Translate(transform.right * 2f * Time.deltaTime);
            float distance = flagGo.position.x - transform.position.x;
            btnText.text = (distance + 0.8f).ToString();
            if (distance <= -0.8f)
            {
                btnText.text = "End";
               
                break;
            }
            yield return null;
        }
        Debug.Log("이동완료");
        //yield return null;
        callback();

    }
}

3. 코루틴 사용 코드

 

 

 

[기존의 코드를 코루틴으로 바꿔 사용하며 느끼점]

기존에 Update를 통해 작성하는 코드는 실행 순서가 위에서 아래로 실행 되기 때문에 

무조건 본인이 생각한대로의 코드 순서를 맞춰야 한다.

 

하지만 Coroutine을 사용해보니 기존 Update문에 순서대로 들어가는 코드를 

분리해서 쓸 수 있었고, yield return을 통해서 좀더 간편하게 순서를 제어 할 수 있었다. 

 

Update문이었다면, 위의 코드와 같이 if문이나 bool문 등으로 상황을 추적하는 변수들을 통해 

코드의 순서를 맞추어야 하는데,

 

Coroutine은 yield return과 위의 코드엔 없지만

yield return new WaitForSeconds(seconds) 같은 명령어를 통해 간편하게

시간 및 코드의 흐름을 제어 할 수 있어 

매우 유용하다고 느꼈다.

+ Recent posts