使用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")));
}
}