Страница 1 из 1

Проблема системы сериализации в Unity

СообщениеДобавлено: 18 ноя 2014, 05:54
AgogTolslogorkin
Извините за неинформативный заголовок, но я не знаю чего именно хочу )))) - с одной стороны решить свою задачу (описано ниже) наиболее адекватным для unity способом, с другой стороны обсудить проблему (тоже описанно ниже) с которой наверняка многие сталкивались при создании чего-то более сложного чем просто монобехавор с публичными переменными.

Дело в том что Unity рекомендует пользоваться SerialiedProperty для сохранения всего и вся. Действительно хоть, эти объекты и имеют неудобный интерфейс, их использование позволяет автоматически корректно синхронизировать свойства префаба и его экземпляров - великое дело, так как для реализации того же самого вручную приходится вступать в кровавый бой с unity из которого лично я, не вышел победителем (хотя я в юнити новичок, так что буду рад если просвятите меня на этот счет). Поэтому я очень бы хотел использовать именно SerialiedProperty для решаемой сейчас задачи. Но пытаясь это сделать я наткнулся на какой-то чудовищный, фундаментальный недостаток системы сериализации в Unity который рубит на корню все мои попытки, а именно - отсутствие легкого и сериализуемого по значению типа производного от UnityEngine.Object.

пример, почему это так плохо:

Я хочу сделать инвентарь в котором одинаковые предметы группируются вместе, так чтобы игрок сразу видел что у него, например, 15 зелий лечения, 1 стальная кираса и 6785 дырявых ботинок.

Естественно все это представить как:

List<ItemGroup>;

где ItemGroup выглядит так:

[Serializable]
public class ItemGroup
{
public Item Item; // Класс Item - Monobehaviour прикрепленный к префабу
public int Count;
}


И вот проблема на лицо, ведь ItemGroup не может же быть ScriptableObject-ом так как он должен сохраняться в отдельный файл а у меня может быть, например, таких групп в одном инвентаре 50, и персонажей с инвентарями по 50 штук в каждой из 50 сцен и еще префабы ведь. Теоритически, наверное, можно сделать ItemGroup монобехавором, но тогда будет просто страшно смотреть на инспектор персонажа захламленный десятками лишних компонентов представляющих то что и так доступно через инспектор инвентаря.

Получается единственно разумная реализация самого обычного для многих rpg инвентаря абсолютно не реализуема если хочешь использовать хваленые SerialiedProperty, так как они имеют дело только с встроенными типами и UnityEngine.Object.

В общем что мне делать, и как другие люди с этим справляются? Может быть есть альтернативные способы синхронизации "как в Unity" без SerialiedProperty? И вообще, может быть где-нибудь есть запрос к Unity решить как-то эту проблему(например добавлением нового типа) под которым можно подписаться среди других страждущих?


Заранее благодарю и извиняюсь за сумбурное изложение :).

Re: Проблема системы сериализации в Unity

СообщениеДобавлено: 20 ноя 2014, 23:35
YuliyF
а зачем тебе сохранять это чудо в файл: "Класс Item - Monobehaviour " - ? сохраняй только название объектов или их id и загружай по названию или id

Re: Проблема системы сериализации в Unity

СообщениеДобавлено: 30 дек 2014, 21:53
bwolf88
А зачем вам ScriptableObject хранить ?

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

Пример

Синтаксис:
Используется csharp

using UnityEngine;
using System.Collections;
using System;
using System.Collecton.Generic;

[Serializable]
public class Node{

public int a;
public float b;
public List<myClass> class; //и т.п.
}

 


Такой класс прекрасно сериализуется.

Re: Проблема системы сериализации в Unity

СообщениеДобавлено: 30 дек 2014, 22:56
DbIMok