Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存多个实例的playerPref_C#_Unity3d - Fatal编程技术网

C# 保存多个实例的playerPref

C# 保存多个实例的playerPref,c#,unity3d,C#,Unity3d,我已经建立了一个简单的商店,当玩家点击“购买”一个角色时,物品会被解锁并保存为解锁状态。这是一个场景(商店场景) 我有一个第二个场景,在这个场景中角色被解锁,玩家可以选择(角色场景) 我将脚本放置在每个场景的空游戏对象上。只要买一个角色就可以了。但是我如何为多个字符复制这个呢 class CharacterManager { public enum CHAR_TYPE = { characterA, characterB, characterC } private Diction

我已经建立了一个简单的商店,当玩家点击“购买”一个角色时,物品会被解锁并保存为解锁状态。这是一个场景(商店场景)

我有一个第二个场景,在这个场景中角色被解锁,玩家可以选择(角色场景)

我将脚本放置在每个场景的空游戏对象上。只要买一个角色就可以了。但是我如何为多个字符复制这个呢

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);
    }

}
我可以将脚本放在单个按钮上,并将相应的游戏对象放在检查器下,但如果我有100个字符,这将是不实际的

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);
    }

}
请告知我如何在多个实例中执行此操作。想到标记,这似乎也不可行。如果有更好的方法,我愿意接受建议。谢谢

//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);
     }
 }
这是unity设置在商店场景中的外观。如果物品已经购买,灰色图像将设置为活动,因此用户无法再单击绿色的购买按钮

当角色被解锁/购买时

 //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设置如何查找角色选择场景。如果角色已解锁,灰色选择图像将设置为非活动,橙色选择按钮将可见,从而允许选择角色

当角色解锁时


有很多方法可以做到这一点。对于商店中的每件商品,您都需要某种ID。因此,我会制作一个StoreItem脚本,您可以将其放置在每件待售商品上。StoreItem脚本至少需要一个ItemID属性。然后,您的店长可以检查它是否已解锁,如下所示:

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

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

解决此问题的方法可能有很多。这里有一个

每个角色都需要一个单独的玩家prefs条目。因此,您需要一种很好的方法来跟踪您拥有的角色及其解锁状态。为什么不创建一个包含解锁信息的类,而不是将“unlocked”保存在player prefs中

class UnlockedCharacters
{
    bool characterAUnlocked = false;
    bool characterBUnlocked = false;
    bool characterCUnlocked = true;
}
然后可以序列化整个类并将整个类保存在player prefs中。然后,当你加载游戏时,你可以从玩家prefs加载这个类来填充你的角色信息。通过这种方式,数据得到管理,并且在保存的状态之间保持一致

您可以更进一步,将与字符相关的所有内容都保存在字典中,其中int是指字符的枚举,bool是其解锁状态。然后,您可以使用player prefs再次保存/加载此词典

在这个类中,你可以使用辅助方法和你的通用游戏对象脚本调用来保持良好和封装

通过这种方式,处理特定角色的单个游戏对象可以保存对此枚举的引用,并且您可以使用通用脚本根据枚举字段设置/修改数据内容,然后您可以通过检查器或对象的初始化代码进行设置

编辑以下评论-示例:

您的通用字符控制器将在单个对象上运行,通过更改字符类型,相同的脚本将用于解锁多个字符

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);
    }

}
类字符管理器
{
公共枚举字符类型={characterA,characterB,characterC}
私有字典字符UnlockState;
void Start()
{
//例如,使用某些数据进行种子设定
characterUnlockState=新字典();
characterUnlockState.Add(CHAR\u TYPE.characterA,false);
characterUnlockState.Add(CHAR\u TYPE.characterB,false);
characterUnlockState.Add(CHAR\u TYPE.characterC,true);
}
public bool IsCharacterUnlocked(字符类型字符)
{
if(characterUnlockState.Contains(character))返回characterUnlockState[character];
返回false;
}
公共无效解锁字符(字符类型字符)
{
如果(characterUnlockState.Contains(character))characterUnlockState[character]=true;
}
}
类GenericCharacterController
{
公共字符类型字符;
公众人物经理;
public void UnlockButtonPressed()
{
manager.UnlockCharacter(字符);
}
}

假设我有10个字符,那么复制10个只处理Id的项目脚本,并为存储区提供一个主脚本来处理其余的?因为我想我最终还是要处理每个角色的灰色/橙绿色/灰色按钮的开/关,将它们声明为公共按钮并单独分配。你能给我举个粗略的例子吗。我的脑袋绕不过去。您将创建一个StoreItem模板对象。模板对象将具有与商店项目(橙色按钮等)关联的所有UI元素的公共属性。为模板构建预制件后,将向门店经理添加一个模板属性,并将刚制作的预制件与之关联。然后,您可以在运行时动态实例化所有存储项,并可能对每个存储项调用一个名为SetCharacter(characterName)的方法;在该方法中,您可以检查playerprefs以查找传入的名称,然后更改该项目的UI元素。您可以通过在角色列表中循环并为每个角色创建一个新的StoreItem对象来动态完成这一切。然后,您只需将您的角色ID传递给StoreItem,它将根据其确定的所有权状态更新自己的UI。各个按钮必须有自己的激活的公共方法