UI를 아무리 이동시켜도 움직이지 않았던 분들 계십니까?
저는 유니티 뉴비로서 해당 문제에 직면하고 이틀은 머리를 싸맸는데요,
모든게 해결됐습니다.
코루틴을 아십니까? 프레임을 다루는 작업을 하기 위해선 코루틴이라는 친구와 친해져야합니다.(난 싫은데)
👾 문제점
스페이스를 누르면 오프닝 UI가 위로 올라가는 기능을 구현하고 싶었다.
하지만?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
// 스페이스를 누르면
// Start UI가 위로 부드럽게 이동한다.
public class StartGame : MonoBehaviour
{
public GameObject startUIGroup;
RectTransform startUI;
[SerializeField] float speed = 600f;
public GameObject startUITarget;
// Start is called before the first frame update
void Start()
{
startUI = startUIGroup.GetComponent<RectTransform>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
MoveStartUI();
}
}
void MoveStartUI()
{
startUI.anchoredPosition = Vector2.up * speed * Time.deltaTime;
}
}
위처럼 코드를 짜봤는데, 처참하게 실패하며
우리 모두의 깜찍이 : Stack overflow exception이 발생했다.
대장님께 여쭤보니 update문에서 frame당 발생하는 함수이니 coroutine을 사용해야 한다고 하셨다.
코루틴? 그런 친구 처음 들어봐서 검색을 해봤다.
👾 코루틴 Coroutine
Update()에서 작업을 시작하면 = 원하지 않아도 프레임마다 발생
우리가 원할때만 반복적인 작업이 가능하게 하려면? 이때 Coroutine을 사용해준다.
그외에도 일정 시간동안 대기하고 그 이후에 실행하거나 특정 조건을 부여해서 코드가 실행되게 만들 수 있다.
자,, 친해져야겠져?
👾 코루틴 Coroutine 사용하기
IEnumerator 코루틴_함수_이름()
{
yield return 조건;
}
Update()
{
StartCoroutine(코루틴_함수_이름()); // 코루틴 사용 방법 1
StartCoroutine("코루틴_함수_이름"); // 코루틴 사용 방법 2
}
기본적으로 이렇게 사용 가능하다.
IEnumerator형으로 코루틴 함수를 만들어주고 yield return + 조건을 추가해서 return값을 만들어준다.
yield는 말 그대로 '양보'다. 해당하는 조건동안 프레임을 양보한다는 의미입니다.(예제를 보면 이해 빨라짐)
yield return 뒤 조건은 여러개가 있는데,
1. yield return null; : 다음 프레임 시작
2. yeild reutnr new WaitForSeconds(float a); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행(현실 시간 기준)
3. yield return new WaitForSecondsRealtime(float a); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행(유니티 시간 기준)
4. yield break;
5. 기타
조건은 많으니까 검색하면서 그때그때 필요한걸 찾아서 사용하면 된다.
👾 코루틴 Coroutine 을 사용하여 (나의)문제를 해결해보자!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
// 스페이스를 누르면
// Start UI가 위로 부드럽게 이동한다.
public class StartGame : MonoBehaviour
{
public GameObject openingUIGroup;
RectTransform rt;
// Start is called before the first frame update
void Start()
{
rt = openingUIGroup.GetComponent<RectTransform>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(MoveStartUIGroup());
}
}
[SerializeField] float speed = 600f;
[SerializeField] float currentTime = 3f;
IEnumerator MoveStartUIGroup()
{
print("코루틴이 실행 되었습니다.");
for(float ctime = 0; ctime < 3; ctime += Time.deltaTime)
{
rt.anchoredPosition += Vector2.up * speed * Time.deltaTime;
yield return null;
}
}
}
자자잔,,, 스페이스를 누르면 화면이 올라간다.
이게 뭐라고 며칠을 했을까,, 코루틴 모르면 당연하다고 생각함(아님)
'동식이 취업시키기 작전 > 1차 프로젝트 : Overcooked2' 카테고리의 다른 글
[Unity Project] Github Desktop Branch 최신 상태로 만들기, 최신 상태의 브랜치(branch) 가져오기 (0) | 2023.08.19 |
---|---|
[Unity Project] Progress bar(진행바) 만들어서 채우기 (0) | 2023.08.18 |
[Unity Project] 협업하면서 씬 교체하기 (0) | 2023.08.11 |