当前位置:   article > 正文

Unity中使用ScriptableObject存储数据

scriptableobject存储

一、ScriptableObject简介

1.ScriptableObject概述

ScriptableObject类和MonoBehaviour是并列的,都继承自Object,它可以用来存储大量的数据,并且它是可序列化的,这个特点也正决定了它的一个主要用处就是通过将数据存储在ScriptableObject对象中来减少工程以及游戏运行时因拷贝值所造成的内存占用;

2.ScriptableObject特点

  1. 它能够保存和存储数据到本地Assets下的,数据保存以后是可以共享的,就像纹理、shader等资源一样,是可以共享于当前整个工程和其它工程的。
  2. 很少的回调函数

3.ScriptableObject和预制体

在一个游戏场景中我们往往会用到大量的预制体,对于一个预制体如果我们只想修改它部分的值来让它变成一个不同数据的预制体,那么我们在保留原有预制体的情况下就必须新创建一个预制体,这样就会消耗内存空间;相反如果我们把它做成ScriptableObject,那么我们在创建一个新的预制体的时候只需要引用ScriptableObject中的数据即可,然后生成我们想要的物体,并不会产生多余的内存,并且这些数据也会在游戏运行结束后保存。

二、ScriptableObject的使用

1.使用方法

创建一个脚本,脚本名称可以起你想要存储物品类型的名称,点击脚本后开始编辑,注意要继承ScriptableObject类,可以在脚本中定义私有或公有变量用于存储数据。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//fileName定义的是创建出来的ScripetableObject的默认命名
//MenuName是在Assers下右键单击后Create后面的选项的名称
//加上‘/’可以设置多个层级,可以定义多个类似于Ttem的脚本放置于同一个根选项下
[CreateAssetMenu(fileName ="New Item",menuName ="Item/new Item")]
public class Items : ScriptableObject //需要继承ScriptableObject类
{
    public string name = "Z_hongli";
    public int number = 123456;
    public int age = 20;
    public int score = 90;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

创建好后保存,我们可以在Assets下右键单击创建我们定义的ScriptableObject用于存储数据
请添加图片描述
点击创建好的存储文件我们可以修改其名称,同时也可以在外部修改其内部变量
在这里插入图片描述

2.示例演示

我创建了一个Student脚本,同时将创建的ScriptableObject物体改名叫StudentInformation用于存储数据,student脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Student : MonoBehaviour
{
    //创建一个Items类作为保存数据的数据库,这里我们已经创建好了,就是StudentInformation
    public Items thisitems;  

    public string name;
    public int number;
    public int age;
    public int score;
   
    void Start()
    {
        Read_data();
    }

   
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.A))
        {
            score = score + 10;
            Debug.Log("更新后的分数为:"+score);
        }

        if(Input.GetKeyDown(KeyCode.D))
        {
            Save_data();
            Debug.Log("保存成功!");
        }
        
    }
    
    public void Read_data()
    {
        score = thisitems.score;
        Debug.Log("初始分数为:" + score);
    }
    
    public void Save_data()
    {
        thisitems.score = score;
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

回到Unity中创建一个空物体我更名为Student,将Student脚本拖拽给它,同时将我们定义的“数据库”实例化
在这里插入图片描述
下面是运行脚本后的测试,可以看见能够成功的保存相关数据
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/112470
推荐阅读
相关标签
  

闽ICP备14008679号