跟siki学院教程学习愤怒的小鸟案例存储星星解决记录<二>

使用PlayerPrefs存储并显示星星数据无效bug

保存不了星星数据。。。
找了一天,完全跟siki学院的代码一模一样,但就是运行不起来,后来我(在一个撤退键上的脚本)设置所有相关的存储的变量都赋初值0,就好了,灰常玄学,不过这个归零键倒是对之后敲代码调试蛮有帮助。

判断下一关卡是否开启使用的int.Parse造成字符串格式错误bug

我抄代码判断小关卡该不该可选时,用的int.Parse总是报错FormatException异常,(字符串内容不是数字)还有很多高级语句用法出错
于是只能重新写储存数据的大部分,写的非常的绕圈绕圈绕圈

小关卡选择的部分代码levelSelect:

private void Start()
    {
            if (PlayerPrefs.GetInt("Star") /2>= int.Parse(gameObject.name)) 
                    //如果够该关卡的星星数量,则使该关卡可点击
            {
                isSelect = true;
            }
    }
public void Selected()
    {
         if (isSelect == true)
         {
                SceneManager.LoadScene(2);//进入游戏
                PlayerPrefs.SetString("nowLevel", "level" + gameObject.name);
                //gameObject.name 是挂载当前脚本的物体, 不是某关卡
         }
    }

大关卡选择的部分代码mapSelect:

 void Start()
    {
        if (StarNum == 0)//通过标识符判断是哪一大系列关卡,同时也是开启该关卡需要的星星数
        {
            if (PlayerPrefs.GetInt("Star") >= StarNum)
            //如果够该关卡的星星数量,则使该关卡可点击,star为星星总数
            {
                isSelect = true;

                PlayerPrefs.SetInt("Map", 1);//为第一个map大关卡

                LevelStarsText.text = PlayerPrefs.GetInt("Map1") + "/27";
                //输出该关卡的星星总数在游戏界面上(Map)/27
            }
        }
        if (isSelect)
        {
            locks.SetActive(false);//点击后的使锁消失,显示出星星数量
            stars.SetActive(true);
    }
    

gameManager

public void SaveStar()
    {

        if (starsNum1 > PlayerPrefs.GetInt(PlayerPrefs.GetString("nowLevel")))
        {
            PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starsNum1);
             int sum = 0;

            if (PlayerPrefs.GetInt("Map") == 1)
            {
                sum = PlayerPrefs.GetInt("level1") + PlayerPrefs.GetInt("level2") + PlayerPrefs.GetInt("level3") +
                       PlayerPrefs.GetInt("level4") + PlayerPrefs.GetInt("level5") + PlayerPrefs.GetInt("level6") +
                       PlayerPrefs.GetInt("level7") + PlayerPrefs.GetInt("level8") + PlayerPrefs.GetInt("level9");//累加,见笑了,抄了好多高级代码都运行不了,只能写底端逻辑
                PlayerPrefs.SetInt("Map1", sum);
            }
        }
    }

储存数据思路详解

代码如上图123,重点将每一关卡从1开始取数字名字
首先在levelSelect里的点击跳转的函数上把该小关卡的名字"level" + gameObject.name以字符串的形式传给nowLevel
(gameObject:在每个小关卡都挂上levelSelect脚本)
在这里插入图片描述

 public void Selected()
        {
        if (isSelect == true)
            {
                SceneManager.LoadScene(2);
                PlayerPrefs.SetString("nowLevel", "level" + gameObject.name);
                //gameObject.name 是挂载当前脚本的物体 不是关卡
            }
        }

再去gameManager里的储存函数把当前这个关卡的星星数量starsNum1存到nowLevel里的字符串level+n
而nowLevel里的字符串会随着小关卡的点击一直刷新,变成点击的某关卡的名字

 public void SaveStar()
    {

        if (starsNum1 > PlayerPrefs.GetInt(PlayerPrefs.GetString("nowLevel")))
            //判断下,只存最高数据
        {
            PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starsNum1);
            //取出nowLevel里的字符串level+n,把星星数复制给他
        }

最后去mapSelect存储大关卡的总星星数,就用最简单的map1=level1+…leveln,存每个大关卡的数据,代码如上图2

小鸟飞行中点击暂停会释放技能

记个笔记之后注意
小鸟飞行中点击暂停会释放技能的问题:可以通过设置UI界面的【raycast target】属性,不勾选可以不做交互,让鼠标点击穿过这层UI。

去往下一关的设置

  public void playNext()
        {
            Time.timeScale = 1;
            SaveStar();//存储数据
            string levelNum = PlayerPrefs.GetString("nowLevel");
            //去掉字符串里带level的字符,即得到当前是第几关
            levelNum = levelNum.Replace("level", "");
            //关卡数加一 这里还要判断一下当前i是否大于当前地图里边最大的关卡数54
            int i = int.Parse(levelNum) + 1;
            levelNum = "level" + i.ToString();//(level“第几关卡”)
            
            if ((PlayerPrefs.GetInt("Star") / 2 >= i)&&i<55)//如果星星总数÷2大于下一关卡的名字(每一关从1的顺序取名)
            //如果星星数量够去往下一关,则跳转
            {
                PlayerPrefs.SetString("nowLevel", levelNum);
                SceneManager.LoadScene(2);
            }
        }

这个脚本挂在游戏game.unity里的主摄像机上,摄像机下清空,游戏打包到文件夹里,当跳转到SceneManager.LoadScene(2) 时去往nowLevel此时代表队字符串level+n,第n个关卡里。
在这里插入图片描述


public class loadLevel : MonoBehaviour
{
    private void Awake()
    {
        Instantiate(Resources.Load(PlayerPrefs.GetString("nowLevel")));
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值