为多个实例保存PlayerPrefs

时间:2015-04-24 20:58:43

标签: c# unity3d

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

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

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

我可以将脚本放在单独的按钮上,并在检查器下放置相应的游戏对象,但如果我喜欢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

2 个答案:

答案 0 :(得分:2)

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

每个角色你需要一个单独的玩家prefs条目。所以,你需要一个很好的方法来跟踪你拥有的角色和他们的解锁状态。而不是在播放器首选项中保存“未锁定”,为什么不创建一个包含未锁定信息的类?

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

然后,您可以序列化整个类并将整个类保存在播放器首选项中。然后,当您加载游戏时,您可以从播放器首选项加载此类以填充您的角色信息。这样,数据就会被管理,并且在已保存的状态中保持一致。

你可以更进一步,在字典中保存与你的角色相关的所有内容,你的int是一个引用一个字符的枚举,而bool是它的解锁状态。然后,您可以使用播放器首选项再次保存/加载此词典。

在类中,您可以使用通用游戏对象脚本调用辅助方法,以保持良好和封装。

这样,处理特定字符的各个GameObjects可以保存对此枚举的引用,您可以使用通用脚本根据您可以通过检查器设置的枚举字段设置/修改数据内容,或者对象的初始化代码。

编辑以下评论 - 示例:

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

}

答案 1 :(得分:1)

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

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

此外,虽然这种方法可行,但不建议这样做。玩家可以在游戏之外操纵玩家首选项。所以他们可能会给自己免费物品。我不知道这对你有多重要。更好的方法是将这些信息存储在某个地方的服务器上并让游戏与之同步以确定玩家拥有的物品。