为多个实例保存 PlayerPrefs

Saving PlayerPrefs for multiple instances

我设置了一个简单的商店,当玩家点击 'BUY' 一个角色时,该物品就会解锁并保持解锁状态。这是在一个场景(商店场景)中。

我有第二个场景,玩家可以根据此次购买解锁角色 select(角色场景)。

我将脚本放在每个场景的空游戏对象上。当它只购买一个角色时它工作得很好。但是我如何为多个字符复制它。

我可以将脚本放在各个按钮上,并将相应的游戏对象放在检查器下,但如果我有 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);
     }
 }

这就是统一设置查找商店场景的方式。如果该商品已被购买,灰色图像将被设置为活动状态,从而不允许用户再单击绿色购买按钮。

当字符为unlocked/bought

 //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 设置查找角色 select 场景的方式。如果角色已经解​​锁,灰色 select 图像将被设置为非活动状态,橙色 select 按钮将可见,从而允许角色 selected。

角色解锁时

有多种方法可以解决这个问题。您将需要为商店中的每件商品提供某种 ID。因此,我会制作一个 StoreItem 脚本,您将其放置在每件待售商品上。 StoreItem 脚本至少需要一个 ItemID 属性。然后您的 StoreManager 可以像这样检查它是否已解锁:

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

此外,虽然这种方法可行,但不推荐。玩家偏好有可能被游戏外的用户操纵。所以他们可能会给自己免费的物品。我不知道这对你有多重要。更好的方法是将此信息存储在某处的服务器上,并让游戏与其同步以确定玩家拥有哪些物品。

可能有很多方法可以解决这个问题。这是一个;

您需要为每个角色创建一个单独的玩家偏好条目。因此,您需要一种很好的方式来跟踪您拥有的角色及其解锁状态。为什么不在播放器首选项中保存 'unlocked',为什么不创建一个包含解锁信息的 class?

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

然后您可以序列化整个 class 并将整个 class 保存在播放器首选项中。然后,当你加载你的游戏时,你可以从玩家偏好中加载这个 class 来填充你的角色信息。这样,数据得到管理并且在保存的状态之间保持一致。

您可以更进一步,将与您的角色相关的所有内容保存在字典中,其中您的 int 是指代角色的枚举,而 bool 是其解锁状态。然后您可以 save/load 使用播放器首选项再次使用该词典。

在 class 中,您可以使用通用游戏对象脚本调用的辅助方法来保持美观和封装。

这样,您处理特定角色的个人 GameObjects 可以保存对此枚举的引用,您可以使用您的通用脚本 set/modify 基于您的枚举字段的数据内容,然后您可以通过您的检查员,或在您的对象的初始化代码中。

编辑以下评论 - 示例:

您的通用角色控制器将作用于单个对象,并且通过更改您的 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);
    }

}