BGM Game Wiki - UAVisonline/Portfolio GitHub Wiki

BGM Game

4์ง€์„ ๋‹ค BGM ๋งž์ถ”๊ธฐ Game

4์ง€์„ ๋‹ค BGM ๋งž์ถ”๊ธฐ Game์€ ๋‹ค์–‘ํ•œ ๊ฒŒ์ž„์˜ ์œ ๋ช… BGM์ด ์žฌ์ƒ๋˜๋ฉด 4์ง€์„ ๋‹ค ์„ ํƒ์ง€๋ฅผ ์ด์šฉํ•ด ๊ฒŒ์ž„ ์ œ๋ชฉ์„ ๋งž์ถ”๋Š” Game์ด๋‹ค. ํ•ด๋‹น Game์€ Practice mode ๋ฐ Arcade mode๊ฐ€ ์กด์žฌํ•˜๋ฉฐ Practice๋Š” ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๊ทธ๋งŒ๋‘๊ณ  ์‹ถ์„ ๋•Œ๊นŒ์ง€ ๊ฒŒ์ž„ ์ œ๋ชฉ์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋Š” mode์ด๋ฉฐ, Arcade๋Š” 30๊ฐœ์˜ ๋ฌธ์ œ๋ฅผ ์‹œ์Šคํ…œ์ด ๊ฐ€์ ธ์˜ค๊ณ  ํ”Œ๋ ˆ์ด์–ด๋Š” ์ด๋ฅผ ๋งž์ถ”์–ด์„œ ๋ช‡ ๋ฌธ์ œ๋ฅผ ๋งž์ถ”๋Š”์ง€ ํ™•์ธํ•˜๋Š” mode์ด๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” 2020๋…„ 2์›” ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์—ฌ ํ‹€(๊ฒŒ์ž„ ์‹œ์Šคํ…œ ๋ฐ ์ฝ˜ํ…์ธ  ํ…œํ”Œ๋ฆฟ)์„ ์ œ์ž‘, ๊ทธ ํ›„ ์ฝ˜ํ…์ธ  ์ถ”๊ฐ€ ๋ฐ ๊ฒŒ์ž„ Scene์—์„œ ์‹œ์Šคํ…œ์„ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด UI๋ฅผ ์ถ”๊ฐ€, ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์„ ์™„๋ฃŒํ–ˆ๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ด€๋ จ ์Œ์•… ์žฌํ‚ท ๋ฐ ์Œ์› ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์ถ”์ถœ, ํŽธ์ง‘ํ–ˆ์œผ๋ฉฐ, ํ”„๋กœ์ ํŠธ ์™„๋ฃŒ ํ›„ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด ํ™•์‹คํ•œ ๋ฐฐํฌ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ง„ํ–‰ํ•˜์ง€ ์•Š์•˜๋‹ค.

  • ์Œ์•… ์žฌํ‚ท : ์ŠคํŒ€ ๋ฐ ๊ตฌ๊ธ€ Image๋ฅผ ํ†ตํ•ด ์ด๋ฏธ์ง€ ์žํ‚ท ์ถ”์ถœ
  • ์Œ์› ํŒŒ์ผ : ์œ ํŠœ๋ธŒ ์Œ์•… ์˜์ƒ์„ ์ถ”์ถœ, ํ•ด๋‹น ์˜์ƒ์˜ ์Œ์›์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ํŽธ์ง‘ํ•ด 2์ฐจ ์ถ”์ถœ

ํ•ด๋‹น ์œ„ํ‚ค์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ์•„๋ž˜ ๋‘ ํ•ญ๋ชฉ๋“ค์— ๊ด€ํ•ด ์„œ์ˆ ํ•˜๊ณ ์ž ํ•œ๋‹ค.

  • ๊ฒŒ์ž„ ์‹œ์Šคํ…œ์ด ์ฝ”๋“œ ์ƒ ์–ด๋–ป๊ฒŒ ๋™์ž‘, ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋Š”๊ฐ€?

  • ์ง€๊ธˆ ์ด๋ฅผ ๋ณด๋Š” ์‹œ์ ์—์„œ ํ”„๋กœ์ ํŠธ์˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์€ ์–ด๋””๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฐ€? ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

๊ฒŒ์ž„ ์‹œ์Šคํ…œ์ด ์ฝ”๋“œ ์ƒ ์–ด๋–ป๊ฒŒ ๋™์ž‘, ์ƒํ˜ธ์ž‘์šฉ ํ•˜๋Š”๊ฐ€?

1. Game Resources Load (Problem_Base Script)

Game์„ ์‹คํ–‰ํ•˜๋ฉด ์šฐ์„  Resource folder๋‚ด์— ์žˆ๋Š” ์Œ์•…ํŒŒ์ผ(ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Problem_file Script Component๋ฅผ ๊ฐ€์ง„ ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ)์„ ์ฝ์–ด๋“ค์ด๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ Problem_Base Script์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

