上一篇提到改变其他脚本的全域变数
这一篇针对场景间保留数据的方法作探讨。
在unity换场景(scene)时,会重新加载脚本,不会保留在前一个场景中所做的改变。
所以,依照原本将变数存放在一般class的做法,会因为重新加载场景而遗失资料。因此,小红帽捡5几颗苹果,换场景到奶奶家苹果就会归零。
1. Static class,用静态类别来实现。
供静态类别须符合︰
- 仅包含静态成员。 (全部都要static)
- 无法具现化。(无法instantiated)
- 已密封。(要封装好)
- 不能包含执行个体建构函式。(不能使用建构式)
静态类别,让整个游戏都能使用这个类别里面的变数。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class ScoreBoard // 不能继承MonoBehaviour,不能挂在物件上面
{
public static int score;
static ScoreBoard(){ //初始化,开启应用程序时会执行一遍。
score=0; //初始化静态类别成员
}
}
※此静态类别不能挂在物件上面,因为没有继承MonoBehaviour,该脚本存在Assets就会执行到唷。
在其他脚本调用变数(脚本名.变数)
private int s = ScoreBoard.score; //将全域变数存下来
ScoreBoard.score++; //直接修改全域变数
s++; //修改存下来的全域变数值
ScoreBoard.score=s; //存回全域变数
2. DontDestroyOnLoad的使用
直接从根本上解决问题,不要把角色删掉就好了!
但是这样做会有一个问题,如果回到原本的场景,场景仍会加载,再次创一个角色。
所以在使用DontDestroyOnLoad的时候,要注意不要让角色重复生成。
官方举例:背景音乐重复使用(播放不中断)
DontDestroy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DontDestroy : MonoBehaviour
{
void Awake()
{
//用阵列取得所有tag"music"物件,希望只有objs[0]一项,objs.Length=1
GameObject[] objs = GameObject.FindGameObjectsWithTag("music");
//如果阵列不只一项(第二次加载时重复新增该物件)
if (objs.Length > 1)
{
//就删除该次加载场景建立物件
Destroy(this.gameObject);
}
//如果阵列只有一项,就不要删掉这个物件(首次加载)
DontDestroyOnLoad(this.gameObject);
}
}
以上可在场景间传递变数,但仍然不能保存游戏进度,如果关闭应用程序再次开启,数据会刷新。
更多方法请参考教学
>>: Day1:第一天来点简单的先安装Parrot_Security
当然要拿来用啊 於是我想利用Room 当我储存每个平台帐号密码的资料库 并且要可以浏览每个平台 这个...
文字人脸效果 教学原文参考:文字人脸效果 这篇文章会介绍使用 GIMP 的图层混合功能,搭配文字输入...
接着上一篇,来看看如何制定protocol,制定的时候,一般是server端和client端双方坐下...
超强的 AI 作曲 在 2020 年的时候 NVIDIA 在 YT 上发表了这支影片,里头使用到的音...
work 和 listen 的差别 让 queue work 开始执行任务的指令有两个:work 和...