Unity | 游戏数据配置

news/2025/3/26 5:35:58/

目录

一、ScriptableObject

1.创建ScriptableObject

2.创建asset资源

3.asset资源的读取与保存

二、Excel转JSON

1.Excel格式

2.导表工具

(1)处理A格式Excel

(2)处理B格式Excel

三、解析Json文件

1.读取test.json文件

四、相关插件


        在游戏开发中,策划与程序需要有良好的配置环境来处理数据,可以直接使用ScriptableObject来处理数据,或者通过Excel转JSON的形式将数据表直接从Excel里抓取过来,也可以使用Sqlite进行数据存储。

一、ScriptableObject

        ScriptableObject适合数据量比较小的配置信息。每个继承到ScriptableObject的类需要单独在一个脚本文件中。嵌套的类需要声明Serializable特性。

[Serializable]是C#中System命名空间下的特性,标记一个类可被序列化。序列化是指将对象转换为字节流,以便存储到文件、网络传输或持久化数据。

[SerializeField]属于UnityEngine命令空间,表示某个字段可以被序列化,即可以在Inspector面板中显示。

1.创建ScriptableObject

        ScriptableObject的创建很简单,只需要继承ScriptableObject类并标注CreateAssetMenu特性即可。

    [CreateAssetMenu(fileName = "BackpackInfo", menuName = "Save/BackpackInfo")]public class BackpackInfo : ScriptableObject{public Item[] Items;}[System.Serializable]public class Item{public int ItemId;public int Count;}

        当然也可以嵌套类:

[CreateAssetMenu(fileName = "FurnitureConfig", menuName = "MyProj/FurnitureConfig")]
//该特性标记了ScriptableObject的基本信息,只有加入该特性,脚本才能以文件对象的形式被创建
public class FurnitureScriptableObject : ScriptableObject
{[Serializable]      //声明是序列化类public class FurnitureInfo{public string DisplayName;        //显示名称public string Url;                //url地址public Vector3 Pos;               //位置}public FurnitureInfo[] furnitureInfoArray; //家具信息数组对象
}

2.创建asset资源

         编写完成上述脚本后就可以在Project面板的右键菜单中创建了,可以将创建的data.asset资源存放到Resources文件夹下,方便读取及保存。

        生成的data.asset文件是yaml语法,类似的有TagManager.asset等。 

YAML的基本语法规则包括:大小写敏感、使用缩进表示层级关系、禁止使用制表符缩进,且每个缩进级别应保持一致。

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:m_ObjectHideFlags: 0m_CorrespondingSourceObject: {fileID: 0}m_PrefabInstance: {fileID: 0}m_PrefabAsset: {fileID: 0}m_GameObject: {fileID: 0}m_Enabled: 1m_EditorHideFlags: 0m_Script: {fileID: 11500000, guid: 3969674121eab4a928178bee57fc1452, type: 3}m_Name: datam_EditorClassIdentifier: furnitureInfoArray:- DisplayName: Url: Pos: {x: 0, y: 0, z: 0}- DisplayName: Url: Pos: {x: 0, y: 0, z: 0}

3.asset资源的读取与保存

    FurnitureScriptableObject furnitureScriptableObject;public void GetDataFromLocal(){furnitureScriptableObject = Resources.Load<FurnitureScriptableObject>("_TempData/data");}/// <summary>/// 修改家具位置/// </summary>/// <param name="pos"></param>public void ChangePos(Vector3 pos){//这里只是举例说明,实际情况建议根据ID来修改if (furnitureScriptableObject.furnitureInfoArray.Length > 0){furnitureScriptableObject.furnitureInfoArray[0].Pos = pos;}SavePlayerInfoToLocal();}/// <summary>/// 保存数据到本地/// </summary>private void SavePlayerInfoToLocal(){// 标记资源为“脏”(表示需要保存)
#if UNITY_EDITORUnityEditor.EditorUtility.SetDirty(furnitureScriptableObject);// 手动保存资源UnityEditor.AssetDatabase.SaveAssets();
#endif}

二、Excel转JSON

        对于一些数据量比较大的配置信息,可以通过Excel导入数据的处理方式。

1.Excel格式

        常见的Excel配置表有两种格式:

  • A格式:每行代表名称、类型、客户端/服务端使用标识、描述

  •  B格式:以名称|类型来配置,读取时代码来进行字符串处理(当然也可以添加描述等信息):

2.导表工具

        首先需要编写一个中间程序,使用EPPlus去读Excel文件并取出前几列的数据作为数据字段定义,并按照模板生成.cs文件和json序列化文件。

(1)处理A格式Excel

        提前写了一个ConfigBase类作为父类,每个Excel的Sheet生成的类都继承该类。

using System.Collections.Generic;
using Modules.Common.UniUtils;
using Newtonsoft.Json;
using UnityEngine;namespace PetBuddy
{public class ConfigBase{public int ID;private static ConfigBase _instance;protected Dictionary<int, ConfigBase> ToDictionary = new Dictionary<int, ConfigBase>();private static Dictionary<string, ConfigBase> _configs = new Dictionary<string, ConfigBase>();public static T GetConfigById<T>(int id) where T : ConfigBase, new(){var name = typeof(T).Name;name = name.Replace("Config", "");if (!_configs.ContainsKey(name)){var config =

http://www.ppmy.cn/news/1582649.html

相关文章

如何借助es的snapshot跨集群迁移部分索引

1.创建源集群的快照仓库 使用fs方式&#xff0c;首先需要在所有节点挂载文件系统 然后在elasticsearch.yaml中新增配置path.repo 必须确保对应目录具备读写权限 path.repo: /mount/backups 修改配置重启完之后&#xff0c;开始创建快照仓库 PUT /_snapshot/my_repository…

数据结构与算法:宽度优先遍历

前言 进入图论部分难度明显提升了一大截&#xff0c;思路想不到一点…… 一、宽度优先遍历 1.内容 宽度优先遍历主要用于在图上求最短路。 &#xff08;1&#xff09;特点 宽度优先遍历的特点就是逐层扩展&#xff0c;最短路即层数 &#xff08;2&#xff09;使用条件 …

html5-Canvas弹跳小球项目开发总结

Canvas弹跳小球项目开发总结 这里写目录标题 Canvas弹跳小球项目开发总结项目介绍技术栈核心功能实现1. Canvas基础绘制2. 物理引擎模拟重力系统碰撞检测和弹跳 3. 拖拽交互实现拖拽检测拖拽状态管理速度计算 难点突破1. 平滑的物理效果2. 准确的拖拽体验3. 速度计算优化 优化思…

C++ 关系运算符重载和算术运算符重载的例子,运算符重载必须以operator开头

在C中&#xff0c;运算符重载允许为用户定义的类型&#xff08;类或结构体&#xff09;赋予某些内置运算符的功能。下面是一个关于关系运算符重载&#xff08;&#xff09;和算术运算符重载&#xff08;&#xff09;的简单例子。 示例&#xff1a;复数类的运算符重载 将创建一…

(每日一道算法题)翻转对

493. 翻转对 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums &#xff0c;如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。 你需要返回给定数组中的重要翻转对的数量。 示例 1: 输入: [1,3,2,3,1] 输出: 2示例 2: 输入: [2,4,…

高效事件驱动设计模式——Reactor 模式

Reactor 模式 1. 概述 Reactor 模式是一种用于处理并发事件的高效事件驱动设计模式。它广泛应用于高性能服务器、网络编程和异步 I/O 处理场景&#xff0c;例如 Nginx、Netty、libevent 等。Reactor 允许一个或多个I/O 线程&#xff08;Event Loop&#xff09;高效管理多个 I…

JavaScript性能优化实战:深入探讨性能瓶颈与优化技巧

JavaScript作为现代Web开发的核心语言&#xff0c;其性能直接影响用户体验。本文将深入探讨JavaScript的性能瓶颈&#xff0c;结合实际案例分享优化技巧与最佳实践&#xff0c;帮助开发者提升代码效率。 一、JavaScript性能瓶颈分析 1. DOM操作 DOM操作是JavaScript中最耗性能…

【Docker系列五】Docker Compose 简介

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…