15.unity变数传递(下)场景间数据传递

上一篇提到改变其他脚本的全域变数
这一篇针对场景间保留数据的方法作探讨。

在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 只要有钱,什麽缺都做 (雷)系统工程师

>>:  Day1:第一天来点简单的先安装Parrot_Security

[Day29] Room创出来就好吗?

当然要拿来用啊 於是我想利用Room 当我储存每个平台帐号密码的资料库 并且要可以浏览每个平台 这个...

Day 13 文字人脸效果

文字人脸效果 教学原文参考:文字人脸效果 这篇文章会介绍使用 GIMP 的图层混合功能,搭配文字输入...

网络框架:如何制定protocol

接着上一篇,来看看如何制定protocol,制定的时候,一般是server端和client端双方坐下...

【Day29】漫谈 AI 在音乐上其他的优秀作品

超强的 AI 作曲 在 2020 年的时候 NVIDIA 在 YT 上发表了这支影片,里头使用到的音...

Laravel Queue Job:深入理解 timeout 的运作

work 和 listen 的差别 让 queue work 开始执行任务的指令有两个:work 和...