[游戏开发][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

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte