ClueBall Wiki - UAVisonline/Portfolio GitHub Wiki

BGM Game

๋ณด๋“œ๊ฒŒ์ž„ 'Clue'์™€ '์ˆซ์ž์•ผ๊ตฌ'๋ฅผ ๊ฒฐํ•ฉํ•œ ๊ฒŒ์ž„์„ ์ œ์ž‘, ์ด๋ฅผ 2๊ฐ€์ง€ UI๋กœ ํ”Œ๋ ˆ์ดํ•ด ์„ ํ˜ธ๋„๋ฅผ ์กฐ์‚ฌํ•˜๋Š” HCI ํ”„๋กœ์ ํŠธ

ํ•ด๋‹น ๊ฒŒ์ž„์€ 'Clue'์™€ '์ˆซ์ž์•ผ๊ตฌ'๋ฅผ ๊ฒฐํ•ฉํ•œ ๋””์ž์ธ์œผ๋กœ, ํ”Œ๋ ˆ์ด์–ด๋Š” ์ผ์ • ๊ธฐํšŒ๋งŒํผ ์ถ”๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•ด ์šฉ์˜์ž, ๋ฒ”ํ–‰๋„๊ตฌ, ๋ฒ”ํ–‰์žฅ์†Œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š”๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ๊ณผ์ •์€ ์ˆซ์ž์•ผ๊ตฌ ์‹์œผ๋กœ ์ง„ํ–‰๋˜๋ฉฐ, ๊ธฐํšŒ๊ฐ€ ์ „๋ถ€ ์†Œ์ง„๋˜๊ฑฐ๋‚˜ ์ •๋ณด๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ์ตœ์ข…์ถ”๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•ด ์ •๋‹ต์„ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์–ป์—ˆ๋˜ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด Note๊ฐ€ ์ œ๊ณต๋˜์–ด ํ”Œ๋ ˆ์ด์–ด๋Š” ์ด๋ฅผ ์ด์šฉํ•ด ์ด์ „ ์ •๋ณด๋ฅผ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๋Š” ์—ฌ๊ธฐ์„œ 2๊ฐ€์ง€ UI๋ฅผ ์ด์šฉํ•ด ๊ฒŒ์ž„์„ ํ”Œ๋ ˆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” 2022๋…„ 4์›” HCI๋ฅผ ์ˆ˜๊ฐ•ํ•˜๋ฉด์„œ ์ฃผ์ œ๋ฅผ ์ง์ ‘ ์„ ์ •ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ, 'UI๊ฐ„ ์„ ํ˜ธ๋„'๋ผ๋Š” ์ฃผ์ œ๋ฅผ ์„ ์ •ํ•˜๊ณ  ์ด๋ฅผ ์กฐ์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ง„ํ–‰, ์™„๋ฃŒํ•œ ๊ฒŒ์ž„ ํ”„๋กœ์ ํŠธ์ด๋‹ค.

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ทธ๋ž˜ํ”ฝ ์š”์†Œ์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ UnityAsset์„ ํ™œ์šฉํ–ˆ์œผ๋ฉฐ, ์œ ์ € ์Šคํ„ฐ๋””๋ฅผ ์œ„ํ•ด ๋‹จํ†ก๋ฐฉ์— ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

  • Bags & boxes icons, Character avatar icons windows, fairytale icons megapack windows
  • fantasy icons megapack, modern tools icons, monsters avatar icons windows
  • fantasy gui, GUI PRO Kit - Sci Fi

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

  • ๋‘ ๊ฐ€์ง€ UI๋ฅผ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋Š”๊ฐ€?

  • ๋ฒ„ํŠผ ๋‚ด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋Š”๊ฐ€?

  • ์ •๋ณด Note๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€?

  • ํ”„๋กœ์ ํŠธ์—์„œ ์•„์‰ฌ์šด ์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

๋‘ ๊ฐ€์ง€ UI๋ฅผ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋Š”๊ฐ€?

1. UI ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ์ž‘์—… ๋ฐ Script ์ƒ์† (InterfaceManager Script ๋ฐ ์ด๋ฅผ ์ƒ์†๋ฐ›์€ Script)

