试图在c#unity中保存和加载值,但遇到了问题

试图在c#unity中保存和加载值,但遇到了问题,c#,unity3d,unity5,C#,Unity3d,Unity5,我试图让我的游戏的一部分工作,但有困难解决这个问题 我有一些助推器,如果用户有足够的游戏内硬币可以使用,可以移除游戏碎片。它在一定程度上起作用,一旦使用了助推器,硬币将减少,但在退出并重新加载游戏时,它不会更新正确的值 例如,助推器的使用成本为50个硬币,如果我有200个硬币,使用4个助推器,那么值将更新为0,这样就行了。但是,如果我重新启动,那么值200仍然存在 我用playerprefs设置了一个硬币管理器脚本,在每个关卡后给用户50个硬币,这与增强脚本相链接 助推器等级: public c

我试图让我的游戏的一部分工作,但有困难解决这个问题

我有一些助推器,如果用户有足够的游戏内硬币可以使用,可以移除游戏碎片。它在一定程度上起作用,一旦使用了助推器,硬币将减少,但在退出并重新加载游戏时,它不会更新正确的值

例如,助推器的使用成本为50个硬币,如果我有200个硬币,使用4个助推器,那么值将更新为0,这样就行了。但是,如果我重新启动,那么值200仍然存在

我用playerprefs设置了一个硬币管理器脚本,在每个关卡后给用户50个硬币,这与增强脚本相链接

助推器等级:

public class Booster : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler {


    Image m_image;
    RectTransform m_rectXform;
    Vector3 m_startPosition;
    Board m_board;
    Tile m_tileTarget;

    public static GameObject ActiveBooster;
    public Text instructionsText;
    public string instructions = "drag over game piece to remove";

    public bool isEnabled = false;
    public bool isDraggable = false;
    public bool isLocked = false;

    public List<CanvasGroup> canvasGroups;
    public UnityEvent boostEvent;
    public int boostTime = 15;

    //coin test
    CoinManager coinManager;

    private void Awake()
    {
        m_image = GetComponent<Image> ();
        m_rectXform = GetComponent<RectTransform> ();
        m_board = Object.FindObjectOfType<Board> ().GetComponent<Board> ();
        coinManager = GameObject.Find ("CoinManager").GetComponent<CoinManager> ();

    }

    void Start () 
    {
        EnableBooster (false);
    }

    public void EnableBooster(bool state)
    {
        isEnabled = state;

        if (state)
        {
            DisableOtherBoosters ();
            Booster.ActiveBooster = gameObject;
        }
        else if(gameObject == Booster.ActiveBooster)
        {
            Booster.ActiveBooster = null;
        }

        m_image.color = (state) ? Color.white : Color.gray;

        if (instructionsText != null)
        {
            instructionsText.gameObject.SetActive (Booster.ActiveBooster != null);

            if (gameObject == Booster.ActiveBooster)
            {
                instructionsText.text = instructions;
            }
        }
    }

    void DisableOtherBoosters()
    {
        Booster[] allBoosters = Object.FindObjectsOfType<Booster> ();

        foreach (Booster b in allBoosters)
        {
            if (b != this)
            {
                b.EnableBooster (false);
            }
        }
    }

    public void ToggleBooster()
    {
            EnableBooster (!isEnabled);
    }


    public void OnBeginDrag (PointerEventData eventData)
    {
        if (isEnabled && isDraggable && !isLocked)
        {
            m_startPosition = gameObject.transform.position;
            EnableCanvasGroups (false);
        }
    }

    public void OnDrag (PointerEventData eventData)
    {
        if (isEnabled && isDraggable && !isLocked && Camera.main != null)
        {
            Vector3 onscreenPosition;
            RectTransformUtility.ScreenPointToWorldPointInRectangle (m_rectXform, eventData.position,
                Camera.main, out onscreenPosition);

            gameObject.transform.position = onscreenPosition;

            RaycastHit2D hit2D = Physics2D.Raycast (onscreenPosition, Vector3.forward, Mathf.Infinity);

            if (hit2D.collider != null)
            {
                m_tileTarget = hit2D.collider.GetComponent<Tile> ();
            }
            else
            {
                m_tileTarget = null;
            }
        }
    }


