Как принято делать фабрику предметов?

Как принято создавать фабрику для предметов? Например, возьмем исходные данные:
Есть меч и копье. Они занесены в префаб, имеют разные спрайты и тд., и на них висит скрипт, допустим:
class Weapon : MonoBehaviour
{
int id;
int damage;
}

И вот возникает ситуация, что у одного персонажа в кармане лежит, допустим, 3 меча. Нам нужно создать клон префаба и сразу задать ему физический вид, но переместить объект куда-нибудь далеко, чтобы игрок его не увидел и при надобности перемещать к игроку? Просто таким образом выходит, что каждый объект имеет физическое проявление, что не очень хорошо. Либо предмет не должен иметь физического проявления и быть представленным кодом:
public class Weapon
{
int id;
int damage;
public Weapon(int damage)
{
this.damage = damage;
id = ++id;
}
}

Но тогда возникает вопрос, а как быть, если я хочу хранить спрайты оружия и их в модель меча передавать? Ведь без MonoBehaviour я не смогу назначить спрайты в инспекторе.

Т.е. выходит, что обязательно предмет будет иметь физические проявления, даже если он просто лежит в кармане (вернее, в кармане ссылка на предмет)?
  • Вопрос задан
  • 1469 просмотров
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
"Но тогда возникает вопрос, а как быть, если я хочу хранить спрайты оружия и их в модель меча передавать? Ведь без MonoBehaviour я не смогу назначить спрайты в инспекторе."

Предложил бы отдельно хранить этакие "Ресурсы/Ассеты для оружия".
Какой-нибудь список где по айдишнику оружия, вы можете достать спраит, описание текстовое, модель..что угодно.
Методы для работы со списком возможно для удобства и всей этой инкапсуляции и тд.

Тогда логика оружия условно будет отделена от представления его. Хотите показать мечь - достали спраит из ресурсов - и показали его. а все остальное время храним набор айдишников.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
TheTalion
@TheTalion Автор вопроса
Так как на вопрос много подписанных изображу текущее решение:
public class Item 
	{
		public int id;
		public int cost;
		public string name;
		public Sprite performance;
		public Sprite icon;
		public Item(int _cost, string _name, Sprite _perfomance, Sprite _icon){
			id = ++id;
			cost = _cost;
			name = _name;
			performance = _perfomance;
			icon = _icon;
		}
	}

public class Weapon : Item
{
	public int damage;
	public int distance;
	public Weapon (int _damage, int _distance, int _cost, string _name, Sprite _perfomance, Sprite _icon):base(_cost, _name, _perfomance,_icon)
	{
		damage = _damage;
		distance = _distance;
	}
}

public class Sword : Weapon
{
	public Sword (int _damage, int _distance, int _cost, string _name, Sprite _perfomance, Sprite _icon):base(_damage,_distance, _cost, _name,  _perfomance, _icon)
	{
	}
}

public Sprite GetSprite(string _name){
		Sprite[] textures = Resources.LoadAll<Sprite>("Weapon/Swords");
		string[] names = new string[textures.Length];

		for(int ii=0; ii< names.Length; ii++) {
			names[ii] = textures[ii].name;
		}

		Sprite sprite = textures[Array.IndexOf(names, _name)];
		return sprite;
	}

	void Start()//для проверки
	{
		item_L.Add (new Weapon (10, 1, 111, "noobsword" , GetSprite ("noobsword"), GetSprite ("noobsword")));
		item_L.Add (new Weapon (10, 1, 111, "epicsword" , GetSprite ("epicsword"), GetSprite ("epicsword")));
	}

А для отображения:
i.transform.FindChild("Text").GetComponent<Text>().text = currentItem.name;
i.GetComponent<Image>().sprite = currentItem.icon;

Может есть лучше варианты, но пока самый понятный.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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