Game์—์„œ๋Š” ๊ธฐ๋ณธํ˜•, ๋ฐฉํ–ฅํ˜• ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ํ”Œ๋ ˆ์ด์–ด๋Š” ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•  ๋•Œ ์–ด๋–ค ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ์„ ํƒํ•ด ํ”Œ๋ ˆ์ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฒ„ํŠผ์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅผ ๋ฟ, ๊ทธ ์™ธ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ถ€๋ชจ InterfaceManager Script๋ฅผ ์ž‘์„ฑ, ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • 9๊ฐœ์˜ Button UI Script ๋ณ€์ˆ˜

  • ์œ„ Button์„ ์ „๋ถ€ SetActiveFalseํ•˜๋Š” ํ•จ์ˆ˜ ( set_active_false )

  • ์ถ”๋ฆฌ ๋ฒ„ํŠผ์— ๋Œ€ํ•ด button ์ƒํ˜ธ์ž‘์šฉ์„ ๊บผ๋ฒ„๋ฆฌ๋Š” ํ•จ์ˆ˜ ( set_interactable_false_first_button, set_interactable_false_eighth_button )

  • Button UI์— ๋Œ€ํ•ด CommandObject ๊ธฐ๋Šฅ์„ ํ• ๋‹นํ•˜๋Š” ํ•จ์ˆ˜ ( set_button_event(int index, CommandObject value, string str="") )

์œ„ Script์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ธฐ๋ณธ์ ์ธ ์ฒญ์‚ฌ์ง„์„ ๋งŒ๋“ค์—ˆ์œผ๋ฉด ๊ฐ UI interface๋Š” ์œ„ Script๋ฅผ ์ƒ์†๋ฐ›์•„ ์ œ์ž‘ํ•œ๋‹ค. ์ด ๋•Œ ์œ„ ๊ธฐ๋Šฅ์„ interface Script๊ฐ€ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น function์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด ๋งž์ถค ๋ณ€๊ฒฝํ•ด์ฃผ๋„๋ก ํ•œ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ํ‘œ์ค€ํ˜• interface Script(StandardInterfaceManager Script)๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€๋‹ค.

33  public void set_number_of_choice(int value) // y_pos ์„ค์ •์„ ์œ„ํ•œ ํ•จ์ˆ˜ (์ „์ฒด ๋ณด๊ธฐ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค)

