
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) 같은 명령어를 통해 간편하게
시간 및 코드의 흐름을 제어 할 수 있어
매우 유용하다고 느꼈다.
반응형
'산대특 > 게임 클라이언트 프로그래밍' 카테고리의 다른 글
[SpaceShooter2D] 비행기[Player] GetAxis로 이동하기 + 정규화(Normalize) (0) | 2024.02.02 |
---|---|
[Bamsongi] 화면 클릭해서 밤송이 던지기 + 파티클 (0) | 2024.02.02 |
[ClimbCloud] 캐릭터를 AddForce로 이동 및 좌우 전환 만들어보기 (0) | 2024.01.31 |
[CatEscape] CatEscape 만들기 (0) | 2024.01.29 |
[Shuriken Swipe] 수리검 이동 및 회전 + 도착 지점 계산하기 (0) | 2024.01.27 |