    public void OnEndDrag (PointerEventData eventData)
    {
        if (isEnabled && isDraggable && !isLocked)
        {
            gameObject.transform.position = m_startPosition;
            EnableCanvasGroups (true);
            if (m_board != null && m_board.isRefilling)
            {
                return;
            }

            if (m_tileTarget != null)
            {
                if (boostEvent != null)
                {
                    boostEvent.Invoke ();   //can do things here like play a sound effect
                }

                EnableBooster (false);

                m_tileTarget = null;
                Booster.ActiveBooster = null;
            }
        }
    }

    void EnableCanvasGroups(bool state)
    {
        if (canvasGroups != null && canvasGroups.Count > 0)
        {
            foreach (CanvasGroup cGroup in canvasGroups)
            {
                if (cGroup != null)
                {
                    cGroup.blocksRaycasts = state;
                }
            }
        }
    }

    public void RemoveOneGamePiece()
    {
        if (m_board != null && m_tileTarget != null)
        {
            if (coinManager.currentCoinCount >= 50)
            {
                m_board.ClearAndRefillBoard (m_tileTarget.xIndex, m_tileTarget.yIndex);
                coinManager.AddCoins (-50);

                coinManager.SetCoinCount();
                coinManager.ShowCoinCount ();
            }
        }
    }

    public void AddTime()
    {
        if (GameManager.Instance != null)
        {
            if (coinManager.currentCoinCount >= 50){
                GameManager.Instance.AddTime (boostTime);
                coinManager.AddCoins (-50);

                coinManager.SetCoinCount();
                coinManager.ShowCoinCount ();
            }
        }
    }

    public void DropColorBomb()   //big bomb
    {
        if (m_board != null && m_tileTarget != null)
        {
            if (coinManager.currentCoinCount >= 50)
            {
                m_board.MakeColorBombBooster (m_tileTarget.xIndex, m_tileTarget.yIndex);
                coinManager.AddCoins (-50);

                coinManager.SetCoinCount();
                coinManager.ShowCoinCount ();
            }
        }
    }
}
公共类增强程序:monobhavior、IDragHandler、IBeginDragHandler、iendraghandler{
图像m_图像;
矩形变换m_矩形变换;
矢量3 m_起始位置;
董事会m_董事会;
瓷砖m_tileTarget;
公共静态游戏对象;
公共文本说明文本;
public string instructions=“拖动游戏块以移除”;
公共布尔值isEnabled=false;
公共bool isDraggable=false;
public bool isLocked=false;
公开名单拉票团体;
公共单位事件boostEvent;
公共整数boostTime=15;
//硬币测试
CoinManager CoinManager;
私人空间
{
m_image=GetComponent();
m_rectXform=GetComponent();
m_board=Object.FindObjectOfType().GetComponent();
coinManager=GameObject.Find(“coinManager”).GetComponent();
}
无效开始()
{
使能助推器(假);
}
公共无效启用助推器(布尔州)
{
isEnabled=状态;
如果(州)
{
禁用其他助推器();
Booster.ActiveBooster=游戏对象;
}
else if(gameObject==Booster.ActiveBooster)
{
Booster.ActiveBooster=null;
}
m_image.color=(状态)?color.white:color.gray;
如果(指令文本!=null)
{
指令text.gameObject.SetActive(Booster.ActiveBooster!=null);
if(gameObject==Booster.ActiveBooster)
{
指令text.text=指令;
}
}
}
无效禁用其他助推器()
{
Booster[]allBoosters=Object.FindObjectsOfType();
foreach(所有助推器中的助推器b)
{
如果(b!=这个)
{
b、 使能助推器(假);
}
}
}
public void ToggleBooster()
{
使能助推器(!isEnabled);
}
公共void OnBeginDrag(PointerEventData事件数据)
{
如果(isEnabled&&IsDragable&&isLocked)
{
m_startPosition=gameObject.transform.position;
EnableCanvasGroup(假);
}
}
public void OnDrag(PointerEventData事件数据)
{
if(isEnabled&&IsDragable&&isLocked&&Camera.main!=null)
{
矢量3在屏幕位置;
RectTransformUtility.ScreenPointToWorldPointInRectangle(m_rectXform,eventData.position,
Camera.main,外屏幕位置);
gameObject.transform.position=屏幕位置;
RaycastHit2D hit2D=Physics2D.Raycast(屏幕位置,矢量3.forward,数学无穷大);
if(hit2D.collider!=null)
{
m_tileTarget=hit2D.collider.GetComponent();
}
其他的
{
m_tileTarget=null;
}
}
}
公共无效OnEndRag(PointerEventData事件数据)
{
如果(isEnabled&&IsDragable&&isLocked)
{
gameObject.transform.position=m_startPosition;
EnableCanvasGroup(真);
if(m_board!=null&&m_board.isRefilling)
{
返回;
}
if(m_tileTarget!=null)
{
if(boostEvent!=null)
{
boostEvent.Invoke();//可以在这里做一些事情,比如播放音效
}
使能助推器(假);
m_tileTarget=null;
Booster.ActiveBooster=null;
}
}
}
无效启用画布组(布尔状态)
{
if(canvasGroups!=null&&canvasGroups.Count>0)
{
foreach(CanvasGroup中的CanvasGroup cGroup)
{
if(cGroup!=null)
{
cGroup.blocksRaycasts=状态;
}
}
}
}
public void RemoveOneGamePiece()
{
if(m_board!=null&&m_tileTarget!=null)
{
如果(coinManager.currentCoinCount>=50)
{
m_board.clear和fillboard(m_tileTarget.xIndex,m_tileTarget.yIndex);
coinManager.AddCoins(-50);
SetCoinCount();
coinManager.showconcount();
}
}
}
公共void AddTime()
{
if(GameManager.Instance!=null)
{
如果(coinManager.currentCoinCount>=50){
GameManager.Instance.AddTime(boostTime);
coinManager.AddCoins(-50);
SetCoinCount();
coinManager.showconcount();
}
}
}
公共空间DropColorBomb()//大炸弹
{
if(m_board!=null&&m_tileTarget!=null)
{
如果(coinManager.currentCoinCount>=50)
{
m_board.MakeColorBombBooster(m_tileTarget.xIndex,m_tileTarget.yIndex);
coinManager.AddCoins(-50);
SetCoinCount();
coinManager.showconcount();
}
}
}
}
CoinManager类:

public class CoinManager : Singleton<CoinManager>{
    // reference to the UI Text element
    public Text coinText;

    // current number of coins earned during gameplay
    public int currentCoinCount = 0;

    // because we don't have a key set, we should create it and initialize its value to 0
    public void InitCoinCount()
    {
        if (!PlayerPrefs.HasKey("TotalCoins"))
        {
            PlayerPrefs.SetInt("TotalCoins",0);
        }
    }

    // returns the number of coins stored in PlayerPrefs
    public int GetCoinCount()
    {
        if (PlayerPrefs.HasKey("TotalCoins"))
        {
            return PlayerPrefs.GetInt("TotalCoins");
        }

        // if we don't have the key set, so return 0
        return 0;
    }

    // sets a number of coins into PlayerPrefs if the current coin count is greater
    public void SetCoinCount()
    {
        if (PlayerPrefs.HasKey("TotalCoins"))
        {
            int oldCoins = PlayerPrefs.GetInt("TotalCoins"); 
            if (currentCoinCount > oldCoins)
            {
                PlayerPrefs.SetInt("TotalCoins", currentCoinCount);
            }
        }
    }

    // display the coin count as a TextUI
    public void ShowCoinCount()
    {

        if (coinText != null)
        {
            coinText.text = currentCoinCount.ToString();
        }
    }

    //new method for oldcoin count
    public void AddCoins(int coins)
    {
        currentCoinCount = currentCoinCount + coins;
    }
}
公共类CoinManager:Singlet
// sets a number of coins into PlayerPrefs if the current coin count is greater
// sets a number of coins into PlayerPrefs if the current coin count is greater
public void SetCoinCount()
{
    if (PlayerPrefs.HasKey("TotalCoins"))
    {
        int oldCoins = PlayerPrefs.GetInt("TotalCoins"); 
        if (currentCoinCount > oldCoins)
        {
            PlayerPrefs.SetInt("TotalCoins", currentCoinCount);
        }
    }
}
// sets a number of coins into PlayerPrefs
public void SetCoinCount()
{
    PlayerPrefs.SetInt("TotalCoins", currentCoinCount);
}