39  public override void set_button_event(int index, CommandObject value, string str = "") // ์˜ค๋ฒ„๋ผ์ด๋”ฉ
    {
        ........
        int tmp = current_button;
        if(index==9) // back button์— ๋Œ€ํ•œ ๊ฒฝ์šฐ
        {
            tmp = 9;
        }
        else // ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ
        {
            current_button++;
        }

        switch (tmp)
        {
            case 1:
                first_button.GetComponent<RectTransform>().anchoredPosition = new Vector2(0.0f, y_pos);
                first_button.set_command_object(value, str);
                break;
            case 2:
                second_button.GetComponent<RectTransform>().anchoredPosition = new Vector2(0.0f, y_pos);
                second_button.set_command_object(value, str);
                break; ....

์œ„ 2๊ฐœ์˜ function์€ StandardInterface์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, 39 Line์€ ๊ธฐ์กด Button UI์— Command Object๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด Button UI์˜ ์œ„์น˜๋„ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€์œผ๋ฉฐ ์ด๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ button UI๋ฅผ ๋ช‡ ๊ฐœ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ฐ›๋Š” set_number_of_choice function์„ ์ œ์ž‘ํ•˜์˜€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐฉํ–ฅํ˜• interface Script(DirectionalInterfaceManager Script)๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜์˜€๋‹ค.

29  public override void set_active_false()
    {
        base.set_active_false();
        back_button.gameObject.SetActive(false); // Back Button False (Directional Interface๋Š” ๋”ฐ๋กœ BackButton์„ Button UI๋กœ ์‚ฌ์šฉ)
        Circle.SetActive(false); // Circle Obejct False
    }

    public override void set_button_event(int index, CommandObject value, string str = "")
    {
        if(index!=0) 
        {
            if(Circle.activeSelf==false)
            {
                Circle.SetActive(true);// ๊ฐ€์‹œ์„ฑ Object๋ฅผ True ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ
            }
        }

        switch (index)
        {
            case 0:
                back_button.set_command_object(value, str, false); // BackButton ํ• ๋‹น
                break;
            case 1:
                first_button.set_command_object(value, str, false);
                break;
            case 2:
                second_button.set_command_object(value, str, false);
                break; ...

Directional Interface Script๋Š” ๋ถ€๋ชจ Script์˜ ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•ด ์ž๊ธฐ ์ž์‹ ์ด ํ•„์š”ํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ, set_active_falseํ•จ์ˆ˜๋Š” backButtonUI์™€ Circle Object๋ฅผ ๋น„ํ™œ์„ฑํ™” ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ–ˆ์œผ๋ฉฐ, set_button_eventํ•จ์ˆ˜๋Š” backButtonUI๊ฐ€ ์•„๋‹Œ UI๋ฅผ ํ• ๋‹นํ•  ๋•Œ ๊ฐ€์‹œ์„ฑ์„ ์œ„ํ•ด ๋งŒ๋“ค์—ˆ๋˜ Circle Object๋ฅผ ํ™œ์„ฑํ™” ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.


2. GameManager๋ฅผ ํ†ตํ•œ UI interface ์„ ํƒ ์‹คํ–‰(GameManager Script)

์œ„ UI๋ฅผ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•  ๋•Œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ์šฐ์„  Player๊ฐ€ ๋ฌด์Šจ UI๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€ ์‹œ์Šคํ…œ์€ ๊ธฐ๋กํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๊ฒŒ์ž„ ์ „์ฒด์— ์žˆ์–ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” GameManager Script๋‚ด ์•„๋ž˜ ๋‚ด์šฉ์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

40  private Interface_mode interface_mode;

42  [SerializeField] private GameObject mainScreenCanvas;
    [SerializeField] private GameObject standardInterfaceCanvas;
    [SerializeField] private GameObject directionInterfaceCanvas;
...
158 public void set_interface_mode(Interface_mode value)
    {
        interface_mode = value;
        mainScreenCanvas.SetActive(false); // Mainํ™”๋ฉด Off

        switch(interface_mode) // Interface mode์— ๋”ฐ๋ฅธ InterfaceCanvas ์ƒํƒœ ์„ค์ •
        {
            case Interface_mode.standard:
                standardInterfaceCanvas.SetActive(true);
                directionInterfaceCanvas.SetActive(false);
                break;
            case Interface_mode.direction:
                standardInterfaceCanvas.SetActive(false);
                directionInterfaceCanvas.SetActive(true);
                break;
        }
    }
...

์œ„ ๋‚ด์šฉ 40 Line์—์„œ ์–ด๋–ค Interface๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€ ์ €์žฅํ•˜๋ฉฐ, 42~44 Line์—์„œ ํ•ด๋‹น Interface Object ๋ฐ ๋ฉ”์ธํ™”๋ฉด Object๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. ๊ทธ ๋’ค Interface mode๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฒ„ํŠผ์—์„œ ์œ„ set_interface_mode์„ ํ˜ธ์ถœํ•œ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ๋Š” Mainํ™”๋ฉด์„ ์ข…๋ฃŒํ•˜๊ณ  interface ์ข…๋ฅ˜์— ๋งž๋Š” Canvas๋ฅผ ActiveTrueํ•˜์—ฌ ์‹ค์ œ ๊ฒŒ์ž„์— ์žˆ์–ด์„œ ํ•ด๋‹น Interface๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
InterfaceImage

๋ฒ„ํŠผ ๋‚ด ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋Š”๊ฐ€?

1. Button๊ณผ CommandObject (CommandObject Script ๋ฐ ButtonUI Script)

Game์—๋Š” Interface ์„ ํƒ ์™ธ์—๋„ ํŽ˜์ด์ง€ ์ด๋™, ๋’ค๋กœ๊ฐ€๊ธฐ, ์šฉ์˜์ž/๋ฒ”ํ–‰์žฅ์†Œ/๋ฒ”ํ–‰๋„๊ตฌ ์„ ํƒ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์š”ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ์ค‘ ์ผ๋ถ€ ๋ฒ„ํŠผ์˜ ๊ธฐ๋Šฅ๋“ค์€ Interface Canvas ๋‚ด ์กด์žฌํ•˜๋Š” Button์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ Interface์˜ Button์„ ๊ธฐ๋Šฅ๋งˆ๋‹ค ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ๋ชจ๋˜๋ฉฐ ๊ด€๋ฆฌ๋„ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ๊ฐœ์˜ Button์—์„œ ๊ธฐ๋Šฅ์„ ๊ต์ฒดํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋ฉฐ ์ด๋ฅผ ์œ„ํ•ด Button์— ๋„ฃ์„ ๊ธฐ๋Šฅ์€ ์ „๋ถ€ ๋™์ผํ•œ Script ์ƒ์†์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

public interface Command // Design Pattern - Command
{
    void execute();

    //void de_execute();
}

public abstract class CommandObject : MonoBehaviour, Command
{
    abstract public void execute();

    //abstract public void de_execute();
}

Button์— ๋„ฃ์–ด์„œ ์‚ฌ์šฉํ•  ๊ธฐ๋Šฅ์„ ์œ„ Script์˜ Design Pattern - Command๋ฅผ ์ด์šฉํ•ด ์ œ์ž‘, ํด๋ž˜์Šค CommandObject๋ฅผ ์ •์˜ํ•˜์—ฌ Button์˜ ๊ธฐ๋Šฅ์„ CommandObject๋ฅผ ์ƒ์†๋ฐ›์•„ execute ํ•จ์ˆ˜๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์ค‘ Interface์— ๋”ฐ๋ผ Button์˜ ๊ธฐ๋Šฅ์„ ๊ต์ฒดํ•˜๋Š” ๊ฒƒ์€ ButtonCommandObject๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ์ด๋ฅผ ์ด์šฉํ•ด ์•„๋ž˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

  • ๋’ค๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ (BackSpace_Command Script)
  • ์šฉ์˜์ž/๋ฒ”ํ–‰๋„๊ตฌ/์žฅ์†Œ ์„ ํƒ ๊ธฐ๋Šฅ (Human_Command, Place_Command, Tool_Command Script)
  • ๋‹จ์ˆœ Page ์ด๋™ ๊ธฐ๋Šฅ (ActiveCommand Script)

๊ทธ๋ฆฌ๊ณ  Interface Canvas์— ์กด์žฌํ•˜๋Š” ๋‹ค์–‘ํ•œ Button๋“ค์€ ์•„๋ž˜ Script์˜ set_command_object ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด CommandObject์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, click_event ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์‹คํ–‰์กฐ๊ฑด์ด ๋งž๋Š” ๊ฒฝ์šฐ CommandObject์˜ execute ๊ธฐ๋Šฅ์„ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    public void click_event()
    {
        //Debug.Log(this.gameObject.name);

        if (command_object!=null && GameManager.gamemanager.get_pause()==false) // ์ผ์‹œ์ •์ง€ ์‹œ ์ž…๋ ฅ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ˆ˜์ •
        {
            GameManager.gamemanager.click_play(); // ํด๋ฆญ ์†Œ๋ฆฌ ์žฌ์ƒ
            interface_manager.set_active_false(); // Canvas ๋‚ด ๋ฒ„ํŠผ ์˜ค๋ธŒ์ ํŠธ ๋น„ํ™œ์„ฑํ™”
            command_object.execute(); // Command Objecct ๊ธฐ๋Šฅ ์‹คํ–‰
        }
    }

    public void set_command_object(CommandObject value, string str, bool number_marking = true)
    {
        command_object = value; // command obejct ํ• ๋‹น
        set_text(str, number_marking); // ๋ฒ„ํŠผ text ์„ค์ • (์ˆซ์ž๋„ ๋ณด์ด๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€?)
        this.gameObject.SetActive(true); // ๋ฒ„ํŠผ Setactive True
    }

ButtonImage

์ •๋ณด Note๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”๊ฐ€?

1.์ •๋ณดNote ๊ตฌํ˜„ ๋ฐ ์‹œ๊ฐํ™”(Information_update Script ๋ฐ Information_List Script)

์ •๋ณดNote๋Š” ํ”Œ๋ ˆ์ด์–ด์˜ ์ด์ „ ์ถ”๋ฆฌ๋ฅผ ํ†ตํ•ด ์–ป์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์†Œ๊ฑฐ๋ฒ•์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๋ฐฐ์ œํ•˜๋Š”๋ฐ ๋ฌด์—‡์„ ๋ฐฐ์ œํ•  ์ง€ ์‹œ๊ฐ์ ์œผ๋กœ ํฐ ๋„์›€์„ ์ฃผ๊ณ  ์žˆ๋‹ค. ์ด๋Š” Information_List Script๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํ•ด๋‹น Script๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์šฉ์˜์ž/๋ฒ”ํ–‰๋„๊ตฌ/๋ฒ”ํ–‰์žฅ์†Œ์™€ ๊ฐ™์€ ScriptableObject List ๋ฐ ๊ฐ ์นดํ…Œ๊ณ ๋ฆฌ์— ํ•ด๋‹นํ•˜๋Š” Information_update Script
  • ์œ„ List ๋‚ด๋ถ€ ScriptableObject ์•ˆ์— ์žˆ๋Š” ์ง€์—ญ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜
  • ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ScriptableObject ๋‚ด ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํ•จ์ˆ˜ (init_information)
  • ํ”Œ๋ ˆ์ด์–ด์˜ ์ถ”๋ฆฌ๊ฒฐ๊ณผ์— ๋”ฐ๋ฅธ ScriptableObject ์ง€์—ญ๋ณ€์ˆ˜ auto_cacl์„ ์„ค์ •ํ•˜๋Š” ํ•จ์ˆ˜ (zero_match, more_match)

์œ„ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‹œ์Šคํ…œ์€ ํ”Œ๋ ˆ์ด์–ด์˜ ์ถ”๋ฆฌ๋ฅผ ScriptableObject ๋‚ด auto_cacl ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๊ธฐ๋กํ•ด์ค„์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์ด๋Ÿฌํ•œ ์ •๋ณด Note๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋‚ด๋ถ€ Information_update Script๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€๋Šฅํ•œ๋ฐ ํ•ด๋‹น Script์•ˆ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

20  public void set_information_computer(int index, information value) // Computer๊ฐ€ ์„ค์ •ํ•œ ์ •๋ณด๊ฐ’์„ ๋ฐ˜์˜ (Sprite ๋ณ€๊ฒฝ)
    {
        computer_informations[index] = value;
        switch (value)
        {
            case information.none:
                computer_information_image[index].sprite = none;
                break;
            case information.wondering:
                computer_information_image[index].sprite = wondering;
                break;
            case information.not_this:
                computer_information_image[index].sprite = not_this_one;
                break;
            case information.this_one:
                computer_information_image[index].sprite = this_one;
                break;
        }
    }

ํ•ด๋‹น ์ฝ”๋“œ์—์„œ computer_information_image๋Š” ๊ฐ ScriptableObject์— ๋Œ€ํ•œ ์ถ”๋ฆฌ ์ •๋ณด๋ฅผ ์ด๋ฏธ์ง€๋กœ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๊ฒฐ๋˜์—ˆ์œผ๋ฉฐ, ์œ„ set_information_computer ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํŠน์ • index ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. Information_list Script ๋‚ด init_information, zero_match, more_match ํ•จ์ˆ˜์—์„œ ์ด๋ฅผ ํ˜ธ์ถœ, ๊ฐฑ์‹ ๋œ ์ถ”๋ฆฌ ์ •๋ณด๋ฅผ ์‹œ๊ฐํ™”ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์‹œ์Šคํ…œ์ด ๊ณ„์‚ฐํ•œ ์ถ”๋ฆฌ ๊ฒฐ๊ณผ๋งŒ์„ ๋ฐ˜์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ”Œ๋ ˆ์ด์–ด๋Š” ์ด๊ฒƒ๋งŒ์„ ์ด์šฉํ•ด์„œ ์†Œ๊ฑฐ๋ฒ•์„ ์ง„ํ–‰ํ•˜๊ธฐ๋Š” ํž˜๋“ค๋‹ค. ๋”ฐ๋ผ์„œ Information_Update Script ๋‚ด ํ”Œ๋ ˆ์ด์–ด์˜ ์ •๋ณด๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š” Child_information_Update Script๋ฅผ List ํ˜•ํƒœ๋กœ ์ฐธ์กฐํ•ด์ฃผ๋„๋กํ•œ๋‹ค.

Child_information_Update Script๋Š” Unity EventSystem์„ ์ด์šฉํ•ด ์ด๋ฏธ์ง€ ํด๋ฆญ์ด ๊ฐ์ง€๋˜๋ฉด ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ ํ”Œ๋ ˆ์ด์–ด๋Š” ์ด๋ฅผ ์ด์šฉํ•ด ์ •๋ณด๋ฅผ ์ž์‹ ์ด ์›ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์†Œ๊ฑฐ๋ฒ•์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

InformationNoteImage1


2.๊ฐ ํŽ˜์ด์ง€์— ๋”ฐ๋ฅธ ์‹œ๊ฐํ™”(Information_List Script)

Game์—์„œ๋Š” ์ •๋ณดNote์— ์ ‘๊ทผํ•˜๋Š” Page์™ธ์—๋„ ์ตœ์ข…์ถ”๋ฆฌ์— ์žˆ์–ด์„œ ์ง€๊ธˆ๊นŒ์ง€ ๊ธฐ๋กํ•œ ์ •๋ณด ์ผ๋ถ€๋ฅผ ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฅผ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์„ ๋” ์žก์•„๋จน์„ ๋ฟ๋”๋Ÿฌ ์ •๋ณด๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ด€๋ฆฌ ๋ถ€๋ถ„์—์„œ๋„ ํ›จ์”ฌ ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด๋ฅผ Information_List Script๋Š” ์•„๋ž˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด Animator๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค.

209 public void set_visualize(bool value) // ์ •๋ณด Note๋ฅผ Animator๋ฅผ ์ด์šฉํ•ด ๋ณด์ผ์ง€ ์•ˆ๋ณด์ผ์ง€ ์„ค์ •
    {
        if(animator!=null)
        {
            animator.SetBool("Visualize", value);
        }
    }

    public void start_animation(string value) // value ์ด๋ฆ„์„ ๊ฐ€์ง„ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ Animator์—์„œ ์žฌ์ƒ
    {
        if(animator!=null)
        {
            animator.Play(value, -1, 0.0f);
        }
    }

์ด ํ•จ์ˆ˜๋Š” GameManager Script์—๋„ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ ํŽ˜์ด์ง€๊ฐ€ ์ด๋™๋  ๋•Œ ์ •๋ณดNote๊ฐ€ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ์ˆœ๊ฐ„์—๋Š” GameManager ๋‚ด set_visualize ํ•จ์ˆ˜๋ฅผ ์ƒˆ๋กœ Open๋˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ํ˜ธ์ถœํ•˜๋ฉฐ, ์ผ๋ถ€ ์ •๋ณด๋งŒ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ์ˆœ๊ฐ„์—๋Š” GameManager ๋‚ด information_animation_start ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ํŽ˜์ด์ง€ ์œ„์น˜์— ๋”ฐ๋ผ ์ •๋ณด Note์˜ ํŠน์ • ๋ถ€๋ถ„์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

InformationNoteImage2

ํ”„๋กœ์ ํŠธ์—์„œ ์•„์‰ฌ์› ๋˜ ์ ์€ ๋ฌด์—‡์ธ๊ฐ€?

๊ธฐ๋ณธ์ ์œผ๋กœ ButtonCommandObject๋ฅผ ์ƒ์†๋ฐ›์€ Script๋“ค์€ ๋ชจ๋‘ ๊ฒŒ์ž„ ์ง„ํ–‰์— ์žˆ์–ด์„œ ์‚ฌ์šฉ์ด ๋˜๋ฉฐ, ์ด๋Ÿฌํ•œ ์ง„ํ–‰์€ ๋ชจ๋‘ ํŽ˜์ด์ง€ ์ด๋™์„ ์ˆ˜๋ฐ˜ํ•˜๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์ „ ํŽ˜์ด์ง€๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  ์ƒˆ ํŽ˜์ด์ง€๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ๋ฐ ์ด๋ฅผ off_gameobjects, on_gameobjects๋ผ๋Š” GameObject List์— ์—ฐ๊ฒฐํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ƒ์†๋ฐ›์€ Script๋“ค์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ „๋ถ€ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•œ Script๋ฅผ ํ•˜๋‚˜ ๋” ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ์ƒ์†๋ฐ›์•„ ์ž‘์„ฑํ–ˆ์œผ๋ฉด ์ค‘๋ณต๋œ ๊ธฐ๋Šฅ์„ ๋งค Script๋งˆ๋‹ค ์ž‘์„ฑํ•˜๋Š” ์ผ์€ ์ƒ๊ธฐ์ง€ ์•Š์•˜์„ ๊ฒƒ์ด๋‹ค.

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