Наилучшая практика динамического создания персонажей - PullRequest
0 голосов
/ 06 июля 2019

У меня есть партийная игра, в которой игрок может иметь от 1 до 8 персонажей.Я пытаюсь создать разумную, элегантную систему для хранения статистики этих персонажей и, что более важно, их инвентаризации объектов, пригодных для скриптов.

В настоящее время я использую сериализованный скрипт, содержащий список объектов персонажей вмоя игра, которая представляет собой просто пустые игровые объекты с прикрепленными скриптами CharacterInventory.

Я хочу динамически создавать сценарии CharacterInventory, чтобы при необходимости я мог создавать дополнительные символы.Я не могу понять, как добавить отдельные экземпляры скрипта в список сохраняемых.Я знаю, что сценарии не могут быть созданы.

Я мог бы создать пустой игровой объект с помощью сценария и добавить сценарий к нему во время процесса создания, но есть ли более элегантное решение?

Будут ли объекты сценариев работать для персонажей, учитывая, что онидолжен содержать списки других объектов сценариев, которые также динамически изменяются?

1 Ответ

0 голосов
/ 06 июля 2019

Общее правило, которому вы можете следовать, состоит в том, что вы должны отделить Data и Views.

Я не рекомендую ScriptableObject в качестве единственного источника данных, поскольку он имеет некоторые ограничения.Он может только сериализовать данные, которые Unity делает для вас.но при следующем подходе вы можете хранить практически все, что вы хотите.

Вы можете или должны использовать ScriptableObject, но это было бы гораздо более эффективно при использовании с другим источником данных, таким как files.

Затем вы можете легко сохранять и загружать данные.

Используйте MonoBehavious в качестве слоя просмотра и обычные сценарии c # в качестве слоя данных.

Например, рассмотрим этот класс данных:

public class CharacterModel
    {
        public string Name;
        public int Level;
        public List<string> Inventory;
    }

И это как класс View:

public class Character : MonoBehaviour
    {
        private CharacterModel model;

        public void Save()
        {
            // I would use Json.net to serialize the model
            // Note: this is just a simple and non-efficient of saving all characters
// data, don't use it in production
            PlayerPrefs.SetString(model.Name, JsonConvert.SerializeObject(model));

        }

        public void Load(string characterName)
        {
            model = JsonConvert.DeserializeObject<CharacterModel>(PlayerPrefs.GetString(characterName));
        }
    }

Или вы можете сохранить все символы как один file и во время инициализации сцены заполнить свой основной ScriptableObject.

Основываясь на этой идее, вы можете сохранять все символы в любое время и заполнять объект сценариев символов, когда хотите загрузить данные символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...