[游戏开发][Unity] ScriptableObject数据创建与各种加载方式

news2024/11/17 19:49:53

  前言

 ScriptableObject支持把类对象数据序列化成Unity asset文件,同时支持反序列化成类对象。本文章通过两个案例讲解ScriptableObject的使用方式,第一个是简单案例,序列化简单的bool值和Sting数据。第二个是复杂案例,在类对象里嵌套类对象并序列化成asset文件,再把它反序列化出来。

案例1 

[CreateAssetMenu]
public class GameSetting : ScriptableObject
{
    public static GameSetting Instance;

    public bool AssetbundleMode;

    public string GameName = "Story";
}

案例2 

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

[Serializable]
public class TestData
{
    public string Name;
    public int index;
}

[CreateAssetMenu]
public class TestScriptableObject : ScriptableObject
{
    public List<TestData> dataList = new List<TestData>();
}

 正文

 下面开始第一个案例,序列化数据如下

using UnityEngine;

[CreateAssetMenu]
public class GameSetting : ScriptableObject
{
    public static GameSetting Instance;
    public bool AssetbundleMode;
    public string GameName = "Test!!!!!";
}

 创建Unity Aseet文件的两种方式

 创建方式1,通过菜单创建,文件会出现在Assets文件夹内

 创建方式2,通过代码创建,可以设置创建路径,并设置数据

private void CreateGameSetting()
{
    string path = "Assets/Works/Resource/AllGameSetting/GameSetting.asset";
    GameSetting setting = ScriptableObject.CreateInstance<GameSetting>();
    setting.AssetbundleMode = true;
    setting.GameName = "Test!!!!!";
    AssetDatabase.CreateAsset(setting, path);
    AssetDatabase.SaveAssets();
    AssetDatabase.Refresh();
}

加载GameSetting.asset的三种方式

 方式1:Resources加载

GameSetting setting = Resources.Load<GameSetting>("GameSetting");

方式2:编辑器加载

  private void EditorLoadGameSetting()
    {
        GameSetting setting = AssetDatabase.LoadAssetAtPath<GameSetting>("Assets/Works/Resource/AllGameSetting/GameSetting.asset");
        Debug.LogError(setting.AssetbundleMode);
        FSMManager.Instance.Init();
    }

方式3:assetbundle加载GameSetting

把这个GameSetting.asset文件打包成ab包

 void LoadGameSettingFromBundle()
    {
        string loadPath = Application.streamingAssetsPath + "/assets/works/resource/allgamesetting/gamesetting.unity3d";
        AssetBundle bundle = AssetBundle.LoadFromFile(loadPath);
        //全路径加载也可以
        //GameSetting.Instance = bundle.LoadAsset<GameSetting>("assets/works/resource/allgamesetting/gamesetting.asset");
        GameSetting.Instance = bundle.LoadAsset<GameSetting>("GameSetting.asset");
        Debug.LogError("GameName: " + GameSetting.Instance.GameName);
    }

下面开始第二个复杂案例。

调用下面的代码都可以创建一个Unity Asset文件

private void GetBundleRelationFile()
{
    string path = "Assets/Works/Resource/AllGameSetting/TestData.asset";
    TestScriptableObject testData = ScriptableObject.CreateInstance<TestScriptableObject>();
    AssetDatabase.CreateAsset(test, path);
    AssetDatabase.SaveAssets();
    AssetDatabase.Refresh();
}

填充数据到Asset内

加载BundleRelation.asset的三种方式

方式1:Resources加载

把BundleRelation.asset拷贝到Resources文件夹内,执行下面代码 

BundleRelation relation = Resources.Load<BundleRelation>("BundleRelation");

方式2:Editor加载

    private void EditorLoadBundleRelation()
    {
        BundleRelation setting = AssetDatabase.LoadAssetAtPath<BundleRelation>("Assets/Works/Resource/AllGameSetting/BundleRelation.asset");
        Debug.LogError(setting.AssetRefs.Length);
    }

方式3:Bundle加载

先打包成bundle

   public void LoadBundleRelation()
    {
        string loadPath = Application.streamingAssetsPath + "/assets/works/resource/allgamesetting/testdata.unity3d";
        AssetBundle bundle = AssetBundle.LoadFromFile(loadPath);
        TestScriptableObject TestData = bundle.LoadAsset<TestScriptableObject>("TestData.asset");
        Debug.LogError("TestScriptableObject.TestData.dataList[1].Name: " + TestData.dataList[1].Name);
        Debug.LogError("TestScriptableObject.TestData.dataList[1].Index: " + TestData.dataList[1].index);
    }

出现报错的情况

我刚才测试特别复杂的类对象,多级嵌套,出现了反序列化失败的情况,可能是我某个地方写的有问题,没时间看了,先记录下载,以后有机会解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1110200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.IDEA的安装使用指南

学习Java的第二步应该是从IDEA下手&#xff0c;这篇博文介绍了它的安装及使用&#xff0c;希望大家看完后可以独立安装 ~ 文章目录 一、下载安装包二、安装 IDEA三、IDEA 初步上手 一、下载安装包 安装包可以从官网下载&#xff0c;也可以直接私信我拿取。这里主要介绍如何在官…

了解远程连接工具

什么是远程连接 远程连接就是在远程连接另外一台计算机。当某台计算机开启了远程桌面连接功能后我们就可以在网络的另一端控制这台计算机了&#xff0c;通过远程桌面功能我们可以实时的操作这台计算机&#xff0c;在上面安装软件&#xff0c;运行程序&#xff0c;所有的一切都…

TOPDON获评2023年度“汽车后市场科技创新企业”,研发实力被认可

近期&#xff0c;由《环球时报》社、中国企业网主办的2023(第六届)中国经济大会在北京召开&#xff0c;本次大会以“迈向高质量&#xff0c;问道新发展”为主题&#xff0c;政商产学研嘉宾同襄盛会&#xff0c;交流发展理念&#xff0c;分享创新经验&#xff0c;为推动产业变革…

最佳买股票的时机------题解报告

题目&#xff1a; 暴力双循环会时间超限 一次循环&#xff0c;不断更新min和sum值 时间复杂度为O(n),空间复杂度为O(1) 写完之后看了一眼题解&#xff0c;发现没有更好的方法 public int maxProfit(int[] prices) {int sum 0,minprices[0];for(int i1;i <prices.length;i…

在Kubernetes(k8s)上部署整个SpringCloud微服务应用

文章目录 项目准备打成使用Docker打成镜像准备Docker仓库打包项目为Docker镜像 部署应用到k8s创建nfs挂载目录创建一些基本资源创建命名空间创建拉取镜像的secret创建java运行环境的profile 部署mysql创建持久化的pv和pvc创建mysql root密码的secret创建mysql配置文件部署有状态…

Ubuntu小知识总结

Ubuntu相关的小知识总结 Ubuntu系统下修改用户开机密码Vmware虚拟机和主机之间复制、粘贴内容、拖拽文件的详细方法问题描述Vmware tools灰色不能安装解决方法小知识点&#xff1a;MarkDown的空格 Ubuntu系统下修改用户开机密码 在 Ubuntu 中修改用户密码 —— 通过命令行 在 U…

Python 机器学习入门之K-Means聚类算法

系列文章目录 第一章 Python 机器学习入门之线性回归 K-Means聚类算法 系列文章目录前言一、K-Means简介1、定义2、例子3、K-Means与KNN 二、 K-Means实现1、步骤2、优化2.1 初始化优化之K-Means2.2 距离优化之elkan K-Means 三、优缺点1、优点2、缺点 前言 学完K近邻算法&a…

UWB十个知识点

UWB是一直被基于厚望的高精度定位技术 1&#xff1a;定位技术及UWB特点 位置空间感知技术包括了GNSS、RFID、蓝牙和UWB&#xff0c;在室内和区域空间测量最具技术优势的技术是UWB。 GNSS是广域定位技术&#xff0c;室内以及建筑物旁边等场景&#xff0c;GNSS无法实现定位&am…

PHP-FFMpeg 操作音视频

✨ 目录 &#x1f388; 安装PHP-FFMpeg&#x1f388; 视频中提取一张图片&#x1f388; 视频中提取多张图片&#x1f388; 调整视频大小&#x1f388; 视频添加水印&#x1f388; 生成音频波形&#x1f388; 音频转换&#x1f388; 给音频添加元数据&#x1f388; 拼接多个音视…

印刷包装经营小程序商城的作用是什么

