Практическое использование ScriptableObject

Что такое ScriptableObject? Если говорить по-простому, то это ассет, который базируется на образце скрипта и позволяет хранить данные, независимо от образца. Иначе говоря, мы с начала пишем скрипт, наследуемый от класса ScriptableObject, а затем из этого скрипта создаем ассет. Например, в нашей игре можно покупать какие-то товары, перед игроком три продавца, как можно поступить в этом случаи? Самый очевидный вариант, создать скрипт торговца, в котором будет массив со всеми товарами. Таким образом, у нас будет три экземпляра данного скрипта, с массивами и всем остальным. И что важно, под каждый экземпляр скрипта нужна память, чем объемней массивы данных, тем больше потребуется памяти.

Прежде всего, ScriptableObject будет полезен для оптимизации памяти, но не только.

Как создать ScriptableObject?

Для примера, скрипт GameStore:

using System.Collections;
using UnityEngine;

[CreateAssetMenu(fileName = "New Store", menuName = "Scriptable Object/New Store")] // выпадающее меню редактора "Create"
public class GameStore : ScriptableObject {

	public GameStoreItems[] items;
}

[System.Serializable]
public class GameStoreItems {

	public string name;
	public Sprite icon;
	public int price;
}

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

Теперь, через выпадающее меню, у нас появится возможность создать ScriptableObject:

Практическое использование ScriptableObject

После чего у нас появится соответствующий ассет:


Ассет на подобие, например, материала. Если его настраивать когда сцена запущена, а потом выйти из плеймода, то все изменения ScriptableObject сохранятся.

Обратите внимание, что любые изменения (в нашем случае) скрипта GameStore, сразу будут отражаться на ассете и его дубликатах.


Можно сделать несколько копий и заполнить их разными данными.

Далее, нам только остается сделать ссылку на ассет:

using System.Collections;
using UnityEngine;

public class Example : MonoBehaviour {

	[SerializeField] private GameStore data;

	void Start()
	{
		// my code
	}
}


После чего, используем его в самой сцене.

Кроме простого хранения переменных, в ScriptableObject так же, можно выполнять свои функции.

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

Еще очень важное преимущество ScriptableObject в том, что его можно запаковать в AssetBundle, то есть, использовать как загружаемый контент. Если не менять скрипты проекта, а только настройки ScriptableObject, тогда их можно загрузить в игру в отдельном DLC, а это уже открывает другие возможности. Например, если взять тот-же магазин, мы можем выпустить загружаемый контент, где будут добавлены новые предметы или иные варианты старых.

Или если в игре есть некие юниты с одинаковыми скриптами управления, но различными настройками, то это всё тоже можно переделать под ScriptableObject, который и будет хранить нужные нам параметры. Например, в основной игре у нас три юнита, но мы можем наштамповать еще десять юнитов (ScriptableObject), и продать их как отдельное DLC.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Дешевый хостинг
  • Яндекс.Метрика