예제 #1
0
    /// @brief
    ///     load()에서 호출되는 함수  \n
    ///     각 칸에 오브젝트를 배치하는 과정을 총괄한다.
    /// @return 없음
    /// @param serialNumb 배치할 오브젝트의 시리얼 번호
    /// @param rotateState 배치할 오브젝트의 회전 정보
    /// @param pos 오브젝트가 배치될 위치
    /// @param floor ArrangeablePosState를 지니고 있는 바닥 오브젝트
    /// @param isXFlip 배치 오브젝트의 좌우 반전이 필요한 경우(벽에 설치하는 등) true를 전달
    void dispose(string serialNumb, string rotateState, Vector3 pos, GameObject floor, bool isXFlip = false)
    {
        GameObject obj;

        // param의 serialNumb에서 특정 테마 추출
        ItemManager theme = DS.itemManager[int.Parse(serialNumb.Substring(0, 2))];

        // 해당 테마의 모든 오브젝트를 순회하며 오브젝트 추출
        for (int i = 0; i < theme.Items.Length; i++)
        {
            if (theme.Items[i].serialNumb.ToString() == serialNumb)
            {
                // SerialNumb 대조 후 해당 오브젝트 생성
                obj = MUC.ObjectInstantiater((int)theme.Items[i].itemType,
                                             theme.Items[i].itemImage[0],
                                             serialNumb, true);

                // 좌표 설정
                obj.transform.position = pos;

                // 회전 설정
                // 자동 회전 설정되는 경우는 추후 재설정(의자, 벽 등)
                for (int count = 0; count < int.Parse(rotateState); count++)
                {
                    FA.ObjectControl_ROTATE_REMOTE(obj);
                }

                // 해당 층의 자식으로 설정
                obj.transform.parent = FA.getCurFloor().transform;

                // 바닥의 state를 set
                // obj의 putWhere를 set
                obj.GetComponent <FurnitureManager>().moveEnd(floor);

                // 바닥의 putHere를 set
                floor.GetComponent <ArrangeablePosState>().putHere = obj;

                // 책상, 의자 등 특수한 배치 실행
                switch (theme.Items[i].itemType)
                {
                case ItemController._itemType.Chair:
                    FA.chairCheck(obj, floor);
                    break;

                case ItemController._itemType.Table:
                    FA.tableCheck(obj, floor);
                    break;

                default:
                    break;
                }

                // 좌우 반전이 필요한 경우(벽걸이형 오브젝트 등)
                if (isXFlip)
                {
                    obj.GetComponent <Transform>().localScale = new Vector3(-1, 1, 1);
                }
            }
        }
    }
    // 한 행에 8칸씩
    // 넘어가면 다음 행으로 밀려남

    private void Awake()
    {
        dataStorage      = GameObject.Find("GameManager").GetComponent <DataStorage>();
        menuUIController = GameObject.Find("MenuCanvas").GetComponent <MenuUIController>();

        btns = GetComponentsInChildren <Button>();

        foreach (var b in btns)
        {
            b.gameObject.SetActive(false);
        }

        // 테마 수
        //for(int i = 0; i < dataStorage.itemManager.Length; i++)
        for (int i = 0, themeIdx = 0, j; themeIdx < dataStorage.itemManager.Length; i++, themeIdx++)
        {
            // ruins 테마의 아이템 순회
            for (j = 0; j < dataStorage.itemManager[themeIdx].Items.Length; j++)
            {
                //각 버튼 이미지 세팅
                //btns[i * 15 + j].GetComponent<Image>().sprite = dataStorage.itemManager[i].Themes[j].itemImage[0];
                btns[i * 8 + j].transform.Find("Image").GetComponent <Image>().sprite = dataStorage.itemManager[themeIdx].Items[j].itemImage[0];
                btns[i * 8 + j].gameObject.SetActive(true);

                // 각 버튼 Listener 세팅
                // base prefab instantiate
                // 해당 instantiate 된 object에 dataStorage의 정보 덮어씌우기
                // 화면 내로 오브젝트 이동
                int itemType = -1;
                switch (dataStorage.itemManager[themeIdx].Items[j].itemType)
                {
                case ItemController._itemType.Table:
                    itemType = (int)ItemController._itemType.Table;     // Table
                    break;

                case ItemController._itemType.Chair:
                    itemType = (int)ItemController._itemType.Chair;
                    break;

                case ItemController._itemType.WallAcc:
                    itemType = (int)ItemController._itemType.WallAcc;
                    break;

                case ItemController._itemType.FloorAcc:
                    itemType = (int)ItemController._itemType.FloorAcc;
                    break;

                case ItemController._itemType.WallTile:
                    itemType = (int)ItemController._itemType.WallTile;
                    break;

                case ItemController._itemType.FloorTile:
                    itemType = (int)ItemController._itemType.FloorTile;
                    break;

                case ItemController._itemType.Partition:
                    itemType = (int)ItemController._itemType.Partition;
                    break;

                case ItemController._itemType.Counter:
                    itemType = (int)ItemController._itemType.Counter;
                    break;
                }

                //if (dataStorage.itemManager[i].Themes[j].itemType == ItemController._itemType.Table)
                //    idx = 0; // Table
                //else if (dataStorage.itemManager[i].Themes[j].itemType == ItemController._itemType.Chair)
                //    idx = 1; // Chair
                Sprite sprite = dataStorage.itemManager[themeIdx].Items[j].itemImage[0];
                string serial = dataStorage.itemManager[themeIdx].Items[j].serialNumb;

                btns[i * 8 + j].onClick.AddListener(delegate() { menuUIController.ObjectInstantiater(itemType, sprite, serial); });
            }
            // 한 테마의 아이템이 두 줄 이상 차지했다면
            // 그 다음 테마의 아이템은 새로운 줄에서부터 배치
            if (j > 8)
            {
                i++;
            }
        }
    }