2015-04-24 2 views
0

У меня есть простой магазин, где, когда игрок нажимает кнопку «BUY», элемент разблокируется и остается сохраненным как разблокированным. Это в одной сцене (Shop scene).Сохранение PlayerPrefs для нескольких экземпляров

У меня есть вторая сцена, где персонаж разблокируется на основе этой покупки, чтобы игрок мог выбрать (персонаж сцены).

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

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

Просьба сообщить, как я мог бы выполнить эту работу по нескольким экземплярам. Мысль о мечении и это тоже не представляется возможным. Я открыт для предложений, если есть лучший способ сделать это. Благодарю.

//Class controlling Shop Scene via an empty Gameobject 
public class ShopManager : MonoBehaviour 
{ 
    private bool unlocked; 

    public GameObject greyImg; 

    void Start() 
    { 
     unlocked = PlayerPrefs.GetInt("unlocked") == 1; 
     greyImg.SetActive(unlocked); 
    } 

    public void Buy() 
    { 
     unlocked = true; 
     PlayerPrefs.SetInt("unlocked", 1); 
     PlayerPrefs.Save(); 
     greyImg.SetActive(true); 
    } 
} 

Вот как устанавливается единая установка для сцены магазина. Если элемент уже куплен, серое изображение установлено на активное, что не позволяет пользователю больше нажимать кнопку «зеленый купить».

enter image description here

Когда персонаж разблокирован/купил

enter image description here

//Class controlling Character select scene via an empty Gameobject 
public class CharacterManager : MonoBehaviour 
{ 
    private bool unlocked; 
    public GameObject greySelect; 

    void Start() 
    { 
     unlocked = PlayerPrefs.GetInt("unlocked") == 1; 
    } 

    void Update() 
    { 
     if (unlocked) 
     { 
      greySelect.SetActive(false); 
     } 
    } 
} 

Это как настройка Unity выглядит для выбора символов сцены. Если символ уже разблокирован, серое изображение выбора будет неактивным, и будет отображена оранжевая кнопка выбора, позволяющая выбрать символ.

enter image description here

когда персонаж разблокирован

enter image description here

ответ

1

Возможно, существует множество способов решения этой проблемы. Вот один;

Вам понадобится отдельная запись prefs игрока для каждого символа. Итак, вам понадобится хороший способ отслеживать персонажей, которые у вас есть, и их состояние разблокировки. Вместо того, чтобы сохранять «разблокированные» в prefs игрока, почему бы не создать класс, содержащий разблокированную информацию?

class UnlockedCharacters 
{ 
    bool characterAUnlocked = false; 
    bool characterBUnlocked = false; 
    bool characterCUnlocked = true; 
} 

После этого вы можете сериализовать весь этот класс и сохранить весь класс внутри prefs игроков. Затем, когда вы загружаете свою игру, вы можете загрузить этот класс из prefs игроков, чтобы заполнить вашу информацию о персонаже. Таким образом, данные управляются и согласованы между сохраненными состояниями.

Вы можете сделать еще один шаг и сохранить все, что связано с вашими персонажами в словаре, в котором ваш int является перечислением, относящимся к персонажу, а bool - его разблокировкой. Затем вы можете сохранить/загрузить этот словарь снова, используя prefs игрока.

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

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

редактирования.К COMMENT НИЖЕ - ПРИМЕР:

Ваш общий контроллер персонажа будет идти на отдельные объекты, и, изменив CHAR_TYPE тот же сценарий будет работать, чтобы разблокировать несколько символов.

class CharacterManager 
{ 
    public enum CHAR_TYPE = { characterA, characterB, characterC } 
    private Dictionary<CHAR_TYPE, bool> characterUnlockState; 

    void Start() 
    { 
     // Seeding with some data for example purposes 
     characterUnlockState = new Dictionary<CHAR_TYPE, bool>(); 
     characterUnlockState.Add(CHAR_TYPE.characterA, false); 
     characterUnlockState.Add(CHAR_TYPE.characterB, false); 
     characterUnlockState.Add(CHAR_TYPE.characterC, true); 
    } 

    public bool IsCharacterUnlocked(CHAR_TYPE character) 
    { 
     if (characterUnlockState.Contains(character)) return characterUnlockState[character]; 

     return false; 
    } 

    public void UnlockCharacter(CHAR_TYPE character) 
    { 
     if (characterUnlockState.Contains(character)) characterUnlockState[character] = true; 
    } 
} 

class GenericCharacterController 
{ 
    public CHAR_TYPE character; 
    public CharacterManager manager; 

    public void UnlockButtonPressed() 
    { 
     manager.UnlockCharacter(character); 
    } 

} 
+0

Отдельные кнопки должны иметь собственный публичный метод, который активируется при нажатии. В настоящее время все будут иметь один и тот же метод, таким образом, в конечном итоге будут активированы все символы одновременно, когда 1 разблокируется. Другое, что отдельный класс, чтобы сохранить информацию, как я буду обращаться с этим. Вы имеете в виду 10 разных методов, каждый из которых выполняет разные действия для активации отдельных персонажей? (Я предполагаю, что это не то, что вы имеете в виду, но я не могу понять, как я собираюсь сделать один способ работы по-разному для разных разблокировок символов). Сможете ли вы привести пример. Tnks. – kar

+0

Я обновил свой ответ. Помогает ли это больше? –

+0

Получил это. Благодарю. – kar

1

Есть несколько способов приблизиться к этому. Вам понадобится идентификатор какого-либо типа для каждого элемента в вашем магазине. Поэтому я бы сделал сценарий StoreItem, который вы размещаете на каждой вещи для продажи. Сценарий StoreItem должен иметь свойство ItemID как минимум. Тогда ваш StoreManager может проверить, если она разблокирована так:

PlayerPrefs.GetInt(selectedStoreItem.ItemID + "_unlocked"); 

Кроме того, в то время как этот подход будет работать, это не рекомендуется. Пользователь playerprefs может манипулировать пользователем вне вашей игры. Поэтому они могли бы дать себе бесплатные предметы. Я не знаю, насколько это важно для вас. Лучший подход - хранить эту информацию на сервере где-то и синхронизировать игру с этим, чтобы определить, какие предметы принадлежит игроку.

+0

Скажем, у меня есть 10 символов, поэтому повторяющиеся 10x-скрипты элементов, которые обрабатывают только идентификатор и имеют один основной скрипт для магазина, который обрабатывает остальные? Потому что я понимаю, что все равно придется обрабатывать каждый символ вкл/выкл для серых/оранжевых зеленых/серых кнопок, заявляя их как общедоступные и присваивая индивидуально. Можете ли вы привести мне пример. Не могу опустить голову. Tnks. – kar

+0

Вы должны создать объект шаблона StoreItem. Объект шаблона будет иметь общедоступные свойства для всех элементов пользовательского интерфейса, связанных с элементом хранилища (оранжевая кнопка и т. Д.). После того, как вы создадите сборку шаблона, вы добавите свойство шаблона в свой менеджер магазина и свяжете с ним готовый сборник. Затем вы могли динамически создавать экземпляры всех элементов хранилища во время выполнения и, возможно, вызывать метод для каждого StoreItem, называемого SetCharacter (characterName); И в этом методе вы можете проверить playerprefs для имени, которое было передано, а затем изменить элементы интерфейса для этого элемента. –

+0

Вы можете сделать это все динамически, перейдя по вашему списку символов и создав новый объект StoreItem для каждого. Затем вы просто передаете свой идентификатор персонажа в StoreItem и обновите его собственный пользовательский интерфейс в соответствии с его статусом собственности, который он определяет. –

Смежные вопросы