[Sparta-BCamp] TIL 3 (Coroutine) โญ
์นดํ ๊ณ ๋ฆฌ: Til
Coroutine
๋ฏธ๋ ํ๋ก์ ํธ 3์ผ์ฐจ
3์ผ์ฐจ
- ์ฐ์์ผ๋ก ์ ๋ต ์ ํ์ ์ด๋ฆ์ด ์ฌ๋ผ์ง์ง ์๋๋ค. -> Invoke๋ ๋งค๊ฐ๋ณ์ ์ ๋ฌ์ ํ ์ ์๋ค. Coroutine์ ์ฌ์ฉํ์
- ๋์ด๋ ๋๋๊ธฐ-> start์์ ํด๋ฆญ ์, level ๋ณ์๋ฅผ ์ง์ ํ์๋ค. -> ํ์๋ถ์ ์ข์ ์ฝ๋๋ก ์ฌname์ ๋ถ๋ฌ์ค๊ธฐ.
- 24์ฅ ๋ฐฐ์ด -> ํฌ๊ธฐ ์กฐ์ -> ๋ถ๋ชจ ์ค์ผ์ผ
- ์ด๋ฏธ์ง๊ฐ 12๊ฐ๋ก ๋์ด๋๋ฉด์ Substring ์ฝ๋ -> ์ด๋ฏธ์ง ์ด๋ฆ ๋ณ๊ฒฝ์ผ๋ก ํด๊ฒฐ
- ์นด๋ ๋ฑ์ฅํจ๊ณผ -> ์ ๋๋ฉ์ด์ ? ํ๋์ฉ? -> movetowards
github๋ฅผ ์ฌ์ฉํ๋๋ฐ main, ๋ธ๋ฐ์น๋ฅผ ๋ฐ๊พธ๋ฉด ๋ฐ๋ก unity๊ฐ ๋ฐ๋๋๊ฒ ์ ๊ธฐํ๋ค.
๋ฆฌํธ๋ผ์ด ๋ฅผ IF๋ฌธ์ผ๋ก ํ๋๋ฐ ํ์๋ถ์ด ํ ์ค๋ก ๋ ์ข์ ์ฝ๋ฉ์ด ์์๋ค.
vector ๋ ๋ฆฌ์คํธ ๊ฐ๋ฅํ๊ตฌ๋.
์ง๋ฌธํ๊ธฐ time< maxtime SCALE์ด 0์ธ๋ฐ ์ ๊ณ์ ๋ฐ๋ณต??, INVOKE ํ๋ฉด ์ ๋ฐ๋ณต X? TIME ์ด ์ 0.0023? ํด๊ฒฐ๋ฒ์?
์ง๋ฌธํด ๋ณด๊ณ -> ํ์ฌ๋ ๋ถ๋ฆฌ์ธ ์ฌ์ฉ, ์ ๋ํฐ๋ฅผ ๋ ๋ฐฐ์ฐ๋ฉด ์ข์ ๋ฐฉ๋ฒ์ด ์๋ค.
์ฝ๋ ๊ธฐ๋ฅ์ ์์ฑ ํ ๋์ด ์๋ ๋ ์ ํํ๊ณ ์ค๋ฅ๊ฐ ์์๋งํ ์ฝ๋ฉ ์ฒดํฌ -> ํ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ํ์๋ค์ ์ข์ ์ฝ๋๊ฐ ๋ง๊ณ ๋ฐฐ์ธ ์ ์์๋ค.
๋ฉ์ธ ์ฝ๋์์ ์ค๋ณต๋ด์ฉ์ ํจ์๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ํ๋ ๊ฒ ์ข์ ๋ฐฉ๋ฒ์ธ๊ฐ? ๊ถ๊ธ. ๋ฌผ์ด๋ณด๊ธฐ
์ฃผ๊ฐ WIL -> ์ด์๊ฐ ํ์
TIL ๊ฐ์
๋ til ์ ์ฒ์ ์์ํ๊ฒ ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ฉ๋ชจ ๊ธฐ๋ฅ์ผ๋ก ๋ด๊ฐ ํ์ํ ๊ธฐ๋ฅ์ ๋ด ๋ธ๋ก๊ทธ์์ ์ฐพ์ ์ฐ๊ธฐ ์ํด ๊ธฐ๋ก์ ์์ํ๊ฒ ๋์๋ค.
๊ทธ ํ til ์ ์ฐ๊ณ ๋ ํ ๋ณต์ตํ๋ ํจ๊ณผ๋ ์์๊ณ ๋ณต์ต์ ํ๋ค ๋ณด๋ฉด ๋ ๊ฑฐ๊ธฐ์ ๋ฌธ์ ์ ๊ณผ ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋ฐ๊ฒฌํ๋ฉด์ ๋ฐ์ ํ๋ ๊ฒ ๋๊ปด์ ธ์ ์ข์๋ค.
์ถ๊ฐ์ ์ธ ๊ฑฐ ex) ๋ฐ์ํ๋ ๋ฌธ์ ์ ์๋ก ์ดํดํ ๋ ์ข ๋ ์ด์ผ๊ธฐ๋ฅผ ์์ธํ๊ฒ ํ๊ธฐ
๊ฐ์ฅ ์ค์ํ ์ ๋ฌธ์ ํด๊ฒฐ ๊ณผ์
1. ์ฐ์๋งค์นญ ์ ํ์๋ช
์ฐ์ ์ ๋ต ์ ํ์๋ช
์ด ์ฌ๋ผ์ง์ง ์๋๋ค.
๋ฒ๊ทธ์กฐ๊ฑด -> (invoke ์๊ฐ ๋ด 2๊ฐ) ๋น ๋ฅด๊ฒ ๋งค์นญ ์ check ๋ณ์๊ฐ ๋ฐ๋๋ฉด์ ์ค๋ฅ๊ฐ ๋ฌ๋ค.
nActiveFalse์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ invoke๋ฅผ ํ๊ณ ์ถ์์ง๋ง invoke๋ ๋งค๊ฐ๋ณ์ ์ ๋ฌ์ด ๋ถ๊ฐ๋ฅํ๋ค๊ณ ํ๋ค
ํด๊ฒฐ๋ฒ coroutine์ ์ฌ์ฉํ๋ผ๊ณ ํ๋ค.
coroutine์ ์ฌ์ฉํด ๋ณด์๋ค. -> ์ฝ๋ฃจํด
gamemanager.cs
gamemanager.cs
string info = firstCard.GetComponentInChildren<SpriteRenderer>().sprite.name; // sprite์ ์ด๋ฆ rtanx info์ ์ ์ฅ
check = int.Parse(info.Substring(info.Length - 1)) -1; // rtanx ์ x๋ถ๋ถ ์๋ฅด๊ธฐ, int ๋ก ๋ณํ
namelist[check].SetActive(true); // Active True
StartCoroutine(nActiveFalse(check));
IEnumerator nActiveFalse(int check)
{
yield return new WaitForSeconds(1.0f); //1์ด ๋๋ ์ด
namelist[check].SetActive(false);
}
2.๋์ด๋ ๋๋๊ธฐ
๋ณ์ํ๋๋ก ์คํํธ์์ ํด๋ฆญ์ LEVEL=X ์ฌ์ฉ
STARTSCENE์๋ ๊ฒ์๋ฉ๋์ ๊ฐ ์๊ธฐ๋๋ฌธ์ (gamemanager.i.level)์ฌ๋ฌ๊ฒฝ์ฐ๋ฅผ ํด๋ณด๊ณ LEVEL์ STATIC์ฌ์ฉ
ํด๊ฒฐ๋ฒ LEVEL์ STATIC์ฌ์ฉ
์ดํ retry ๊ฒ์์ ๋ณ๊ฒฝํ ์ผ์ด ์์๋๋ฐ if,switch๋ฅผ ์ฌ์ฉํ๋๋ ํ์๋ถ์ ์ฝ๋๊ฐ ํ์ค๋ก ๋์๋ค. SceneManager.LoadScene(SceneManager.GetActiveScene().name);
Startbtn.cs
Startbtn.cs
public void GameStartE()
{
SceneManager.LoadScene("EasyScene");
}
public void GameStartN()
{
SceneManager.LoadScene("NormalScene");
}
public void GameStartH()
{
SceneManager.LoadScene("HardScene");
}
- ๋ฒํผ ํด๋ฆญ ์ ๋์ด๋์ ๋ง๋ ์ฌ์ผ๋ก ์ด๋
3. 24์ฅ ๋ฐฐ์ด -> ํฌ๊ธฐ ์กฐ์ -> ๋ถ๋ชจ ์ค์ผ์ผ
์ดํ retry ๊ฒ์์ ๋ณ๊ฒฝํ ์ผ์ด ์์๋๋ฐ if,switch๋ฅผ ์ฌ์ฉํ๋๋ ํ์๋ถ์ ์ฝ๋๊ฐ ํ์ค๋ก ๋์๋ค. SceneManager.LoadScene(SceneManager.GetActiveScene().name);
GameManager.cs
GameManager.cs
void Start()
{
isShuffle = false;
tempSprite = sprites[0];
tempSpriteNum = 0;
//PlayerPrefs.DeleteAll();
transaddtxt = addTxt.GetComponent<RectTransform>();
Time.timeScale = 1.0f;
cardList = new List<GameObject>();
//namelist = new List<GameObject>();
// 12๊ฐ์ ์นด๋ ์์ฑ
// ์นด๋ sprite๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ฃ์ด์ค
if (scene.name == "EasyScene")
{
for (int i = 0; i < 12; ++i)
{
// ์นด๋๋ 12๊ฐ ์์ฑ๋์ด์ผ ํ๋๋ฐ sprite๋ 6๊ฐ
// 2๊ฐ์ ์นด๋๋ ๊ฐ์ ์นด๋์ฌ์ผ ํ๋ฏ๋ก
if (i % 2 == 0) // 0, 2, 4, 6, 8, 10 ์ผ๋๋ง sprite๊ฐ ๋ฐ๋
{
tempSprite = sprites[i / 2];
tempSpriteNum = i / 2;
}
GameObject newCard = Instantiate(card);
newCard.transform.parent = GameObject.Find("Cards").transform;
float x = (i / 3) * 1.4f - 2.1f;
float y = (i % 3) * 1.4f - 3.0f;
newCard.transform.position = new Vector3(x, y, 1);
points.Add(new Vector3(x, y, 1));
newCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite = tempSprite;
newCard.GetComponent<Card>().spriteNum = tempSpriteNum; // card์ spriteNum ๋ฃ์ด์ฃผ๊ธฐ
cardList.Add(newCard); // List์ ์์ฑํ ์นด๋ ๋ฃ์ด์ฃผ๊ธฐ
}
}
else
{
for (int i = 0; i < 24; ++i)
{
// ์นด๋๋ 12๊ฐ ์์ฑ๋์ด์ผ ํ๋๋ฐ sprite๋ 6๊ฐ
// 2๊ฐ์ ์นด๋๋ ๊ฐ์ ์นด๋์ฌ์ผ ํ๋ฏ๋ก
if (i % 2 == 0) // 0, 2, 4, 6, 8, 10 ์ผ๋๋ง sprite๊ฐ ๋ฐ๋
{
tempSprite = sprites[i / 2];
tempSpriteNum = i / 2;
}
GameObject newCard = Instantiate(card);
newCard.transform.parent = GameObject.Find("Cards").transform;
newCard.transform.parent.localScale = new Vector3(0.8f, 0.8f, 1f);
newCard.transform.position = new Vector3(0, -1.5f, 1);
float x = (i / 6) * 1.4f - 2.1f;
float y = (i % 6) * 1.1f - 4.2f;
points.Add(new Vector3(x, y, 1));
newCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite = tempSprite;
newCard.GetComponent<Card>().spriteNum = tempSpriteNum; // card์ spriteNum ๋ฃ์ด์ฃผ๊ธฐ
cardList.Add(newCard); // List์ ์์ฑํ ์นด๋ ๋ฃ์ด์ฃผ๊ธฐ
}
}
// ์นด๋ ์๊ธฐ
for (int i = 0; i < cardList.Count; i++)
{
int randomNum = Random.Range(0, cardList.Count);
// swap
Vector3 tempPosition = points[i];
points[i] = points[randomNum];
points[randomNum] = tempPosition;
}
if (scene.name == "EasyScene")
for (int i = 0; i < cardList.Count; ++i)
cardList[i].transform.position = points[i];
}
- newCard.transform.parent.localScale = new Vector3(0.8f, 0.8f, 1f); ๋ถ๋ชจ ์ค์ผ์ผ ๋ณ๊ฒฝ
- ์ด์ง, (๋ ธ๋ง,ํ๋) ์นด๋ ๋ฐฐ์น์ ๋ฐ๋ผ ๋ฐ๋ก ๊ตฌ์ฑ
4. ์ด๋ฏธ์ง๊ฐ 12๊ฐ๋ก ๋์ด๋๋ฉด์ Substring ์ฝ๋
์ด๋ฏธ์ง๊ฐ 1~6 ์์ 1~12๋ก ๋์ด๋์ substring ์์ ์ค๋ณต์ด ์ผ์ด๋์
์ด๋ฏธ์ง ํ์ผ๋ค์ด๋ฆ์ ์์ ํ์ต๋๋ค.
Gamemanager.cs
Gamemanager.cs
namelist[check].SetActive(false);
check = int.Parse(info.Substring(info.Length - 1)) - 1; // rtanx ์ x๋ถ๋ถ ์๋ฅด๊ธฐ, int ๋ก ๋ณํ
// ๋ฐฐ์ด์ 0๋ถํฐ ์์ํ๋ฏ๋ก -1
namelist[check].SetActive(true); // Active True
StartCoroutine(nActiveFalse(check));
5. ์นด๋ ๋ฑ์ฅ ํจ๊ณผ
์นด๋ ๋ฑ์ฅํจ๊ณผ -> ์ ๋๋ฉ์ด์
? ํ๋์ฉ? -> movetowards
์๊ฐํ๋ ์นด๋ ๋ฑ์ฅ ํจ๊ณผ : ํธ๋ผํ์นด๋ ์ฒ๋ผ ํ ์ ์์ ๋ชจ๋ ์นด๋๊ฐ ๋๋ ์ง๋ ๊ทธ๋ฆผ.
-> ์ฝ๋๋ก ๊ตฌํํด๋ณด์ -> ๊ฒ์ -> movetowards ํ์ฌ์์น์์ ๋ชฉํ์์น๊น์ง ์ด๋ Update ์์ ์ฌ์ฉ
์์น๊ฐ์ด start์์ ์ ํด์ง๋ค. -> vector ๋ list๋ก ๊ฐ๋ฅํ ๊น? (๊ฐ๋ฅ) -> ์์น๊ฐ์ vector[i] ์ ์ ์ฅ
->์ด๋ํ๋ ํจ์ movetowards
GameManager.cs
GameManager.cs
void Start()
{
for (int i = 0; i < 24; ++i)
{
// ์นด๋๋ 12๊ฐ ์์ฑ๋์ด์ผ ํ๋๋ฐ sprite๋ 6๊ฐ
// 2๊ฐ์ ์นด๋๋ ๊ฐ์ ์นด๋์ฌ์ผ ํ๋ฏ๋ก
if (i % 2 == 0) // 0, 2, 4, 6, 8, 10 ์ผ๋๋ง sprite๊ฐ ๋ฐ๋
{
tempSprite = sprites[i / 2];
tempSpriteNum = i / 2;
}
GameObject newCard = Instantiate(card);
newCard.transform.parent = GameObject.Find("Cards").transform;
newCard.transform.parent.localScale = new Vector3(0.8f, 0.8f, 1f);
newCard.transform.position = new Vector3(0, -1.5f, 1);
float x = (i / 6) * 1.4f - 2.1f;
float y = (i % 6) * 1.1f - 4.2f;
points.Add(new Vector3(x, y, 1));
newCard.transform.Find("Front").GetComponent<SpriteRenderer>().sprite = tempSprite;
newCard.GetComponent<Card>().spriteNum = tempSpriteNum; // card์ spriteNum ๋ฃ์ด์ฃผ๊ธฐ
cardList.Add(newCard); // List์ ์์ฑํ ์นด๋ ๋ฃ์ด์ฃผ๊ธฐ
}
for (int i = 0; i < cardList.Count; i++)
{
int randomNum = Random.Range(0, cardList.Count);
// swap
Vector3 tempPosition = points[i];
points[i] = points[randomNum];
points[randomNum] = tempPosition;
}
}
void Update()
{
if (isRunning)
{
float addy = transaddtxt.anchoredPosition.y; // addtxt ์์น
addy += 0.5f; // addtxt y๊ฐ ์์น
transaddtxt.anchoredPosition = new Vector2(0, addy); // addtxt y๊ฐ ์์น
//Vector3 speed = Vector3.zero;
if (scene.name != "EasyScene" && !isShuffle)
{
for (int i = 0; i < points.Count; i++)
{
if (cardList[i])
{
cardList[i].transform.position =
//Vector3.MoveTowards(cardList[i].transform.position, points[i], 0.01f);
//Vector3.SmoothDamp(cardList[i].transform.position, points[i], ref speed, 0.05f);
Vector3.Lerp(cardList[i].transform.position, points[i], 0.05f);
//Vector3.Slerp(cardList[i].transform.position, points[i], 0.01f);
}
}
}
if (time > 2)
{
isShuffle = true;
}
}
}
- ํน์ ์ง์ ์ผ๋ก ์ค๋ธ์ ํธ ์ด๋
- Vector3.MoveTowards(ํ์ฌ ์์น, ๋ชฉํ ์์น, ์๋ ฅ)
- SmoothDamp (ํ์ฌ์์น, ๋ชฉํ์์น, ์ฐธ์กฐ ์๋ ฅ, ์์ ์๊ฐ)
- Lerp (ํ์ฌ ์์น, ๋ชฉํ ์์น, ๋ณด๊ฐ ํ ์์น) ๋ ์ ํ๋ณด๊ฐ์ ์ด์ฉํ ์ด๋ ํจ์
- Slerp (ํ์ฌ ์์น, ๋ชฉํ ์์น, ๋ณด๊ฐ ๊ฐ๊ฒฉ) ์ ๊ตฌ๋ฉด ๋ณด๊ฐ์ ์ด์ฉ
6. ์ ๋ฆฌ
Coroutine ๋ ๊น๊ฒ ์์๋ณด๊ธฐ.
๋์ด๋ ๋๋๋ ์ ๋ต์ ๊ฐ๊น์ด ๋ฐฉ๋ฒ์ ๋ฌด์์ผ๊น?
24์ฅ ๋ฐฐ์ด -> ํฌ๊ธฐ ์กฐ์ -> ์ ๋๋ฉ์ด์ ์์ scale 1.3 ๊ณ ์ -> ๋ถ๋ชจ ์ค์ผ์ผ์์ scale ๋ณํ ์ด๋ฏธ์ง๊ฐ 12๊ฐ๋ก ๋์ด๋๋ฉด์ Substring ์ฝ๋ -> ์ด๋ฏธ์ง ์ด๋ฆ ๋ณ๊ฒฝ์ผ๋ก ํด๊ฒฐ
์นด๋ ๋ฑ์ฅํจ๊ณผ -> movetowards
[Unity] TIL 3
๋๊ธ๋จ๊ธฐ๊ธฐ