【问题标题】:Saving collection of viewed elements in Unity / Vuforia在 Unity / Vuforia 中保存已查看元素的集合
【发布时间】:2017-07-07 02:32:49
【问题描述】:

我有一个寻宝游戏,你可以在其中找到 9 种不同的元素。只有 4 个有特殊的“令牌”。当您查看特定元素时,屏幕底部会显示一个标记,显示为已收集。问题是,我不知道如何使用 playerprefs 保存它,以便您可以收集所有 4 个令牌,即使您关闭游戏。这是令牌脚本

using UnityEngine;

使用 Vuforia; 使用 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);
    }
}

}

【问题讨论】:

  • 数组。数组可能会有所帮助。

标签: c# unity3d vuforia


【解决方案1】:

PlayerPrefs 类仅保存和加载 intfloatstring 类型的数据。要保存每个令牌的状态,您可以将本地 newStatus 枚举转换为 int 并将其用作 PlayerPrefs 保存的值。此外,您应该创建新函数来保存和加载到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,但我对您的工作流程了解得不够多,无法猜测最佳方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 2010-11-23
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多