Сохранение коллекции просмотренных элементов в Unity/Vuforia

У меня есть охота за мусором, где вы найдете 9 различных элементов. Только у 4 есть специальный «жетон». Когда вы просматриваете определенные элементы, в нижней части экрана отображается токен, который отображается как собранный. Проблема в том, что я не могу понять, как сохранить это с помощью playerprefs, чтобы вы могли собрать все 4 жетона, даже если вы закроете игру. Вот скрипт токена

using UnityEngine;

с помощью Вуфории; использование System.Collections;

открытый класс token_icon: MonoBehaviour, ITrackableEventHandler {

private TrackableBehaviour mTrackableBehaviour;

public GameObject token;
public GameObject lime_token;
public GameObject loconut_token;
public GameObject crown_token;
public GameObject gin_token;

void Start()
{
    mTrackableBehaviour = GetComponent<TrackableBehaviour>();
    if (mTrackableBehaviour)
    {
        mTrackableBehaviour.RegisterTrackableEventHandler(this);
    }
}

public void OnTrackableStateChanged(
                                TrackableBehaviour.Status previousStatus,
                                TrackableBehaviour.Status newStatus)
{
    if (newStatus == TrackableBehaviour.Status.DETECTED ||
        newStatus == TrackableBehaviour.Status.TRACKED)
    {
        token.SetActive(true);
    }
    else
    {
        token.SetActive(false);
    }
}

}


person Furukawa    schedule 05.07.2017    source источник
comment
Массивы. Массивы, вероятно, помогут.   -  person Draco18s no longer trusts SE    schedule 05.07.2017


Ответы (1)


Класс PlayerPrefs сохраняет и загружает только данные типов int, float и string. Чтобы сохранить состояние каждого токена, вы можете преобразовать локальное перечисление newStatus в целое число и использовать его как значение, сохраненное PlayerPrefs. Кроме того, вы должны создать новые функции для сохранения и загрузки в PlayerPrefs и обратно. При обратной загрузке просто введите PlayerPrefs.GetInt("Key") обратно в перечисление TrackableBehaviour.Status. Вот ссылка на документацию для PlayerPrefs, если вы еще ее не видели: https://docs.unity3d.com/ScriptReference/PlayerPrefs.html

Я изменил ваш исходный код, добавив две новые функции, чтобы показать, как вы можете начать работу.

открытый класс token_icon: MonoBehaviour, ITrackableEventHandler {

private TrackableBehaviour mTrackableBehaviour;

public GameObject token;
public GameObject lime_token;
public GameObject loconut_token;
public GameObject crown_token;
public GameObject gin_token;

void Start()
{
    //Inserted Function
    LoadStatus();

    mTrackableBehaviour = GetComponent<TrackableBehaviour>();
    if (mTrackableBehaviour)
    {
        mTrackableBehaviour.RegisterTrackableEventHandler(this);
    }
}

public void OnTrackableStateChanged(
                                TrackableBehaviour.Status previousStatus,
                                TrackableBehaviour.Status newStatus)
{
    if (newStatus == TrackableBehaviour.Status.DETECTED ||
        newStatus == TrackableBehaviour.Status.TRACKED)
    {
        token.SetActive(true);
    }
    else
    {
        token.SetActive(false);
    }
    //Inserted Function
    SaveStatus();
}

//Save to PlayerPrefs
private void SaveStatus()
{
    PlayerPrefs.SetInt("Token", (int)newStatus);
    PlayerPrefs.Save();
}

//Load from PlayerPrefs
private void LoadStatus()
{
    if (PlayerPrefs.HasKey("Token"))
    {
        TrackableBehaviour.Status loadStatus = (TrackableBehaviour.Status)PlayerPrefs.GetInt("Token");

        if (loadStatus == TrackableBehaviour.Status.DETECTED ||
            loadStatus == TrackableBehaviour.Status.TRACKED)
        {
            token.SetActive(true);
        }
        else
        {
            token.SetActive(false);
        }
    }
}

}

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

person aniehuser    schedule 06.07.2017