34 public int Load(string folder) // Resource Folder๋กœ ๋“ค์–ด๊ฐ€์„œ ์Œ์•… ๋ฌธ์ œ ๋ถˆ๋Ÿฌ์˜ด
   {
      object[] obj = Resources.LoadAll(folder);
      for(int i = 0;i<obj.Length;i++)
      {
        GameObject _gameobject = (GameObject)obj[i];
        _cache[_gameobject.name] = _gameobject;
        Problem_file temp = _gameobject.GetComponent<Problem_file>(); 
      }
      return obj.Length; // ํด๋” ๋‚ด ์˜ค๋ธŒ์ ํŠธ์˜ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜
44 } 
//_cache๋Š” <string,GameObject>ํ˜•ํƒœ Dictionary, string folder๋Š” Resources folder ๋‚ด ์ฝ๊ณ  ์‹ถ์€ folder์˜ ์ด๋ฆ„ 

์ด๋ฅผ ํ†ตํ•ด Problem_Base Script๋Š” ์Œ์•… ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์Šคํฌ๋ฆฝํŠธ๋Š” Start function์—์„œ ๋‚œ์ด๋„ ๋ณ„๋กœ ๋‚˜๋ˆ„์–ด์ง„ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ๋Š”๋‹ค.

90          if (loop == 0) list_size = Load("0_Very_Easy");
            else if (loop == 1) list_size = Load("1_Easy");
            else if (loop == 2) list_size = Load("2_Normal");
            else if (loop == 3) list_size = Load("3_Hard");
            else if (loop == 4) list_size = Load("4_Very_Hard");
            else if (loop == 5) list_size = Load("5_Expert");
96          else if (loop == 6) list_size = Load("6_Nightmare");

๊ทธ ํ›„ Game ์‹คํ–‰์— ์žˆ์–ด์„œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •, ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์‹ค์ œ Game์— ๋Œ์ž…ํ•  ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.


2.๋ณธ ๊ฒŒ์ž„ Scene์—์„œ์˜ ์ž‘๋™ (Problem_Base Script ๋ฐ Button Script๋“ค)

Main_Menu_Button Script์—์„œ๋Š” function 2๊ฐœ(training mode, arcade mode ์ง„์ž…)๋ฅผ ํ†ตํ•ด ๋ณธ ๊ฒŒ์ž„์œผ๋กœ ์ง„์ž…ํ•˜๋ฉฐ ์ด ๋•Œ Problem_Base Singleton์˜ Start_Game function์„ ํ˜ธ์ถœํ•œ ๋’ค Scene์„ Loadํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ ํ›„ Problem_Base์˜ Start_Game function์€ ์ง„์ž…ํ•œ game mode์— ๋”ฐ๋ผ 2๊ฐ€์ง€ Coroutine(Start_Practice, Start_Arcade) ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

449 IEnumerator Start_Arcade() // Arcade mode Coroutine
    {
        while (true)
        {
            if (SceneManager.GetActiveScene().name == "Game") break;
            yield return new WaitForSeconds(Time.deltaTime);
        }

457     GameObject test_obj = GameObject.Find("Only_Test"); // ํ…Œ์ŠคํŠธ์šฉ ์„ค์ • ์˜ค๋ธŒ์ ํŠธ ํƒ์ƒ‰ (UI)
458     test_obj.SetActive(false); // ๊ทธ ํ›„ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ ์ข…๋ฃŒ (arcade mode์—์„œ๋Š” practice mode ์ „์šฉ UI๊ฐ€ ์‚ฌ๋ผ์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ)

460     ScoreManager.score_manager.arcade_text(); // ScoreManager Singleton์— ๋Œ€ํ•ด ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ๋ช‡๋ฒˆ์งธ ๋ฌธ์ œ์ธ์ง€ ํ‘œ๊ธฐํ•˜๋„๋ก ํ•จ
        problem_file = Instantiate(Get(problem_list[list_pos]), Vector2.zero, Quaternion.identity).GetComponent<Problem_file>(); // ์Œ์•… ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ์ƒ์„ฑ
        problem_file.Problem_set(); // ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์ •๋ณด, ํžŒํŠธ, ์„ ํƒ์ง€ ์„ธํŒ… ๋ฐ ์Œ์•… clip์„ Problem_Base Script์—์„œ ํ‘œ์‹œ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •

        jacket_black();
        correct = false;
        solved = false;
        Music_Play();
        yield return new WaitForSeconds(1.0f);
        Directer_machine.directer.set_panel_slide(false);
470 }

์œ„ ์ฝ”๋“œ๋Š” Arcade mode์— ์ง„์ž…ํ•  ๋•Œ ์‹คํ–‰๋˜๋Š” Coroutine์ด๋ฉฐ, Practice mode๋Š” 457~460 Line์˜ ๋‚ด์šฉ๋งŒ ๋ฐ”๋€ Coroutine(Arcade mode UI๋ฅผ ์‚ญ์ œ)์ด ์‹คํ–‰๋˜์–ด Game Scene์— ์ง„์ž…ํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ ํ›„ ํ”Œ๋ ˆ์ด์–ด๋Š” Game Scene์—์„œ Button UI๋ฅผ ์ด์šฉํ•ด Game์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ Button Script์™€ Problem_Base Script์˜ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

  • Answer_Button Script : answer_button(int i) - Problem_Base Script : answer_function(int i) [์ •๋‹ต ์„ ํƒ ๋ฒ„ํŠผ]
  • Answer_Button Script : Hint_Button(int num) - Problem_Base Script : give_a_hint(int num) [ํžŒํŠธ ์ œ๊ณต ๋ฒ„ํŠผ]
  • Answer_Button Script : Pass_Button() - Problem_Base Script : pass_function() [Pass ๊ธฐ๋Šฅ ๋ฒ„ํŠผ]
  • Play_Button Script : Play_Button_Click() - Problem_Base Script : Music_Play() [์Œ์•… ์žฌ์ƒ ๋ฒ„ํŠผ - ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์žฌ์ƒํ•˜๊ธฐ]
  • Play_Button Script : Back_Button_Click() - Problem_Base Script : Music_back_ten_second() [์Œ์•… ๋˜๊ฐ๊ธฐ ๋ฒ„ํŠผ]
  • Answer_Button Script : back_button_click() - Problem_Base Script : Back_Game() & ScoreManager Script : set_initial() [Mainํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ]
  • Answer_Button Script : next_button_click() - Answer_Button Script : next_problem coroutine -> ์ˆ˜๋งŽ์€ ProblemBase Code์™€ ์ƒํ˜ธ์ž‘์šฉ

์ด๋Ÿฌํ•œ ์ƒํ˜ธ์ž‘์šฉ์„ ์ด์šฉํ•ด ํ”Œ๋ ˆ์ด์–ด๋Š” Game์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ด๋ฏธ์ง€๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

BGM Game

ํ”„๋กœ์ ํŠธ์˜ ์ž˜๋ชป๋œ ๋ถ€๋ถ„์€ ์–ด๋””๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฐ€? ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ์ข‹์„๊นŒ?

1. Game ์‹œ์ž‘ ์‹œ Load ๋ฌธ์ œ

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Asset/Resources๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” Problem_Base Script๊ฐ€ Resources๋ฅผ Loadํ•ด ๋‚ด๋ถ€ Dictionary์— ์ €์žฅํ•ด๋‘๋ฏ€๋กœ ๊ทธ ๋’ค์—๋Š” ๋”ฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— Resources file์„ ์˜ฌ๋ ค๋‘˜ ์ด์œ ๊ฐ€ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋ฅผ Unloadํ•˜๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ Problem_Base script๋ฅผ ํ†ตํ•ด ์ด๋ฏธ ๋ถˆ๋Ÿฌ์˜ฌ ์ค€๋น„๊ฐ€ ๋งˆ์นœ ํŒŒ์ผ์„ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋‘๋Š” ์„ฑ๋Šฅ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค.

๋˜ํ•œ ๋ฌธ์ œ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” Problem_File Script๋Š” ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ๋‚ด ์ปดํฌ๋„ŒํŠธ์˜ ํ˜•ํƒœ๋กœ ๋“ค์–ด๊ฐ€ ๊ด€๋ฆฌ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ์ ํŠธ์— ์žˆ์–ด์„œ ํ•„์š”ํ•œ๊ฑด ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ Problem_File ์ปดํฌ๋„ŒํŠธ์ด๋ฉฐ, ๋”ฐ๋ผ์„œ Problem_File Script๋ฅผ ScriptableObject ํ˜•ํƒœ๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ถˆํŽธํ•จ์ด ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜๋ฉฐ, ๊ด€๋ฆฌ ํšจ์œจ์„ฑ๋„ ๋” ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

2. Coroutine ์‹คํ–‰ ์‹œ new WaitforSeconds ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋ฌธ์ œ

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‹ค์–‘ํ•œ Coroutine์„ ํ†ตํ•ด ๊ฒŒ์ž„ ๋ฉ”์ปค๋‹ˆ์ฆ˜(Mainํ™”๋ฉด ์ด๋™, ๊ฒŒ์ž„ mode ์‹คํ–‰, ๋ฌธ์ œ ๊ต์ฒด)๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์— ์žˆ์–ด์„œ ์‹œ๊ฐ„ ๊ด€๋ฆฌ๋ฅผ new WaitforSecond๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋ฃจํ‹ด์ด ์‹คํ–‰๋ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด WaitforSecond ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์„ ์–ธํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋Š” ์„ฑ๋Šฅ์— ์žˆ์–ด์„œ ์ข‹์ง€ ์•Š์€ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

๋‹คํ–‰ํžˆ Mainํ™”๋ฉด ์ด๋™, ๊ฒŒ์ž„ mode ์‹คํ–‰์€ ์ž์ฃผ ์‹คํ–‰๋˜๋Š” Coroutine์ด ์•„๋‹ˆ๋ผ ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์ด ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š์ง€๋งŒ, ๋ฌธ์ œ ๊ต์ฒด๋Š” ์ด๋ณด๋‹ค๋Š” ๋นˆ๋ฒˆํ•˜๊ฒŒ ์‹คํ–‰๋˜๋ฏ€๋กœ ๋งค๋ฒˆ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Script ๋‚ด WaitforSecond ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ ์–ธํ•œ ๋’ค Coroutine์ด ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊พผ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