사다리타기 만들기!



GameManager.Cs 소스입니다
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;


public class GameManager : MonoBehaviour {

    [Header("LineCanvas")]
    public GameObject[] Line;
    public GameObject[] Verse;
    
    [Header("UpPanel")]
    public Text PersonnelText;
    public Slider slider;

    [Header("MiddlePanel")]
    public GameObject[] Finish;
    public GridLayoutGroup PlayersGl;
    public GameObject[] Player;
    public Player[] PlayerCs;

    [Header("DownPanel")]
    public Dropdown dropdown;
    public InputField[] inputField;

    [Header("OtherPanel")]
    public GameObject BeforeStartPanel;
    public GameObject ResultPanel;
    public Text[] ResultText;
    public GameObject ErrorPanel;
    public GameObject BlindPanel;
    public GameObject DownBlindPanel;

    int peopleNum;
    bool isBlocker;
    bool isEndAll;



#if (UNITY_ANDROID)
    void Awake() { Screen.SetResolution(1080, 1920, false); }
#else
    void Awake() { Screen.SetResolution(540, 960, false); }
#endif


    void Start() { LadderSetting(false); }


    void Update()
    {
        // 추천내기 선택이 끝나면 추천내기 실행
        if (GameObject.Find("Blocker")) isBlocker = true;
        if (isBlocker && !GameObject.Find("Blocker")) { isBlocker = false; Recommand(); }

        // 플레이어가 모두 내려가면 결과창 띄움
        if (isEndAll) return;
        isEndAll = true;
        for (int i = 0; i < peopleNum; i++) if (!PlayerCs[i].isEnd) isEndAll = false;
        if (isEndAll)
        {
            ResultPanel.SetActive(true);
            for (int i = 0; i < peopleNum; i++)
                ResultText[i].text = inputField[PlayerCs[i].finishNum - 1].text;
        }
    }


    // 슬라이더가 바뀔때
    public void LadderSetting(bool isRestart)
    {
        // 다시하기 버튼으로 불러온게 아니라면
        if (!isRestart)
        {
            BeforeStartPanel.SetActive(true);
            DownBlindPanel.SetActive(false);
        }
        ResultPanel.SetActive(false);

        // 인원 수 넣기
        peopleNum = (int)slider.value;
        PersonnelText.text = peopleNum + "명";

        // 끝난 것들 초기화
        for (int i = 0; i < 6; i++) PlayerCs[i].Clear();
        isEndAll = false;

        // 플레이어 정렬
        PlayersGl.enabled = true;

        // 라인, 끝번호, 플레이어, 인풋필드 부모셀, 결과텍스트 부모셀 인원수만큼 활성화
        for (int i = 0; i < 6; i++)
        {
            if (i < peopleNum)
            {
                Line[i].SetActive(true);
                Finish[i].SetActive(true);
                Player[i].SetActive(true);
                inputField[i].transform.parent.gameObject.SetActive(true);
                ResultText[i].transform.parent.gameObject.SetActive(true);
            }
            else
            {
                Line[i].SetActive(false);
                Finish[i].SetActive(false);
                Player[i].SetActive(false);
                inputField[i].transform.parent.gameObject.SetActive(false);
                ResultText[i].transform.parent.gameObject.SetActive(false);

                // 인원수 줄어들때 사라진 부분은 인풋필드가 비워짐
                inputField[i].text = "";
            }
        }

        // 모든 행 비활성화
        for (int i = 0; i < Verse.Length; i++)
            Verse[i].SetActive(false);
        
        // 활성화된 라인들의 7행 중 2~4행을 랜덤하게 활성화
        for (int i = 0; i < peopleNum - 1; i++)
        {
            List<int> list = new List<int>() { 7 * i, 7 * i + 1, 7 * i + 2, 7 * i + 3, 7 * i + 4, 7 * i + 5, 7 * i + 6 };
            for (int j = 0; j < Random.Range(2, 5); j++)
            {
                int rand = Random.Range(0, list.Count);
                Verse[list[rand]].SetActive(true);
                list.RemoveAt(rand);
            }
        }
    }


    // 모든 버튼입력
    public void ButtonClick(string whatButton)
    {
        switch (whatButton)
        {
                // BeforeStartPanel - 사다리타기 시작하기 버튼, 인풋필드 하나라도 비어있으면 에러패널 띄움
            case "BeforeStart": 
                for (int i = 0; i < peopleNum; i++)
                    if (inputField[i].text == "") { ErrorPanel.SetActive(true); return; }

                BeforeStartPanel.SetActive(false);
                DownBlindPanel.SetActive(true);
                break;

                // DownPanel - 초기화 버튼
            case "InputReset":
                for (int i = 0; i < peopleNum; i++)
                    inputField[i].text = "";
                break;

                // MiddlePanel - 다시하기 버튼, ResultPanel - 다시하기 버튼
            case "Restart":
                LadderSetting(true);
                break;

                // MiddlePanel - 전체결과 버튼
            case "Result":
                for (int i = 0; i < peopleNum; i++) PlayerCs[i].StartCoroutine("Move");
                break;

                // MiddlePanel - 플레이어 버튼들
            default:
                for (int i = 0; i < 6; i++) if (whatButton == "Player" + (i + 1).ToString()) PlayerCs[i].StartCoroutine("Move");
                break;
        }
    }


    void Recommand()
    {
        List<string> allList = new List<string>();

        switch (dropdown.value)
        {
                // 추천내기를 누르면 초기화
            case 0: ButtonClick("InputReset"); return;

                // 간식내기
            case 1:
                switch (peopleNum)
                {
                    case 2: allList = new List<string>() { "간식사오기", "5천원내기" }; break;
                    case 3: allList = new List<string>() { "간식사오기", "5천원내기", "2천원내기" }; break;
                    case 4: allList = new List<string>() { "간식사오기", "5천원내기", "2천원내기", "천원내고사오기" }; break;
                    case 5: allList = new List<string>() { "간식사오기", "5천원내기", "2천원내기", "3천원내기", "그냥쉬세요" }; break;
                    case 6: allList = new List<string>() { "간식사오기", "5천원내기", "2천원내기", "3천원내기", "그냥쉬세요", "2천원내고사오기" }; break;
                }
                break;

                // 벌칙자뽑기
            case 2: allList = new List<string>() { "걸렸다ㅠㅠ", "살았다^^", "살았다^^", "살았다^^", "살았다^^", "살았다^^" }; break;

                // 당첨자뽑기
            case 3: allList = new List<string>() { "아싸 당첨!", "꽝", "꽝", "꽝", "꽝", "꽝" }; break;

                // 순서정하기
            case 4: allList = new List<string>() { "1번", "2번", "3번", "4번", "5번", "6번" }; break;

                // 편나누기
            case 5: allList = new List<string>() { "A팀", "B팀", "A팀", "B팀", "A팀", "B팀" }; break;

                // 조모임역할
            case 6: allList = new List<string>() { "발표하기", "PPT만들기", "자료조사", "자료조사", "PPT만들기", "자료조사" }; break;
        }

        // 리스트에 인원수만큼 문장 넣음
        List<string> list = new List<string>();
        for (int i = 0; i < peopleNum; i++) list.Add(allList[i]);

        // 인풋필드에 섞어서 넣음
        for (int i = 0; i < peopleNum; i++)
        {
            int rand = Random.Range(0, list.Count);
            inputField[i].text = list[rand];
            list.RemoveAt(rand);
        }
    }

}





Player.Cs 소스입니다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Player : MonoBehaviour {

    public GameManager GM;
    public int finishNum;
    public bool isEnd;

    bool isHorizontal;
    Vector2 dir;


    // PlayerCs를 초기화한다
    public void Clear()
    {
        GetComponent<Button>().interactable = true;
        isEnd = false;
    }


    public IEnumerator Move()
    {
        // 이미 내려갔는데 전체결과로 또 불러오면 안되기 때문에
        if (isEnd) yield break;

        finishNum = 0;
        isHorizontal = false;
        dir = Vector2.down;
        GM.PlayersGl.enabled = false;
        GetComponent<Button>().interactable = false;




        transform.GetChild(0).gameObject.SetActive(true);
        GM.BlindPanel.SetActive(true);
        RectTransform Rt = GetComponent<RectTransform>();
        while (Rt.anchoredPosition.y > -2192)
        {
            transform.Translate(dir * 6 * Time.deltaTime);
            yield return new WaitForSeconds(0.001f);
        }
        transform.GetChild(0).gameObject.SetActive(false);
        GM.BlindPanel.SetActive(false);
    }


    IEnumerator OnTriggerEnter2D(Collider2D col)
    {
        switch (col.name)
        {
            case "Left": case "Right":
                yield return new WaitForSeconds(0.001f);
                if (isHorizontal)
                {
                    isHorizontal = false;
                    dir = Vector2.down;
                }
                else
                {
                    isHorizontal = true;
                    dir = (col.name == "Left") ? Vector2.right : Vector2.left;
                }
                break;

            case "1": case "2": case "3": case "4": case "5": case "6":
                finishNum = int.Parse(col.name);
                isEnd = true;
                break;
        }
    }
}