为多个实例保存 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);
}
}
我设置了一个简单的商店,当玩家点击 '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);
}
}