印刷包装业的市场需求度非常高&#xff0c;如礼品盒、标签、购物袋、企业宣传物料、周边等大小服务&#xff0c;线下各城市从业者与线上行业电商数量也很多。 然而随着线下竞争激烈、用户线上消费度提升&#xff0c;同时线上第三方平台入驻商家面临抽成/入驻费/流量费、难以打…

最近邻插值的原理及实现

1. 介绍 插值算法一般用来做上采样和下采样,最邻近插值算法,是插值算法中最简单的一种。 最邻近插值:将每个目标像素找到距离它最近的原图像素点,然后将该像素的值直接赋值给目标像素。 优点: 实现简单,计算速度快 缺点:插值结果缺乏连续性,可能会产生锯齿状的边缘,对…

docker 配置mongoDB

## 拉取镜像 docker pull mongo## 设置默认账号密码 test:test 默认数据 test docker run -d --name mongo-container -e MONGO_INITDB_ROOT_USERNAMEtest -e MONGO_INITDB_ROOT_PASSWORDtest -e MONGO_INITDB_DATABASEtest -p 27017:27017 mongo

nginx优先级和匹配方式

在http模块有server server中才有location location匹配的是uri Nginx正则表达式&#xff1a; ^&#xff1a;字符串的起始位置 $&#xff1a;字符串的结束位置 *&#xff1a;匹配所有 &#xff1a;匹配前面的字符一次或多次 &#xff1f;&#xff1a;匹配前面的字符0次或…

redhat配置本地yum源(超详细,超简单)

目录 ​编辑 1、硬件配置 2、配置本地yum源 1、硬件配置 注意这里要使用is

2023年浙大MEM考前80天上岸经验分享

时间过得真快&#xff0c;转眼间已经是十月份了。回想起去年这个时候&#xff0c;我还在为考研而感到焦虑不安。然而&#xff0c;如今我已经在浙大MEM项目学习了一个多月的时间了。在这一个月的学习过程中&#xff0c;我不仅学到了许多专业知识&#xff0c;还结识了很多志同道合…

C++(Qt)软件调试---linux使用dmesg定位程序崩溃位置(14)

C(Qt)软件调试—linux使用dmesg定位程序崩溃位置&#xff08;14&#xff09; 文章目录 C(Qt)软件调试---linux使用dmesg定位程序崩溃位置&#xff08;14&#xff09;1、前言2、ELF文件3、常用工具4、使用dmesg定位异常位置1.1 异常发生在可执行程序中1.2 异常发生在动态库中 1、…

上海见 | 易基因科技与您相约2023年中国微生物学会学术年会

由中国微生物学会、上海市微生物学会主办&#xff0c;复旦大学、复旦大学上海医学院、上海交通大学、华东理工大学承办的“2023年中国微生物学会学术年会”将于2023年10月20—23日在上海光大会展中心有限公司国际大酒店举行。会议热忱欢迎全国从事微生物学研究、教学和微生物开…

ms-sql server sql 把逗号分隔的字符串分开

案例&#xff1a; sql 查询-字段里是逗号,分隔开的数组&#xff0c;查询匹配数据 sql 查询-字段里是逗号,分隔开的数组&#xff0c;查询匹配数据_sql server 数组匹配-CSDN博客 SQL SERVER 把逗号隔开的字符串拆分成行 SQL SERVER 把逗号隔开的字符串拆分成行_sqlserver拆分…

Linux磁盘扩容(超详细)

一、第一步VM虚拟机扩容磁盘 首先我们要先关闭虚拟机&#xff0c;然后这个虚拟机不能存在镜像&#xff0c;否则无法进行扩容 提示&#xff1a; 如果想要某个镜像扩容的解决办法&#xff1a; 可以先保存当前镜像&#xff0c;然后在跳转到你想保存的镜像当中&#xff0c;然后对那…

21款奔驰GLS400升级电吸门 告别异响

这项功能作用&#xff1a; 1.关闭车门时就不用很大力&#xff0c;增加了舒适性&#xff0c;也使关门动作更优雅。 2.车门没有完全关闭会增加危险性&#xff0c;有了此功能就不必担心&#xff0c;Xjh15863 电吸门可以避免车门未关紧闭带来的安全隐患&#xff0c;这款电吸门&a…