motkot
@motkot
Программирование C#.

Как сделать добавление предмета, не зная какой это точно класс?

Есть несколько классов, обозначающие что это за предмет, например:

using UnityEngine;

[CreateAssetMenu(fileName = "Weapon name", menuName = "Items/Weapon")]
public class Weapon : ScriptableObject
{
    public ItemProp MainProp;

    public int Damage;
    public int Firerate;

    public int Strength;
}

ИЛИ

using UnityEngine;

[CreateAssetMenu(fileName = "Resource name", menuName = "Items/Resource")]
public class CraftResources : ScriptableObject
{
    public ItemProp MainProp;
}


Есть класс Items:

public class Items 
{
    public static List<Weapon> Weapons = new List<Weapon>();
    public static List<CraftResources> Resources = new List<CraftResources>();
    public static List<Tool> Tools = new List<Tool>();
    public static List<Armor> Armors = new List<Armor>();

    public static int MaxItemsCount;

    public void AddItem()
    {
    }
}


Я добавил метод AddItem и у меня проблема, как добавить предмет в нужную категорию? Я вообще думал сначало вместо кучи классов создать один Item, но как тогда в Scriptable object его настраивать, да и в лист такой не запихнешь. Может мне как то по умному изменить?
  • Вопрос задан
  • 33 просмотра
Пригласить эксперта
Ответы на вопрос 2
ReyGrau
@ReyGrau
Junior Unity Developer
Сделай базовый класс наследованный от ScriptableObject, от него наследуй предметы, потом в классе Items используй switch:
switch (Базов класс предмета)
{
   case Weapon weapon:
      Weapons.Add(weapon); 
      break;
   case CraftResources craftResources :
      Resources.Add(craftResources);
      break;
   ...
}

Может есть способ и лучше, но я сам только джун, так что вот так:)
Ответ написан
@NoNameDeveloper
Unity Developer
Ну как то так. Теперь у тебя не будут несколько списков, а один словарь который будет держать несколько списков.
Обращаться к каждому можно через:
ItemsDict[ItemType.Weapon]

public enum ItemType
{
	Weapon,
	Tool,
	Armor
}

public abstract class Item
{
	public ItemType Type;
}

public class Weapon : Item
{}

public class Tool : Item
{}

public class Armor : Item
{}

public class Items
{
	private Dictionary<ItemType, List<Item>> ItemsDict = new Dictionary<ItemType, List<Item>>();

	public void AddItem(Item item)
	{
		ItemsDict[item.Type].Add(item);
	}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы