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

2023-10-19 18:36

本文主要是介绍[游戏开发][Unity] ScriptableObject数据创建与各种加载方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  前言

 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);}

出现报错的情况

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

这篇关于[游戏开发][Unity] ScriptableObject数据创建与各种加载方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/241616

相关文章

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映