void DisplayCategoryList()
    {
        List <string> CategoryList = new List <string>();

        TechRecipe.ProcessorInfo TargetProcessorInfo = CallTechRecipe.GetProcessorRecipe(CallInstallableObjectAct.Info.Name);

        foreach (var ActorName in TargetProcessorInfo.ActorList)
        {
            if (!CallTechValue.GetActorPossible(ActorName))
            {
                continue;
            }

            bool isDuplicate = false;
            foreach (var Item in CategoryList)
            {
                if (ActorName == Item)
                {
                    isDuplicate = true;
                    break;
                }
            }

            if (!isDuplicate)
            {
                CategoryList.Add(ActorName);
            }
        }

        int RowLimit = CategoryList.Count;

        if (RowLimit > CategoryCarrier.transform.childCount)
        {
            for (int i = CategoryCarrier.transform.childCount; i < RowLimit; i++)
            {
                GameObject.Instantiate(CategoryCarrier.transform.GetChild(0).gameObject, CategoryCarrier.transform);
            }
        }
        else if (RowLimit < CategoryCarrier.transform.childCount)
        {
            if (RowLimit == 0)
            {
                RowLimit = 1;
            }
            for (int i = CategoryCarrier.transform.childCount - 1; i >= RowLimit; i--)
            {
                Destroy(CategoryCarrier.transform.GetChild(i).gameObject);
            }
        }

        for (int i = 0; i < RowLimit; i++)
        {
            CategoryCarrier.transform.GetChild(i).gameObject.SetActive(false);
        }

        for (int i = 0; i < CategoryList.Count; i++)
        {
            CategoryCarrier.transform.GetChild(i).gameObject.SetActive(true);
            CategoryCarrier.transform.GetChild(i).GetChild(0).gameObject.GetComponent <Text>().text = " " + CategoryList[i];
        }
    }
    void DisplayItemList(string Category)
    {
        TechRecipe.ProcessorInfo    TargetProcessorInfo = CallTechRecipe.GetProcessorRecipe(CallInstallableObjectAct.Info.Name);
        List <TechValue.RecipeInfo> ItemList            = new List <TechValue.RecipeInfo>();
        int RowLimit = 0;

        foreach (var Item in CallTechValue.AvailableRecipe)
        {
            if (Item.Recipe.RequiredProcessor != null)
            {
                string ProcessorType = Item.Recipe.RequiredProcessor.Split('?')[0];
                string ProcessorName = Item.Recipe.RequiredProcessor.Split('?')[1];

                if (ProcessorType == TargetProcessorInfo.Name && ProcessorName == Category)
                {
                    ItemList.Add(Item);
                }
            }
        }

        RowLimit = Mathf.CeilToInt(((float)ItemList.Count + 1) / 3f);

        if (RowLimit > ItemCarrier.transform.childCount)
        {
            for (int i = ItemCarrier.transform.childCount; i < RowLimit; i++)
            {
                GameObject.Instantiate(ItemCarrier.transform.GetChild(0).gameObject, ItemCarrier.transform);
            }
        }
        else if (RowLimit < ItemCarrier.transform.childCount)
        {
            if (RowLimit == 0)
            {
                RowLimit = 1;
            }
            for (int i = ItemCarrier.transform.childCount - 1; i >= RowLimit; i--)
            {
                Destroy(ItemCarrier.transform.GetChild(i).gameObject);
            }
        }

        for (int i = 0; i < RowLimit; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).gameObject.SetActive(false);
            }
        }

        for (int i = 0; i < RowLimit; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (i == 0 && j == 0)
                {
                    ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).gameObject.SetActive(true);

                    ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(0).gameObject.GetComponent <Image>().sprite = Resources.Load <Sprite>("GameSystem/InGameUI/Sprite/InsideEmptyCircle");
                    ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(1).gameObject.GetComponent <Text>().text    = "None";
                }
                else
                {
                    if (i * 3 + j - 1 >= ItemList.Count)
                    {
                        break;
                    }

                    ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).gameObject.SetActive(true);

                    ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(0).gameObject.GetComponent <Image>().sprite = Resources.Load <Sprite>("GameSystem/Goods/Sprite/" + ItemList[i * 3 + j - 1].Recipe.Type);
                    ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(1).gameObject.GetComponent <Text>().text    = ItemList[i * 3 + j - 1].Recipe.OutputName;
                }
            }
        }

        CurrentCategory = Category;
    }
    void DisplayProcessorList()
    {
        List <string> ItemList = new List <string>();
        int           RowLimit = 0;

        if (CategoryCarrier.transform.childCount > 1)
        {
            for (int i = 2; i < CategoryCarrier.transform.childCount; i++)
            {
                Destroy(CategoryCarrier.transform.GetChild(i).gameObject);
            }
        }
        CategoryCarrier.transform.GetChild(0).gameObject.SetActive(false);

        for (int i = ItemCarrier.transform.childCount - 1; i > 0; i--)
        {
            Destroy(ItemCarrier.transform.GetChild(i).gameObject);
        }

        foreach (var Facility in CallTechValue.FacilityList)
        {
            if (Facility.Type != "Processor" && Facility.Type != "Assembler")
            {
                continue;
            }

            TechRecipe.ProcessorInfo TargetProcessorRecipe = CallTechRecipe.GetProcessorRecipe(Facility.Name);

            if (TargetProcessorRecipe == null)
            {
                Debug.Log("There is no " + Facility.Name + " in System");
                return;
            }

            foreach (var ActorName in TargetProcessorRecipe.ActorList)
            {
                if (!CallTechValue.GetActorPossible(ActorName))
                {
                    continue;
                }

                string TargetName  = Facility.Name + "-" + ActorName;
                bool   isDuplicate = false;
                foreach (var Item in ItemList)
                {
                    if (TargetName == Item)
                    {
                        isDuplicate = true;
                        break;
                    }
                }

                if (!isDuplicate)
                {
                    ItemList.Add(TargetName);
                }
            }
        }

        RowLimit = Mathf.CeilToInt((float)ItemList.Count / 3f);

        if (ItemList.Count == 0)
        {
            for (int i = 1; i < 3; i++)
            {
                ItemCarrier.transform.GetChild(0).GetChild(i).GetChild(0).gameObject.SetActive(false);
            }

            ItemCarrier.transform.GetChild(0).GetChild(0).GetChild(0).GetChild(0).gameObject.GetComponent <Image>().sprite = Resources.Load <Sprite>("GameSystem/InGameUI/Sprite/InsideEmptyCircle");
            ItemCarrier.transform.GetChild(0).GetChild(0).GetChild(0).GetChild(1).gameObject.GetComponent <Text>().text    = "None";
        }
        else
        {
            for (int i = 0; i < 3; i++)
            {
                ItemCarrier.transform.GetChild(0).GetChild(i).GetChild(0).gameObject.SetActive(true);
            }

            for (int i = 0; i < RowLimit; i++)
            {
                if (i != 0)
                {
                    GameObject.Instantiate(ItemCarrier.transform.GetChild(0).gameObject, ItemCarrier.transform);
                }

                int LeftItem = ItemList.Count - (i * 3) + 1;
                if (LeftItem < 3)
                {
                    for (int j = 2; j >= LeftItem; j--)
                    {
                        ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).gameObject.SetActive(false);
                    }
                }

                for (int j = 0; j < 3; j++)
                {
                    if (i == 0 && j == 0)
                    {
                        ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(0).gameObject.GetComponent <Image>().sprite = Resources.Load <Sprite>("GameSystem/InGameUI/Sprite/InsideEmptyCircle");
                        ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(1).gameObject.GetComponent <Text>().text    = "None";
                    }
                    else
                    {
                        if (i * 3 + j - 1 >= ItemList.Count)
                        {
                            break;
                        }
                        ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(0).gameObject.GetComponent <Image>().sprite = null;
                        ItemCarrier.transform.GetChild(i).GetChild(j).GetChild(0).GetChild(1).gameObject.GetComponent <Text>().text    = ItemList[i * 3 + j - 1];
                    }
                }
            }
        }

        CurrentCategory = "";
    }