Unity C#脚本使用ScriptableObejct类存储数据

2022年5月8日 3720点热度 1人点赞 0条评论

前言

使用ScriptableObejct时,需要在脚本中继承它,这个类有一个特殊的地方,他生成的实例对象可以以文件(.asset)的形式存储在项目中,在游戏运行中修改对象的数据也会及时保存到文件中。也就是说希望保留下来的游戏运行数据都可以继承这个数据容器生成游戏对象来存储。

使用ScriptableObject

使用时,只需要在脚本中继承它就可以了

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

[CreateAssetMenu(fileName = "New RoleInformation",menuName = "RoleInformation",order = 0)]
public class RoleInformation : ScriptableObject
{
    public string roleName = "AMiao";
    public int level = 1;
}

RoleInformation类用于存储角色信息,这里包括角色名称和角色等级。

这里用到了Unity的一个特性 CreateAssetMenu这个特性用于在Unity Edit中菜单Create中创建一个按钮,这个按钮用于创建RoleInformation的预制件。

CreateAssetMenu

有关于特性的使用在C#脚本的基本概念中有介绍,可以参考。

他的作用是对 ScriptableObject 派生类型进行标记,使其自动列在 Assets/Create 子菜单中,以便能够轻松创建该类型的实例并将其作为“.asset”文件存储在项目中。

这个特性有三个参数可以使用

参数名 作用
fileName 此类型的新建实例使用的默认文件名。
menuName Assets/Create 菜单中显示的此类型的显示名称,使用/可以给菜单分级。
order Assets/Create 菜单中菜单项的位置。

Unity_Script1

添加特性之后,就可以这样直接在资源窗口中创建RoleInformation对象了。

在运行时修改对象数据

LevelUp.cs 实现在玩家按下上键时,给角色升级。

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

public class LevelUp : MonoBehaviour
{
    // Start is called before the first frame update
    public RoleInformation information;
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.UpArrow))
            information.level += 1;
    }
}

将脚本放到角色上,然后将创建好的RoleInformation对象拖拽到脚本中,运行之后按上方向键,可以看到RoleInformation对象的Level属性增加,关闭游戏之后Level属性依然是游戏运行时修改的样子,这样就将运行时的数据存储下来了。

注意: 继承ScriptableObject的类的对象转换为.asset文件之后,在游戏中使用,如果有多个GameObject对这个对象的数据进行修改,那么修改的是同一份数据。

大脸猫

这个人虽然很勤快,但什么也没有留下!

文章评论