/// <summary>
        /// This can be used as an example for building your own inventory UI.
        /// </summary>
        public void OnSelectTab(bool value)
        {
            if (!value)
            {
                return;
            }

            Item.GetParams = null;

            Dictionary <string, SpriteGroupEntry> dict;
            Action <Item> equipAction;
            int           equippedIndex;
            var           tab = Tabs.GetComponentsInChildren <Toggle>().Single(i => i.isOn);

            switch (tab.name)
            {
            case "Armor":
            {
                dict          = SpriteCollection.Armor.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.EquipArmor(dict[item.Id]?.Sprites);
                equippedIndex = Character.Front.Armor == null ? -1 : SpriteCollection.Armor.FindIndex(i => i.Sprites.SequenceEqual(Character.Front.Armor));
                break;
            }

            case "Helmet":
            {
                dict           = SpriteCollection.Armor.ToDictionary(i => i.FullName, i => i);
                equipAction    = item => Character4D.EquipHelmet(dict[item.Id]);
                equippedIndex  = SpriteCollection.Armor.FindIndex(i => i.Sprites.Contains(Character.Front.Helmet));
                Item.GetParams = item => new ItemParams {
                    Id = item.Id, Path = dict[item.Id] == null ? null : dict[item.Id].Path.Replace("Armor/", "Helmet/") + ".Helmet", Meta = dict[item.Id]?.Id.ToString()
                };
                break;
            }

            case "Shield":
            {
                dict          = SpriteCollection.Shield.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.EquipShield(dict[item.Id]?.Sprites);
                equippedIndex = Character.Front.Shield == null ? -1 : SpriteCollection.Shield.FindIndex(i => i.Sprites.SequenceEqual(Character.Front.Shield));
                break;
            }

            case "Melee1H":
            {
                dict          = SpriteCollection.MeleeWeapon1H.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.EquipMeleeWeapon1H(dict[item.Id]?.Sprite);
                equippedIndex = SpriteCollection.MeleeWeapon1H.FindIndex(i => i.Sprites.Contains(Character.Front.PrimaryMeleeWeapon));
                break;
            }

            case "Melee2H":
            {
                dict          = SpriteCollection.MeleeWeapon2H.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.EquipMeleeWeapon2H(dict[item.Id]?.Sprite);
                equippedIndex = SpriteCollection.MeleeWeapon2H.FindIndex(i => i.Sprites.Contains(Character.Front.PrimaryMeleeWeapon));
                break;
            }

            case "Bow":
            {
                dict          = SpriteCollection.Bow.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.EquipBow(dict[item.Id]?.Sprites);
                equippedIndex = Character.Front.CompositeWeapon == null ? -1 : SpriteCollection.Bow.FindIndex(i => i.Sprites.SequenceEqual(Character.Front.CompositeWeapon));
                break;
            }

            case "Crossbow":
            {
                dict          = SpriteCollection.Crossbow.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.EquipCrossbow(dict[item.Id]?.Sprites);
                equippedIndex = Character.Front.CompositeWeapon == null ? -1 : SpriteCollection.Crossbow.FindIndex(i => i.Sprites.SequenceEqual(Character.Front.CompositeWeapon));
                break;
            }

            case "Ears":
            {
                dict          = SpriteCollection.Ears.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.SetEars(dict[item.Id]?.Sprites);
                equippedIndex = SpriteCollection.Ears.FindIndex(i => i.Sprites.SequenceEqual(Character.Front.Ears));
                break;
            }

            case "Eyebrows":
            {
                dict          = SpriteCollection.Eyebrows.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.SetEyebrows(dict[item.Id]?.Sprites);
                equippedIndex = SpriteCollection.Eyebrows.FindIndex(i => i.Sprites.Contains(Character.Front.Expressions[0].Eyebrows));
                break;
            }

            case "Eyes":
            {
                dict          = SpriteCollection.Eyes.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.SetEyes(dict[item.Id]?.Sprites);
                equippedIndex = SpriteCollection.Eyes.FindIndex(i => i.Sprites.Contains(Character.Front.Expressions[0].Eyes));
                break;
            }

            case "Hair":
            {
                dict          = SpriteCollection.Hair.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.SetHair(dict[item.Id]);
                equippedIndex = SpriteCollection.Hair.FindIndex(i => i.Sprites.Contains(Character.Front.Hair));
                break;
            }

            case "Mouth":
            {
                dict          = SpriteCollection.Mouth.ToDictionary(i => i.FullName, i => i);
                equipAction   = item => Character4D.SetMouth(dict[item.Id]?.Sprites);
                equippedIndex = SpriteCollection.Mouth.FindIndex(i => i.Sprites.Contains(Character.Front.Expressions[0].Mouth));
                break;
            }

            default:
                throw new NotImplementedException(tab.name);
            }

            var items = dict.Values.Select(i => new Item(i.FullName)).ToList();

            items.Insert(0, new Item("Empty"));
            dict.Add("Empty", null);

            if (Item.GetParams == null)
            {
                Item.GetParams = item => new ItemParams {
                    Id = item.Id, Path = dict[item.Id]?.Path, Meta = dict[item.Id]?.Id.ToString()
                };                                                                                                                         // We override GetParams method because we don't have a database with item params.
            }

            InventoryItem.OnLeftClick = item => { equipAction(item); EquipCallback?.Invoke(item); ItemName.text = item.Params.Id ?? "Empty"; };

            Inventory.Initialize(ref items, items[equippedIndex + 1], reset: true);

            ColorButtons[0].SetActive(tab.name == "Hair");
            ColorButtons[1].SetActive(tab.name == "Eyes");
            ColorButtons[2].SetActive(tab.name == "Body");

            if (ColorButtons.Count == 4)
            {
                ColorButtons[3].SetActive(!ColorButtons[0].activeSelf && !ColorButtons[1].activeSelf && !ColorButtons[2].activeSelf);
            }
        }