当前位置: 首页 > news >正文

Unity | 游戏数据配置

目录

一、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: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 0}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 3969674121eab4a928178bee57fc1452, type: 3}
  m_Name: data
  m_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_EDITOR
        UnityEditor.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 =

相关文章:

  • SpringBoot整合MQTT最详细版(亲测有效)
  • 创建自己的github.io
  • Jmeter插件下载和配置
  • 终端的命令行发送邮件的方式和监视脚本
  • windows专用网路的共享文件配置
  • EtherCAT转profinet网关集成汽车变速箱制造生产线自动化升级
  • 高频GNSS同震形变计算方法
  • 可发1区的超级创新思路:基于注意力机制的DSD-CNN时间序列预测模型(功率预测、交通流量预测、故障检测)
  • Python学习第二十二天
  • 智能体开发革命:灵燕平台如何重塑企业AI应用生态
  • Lineageos 22.1(Android 15)应用双开
  • 图解AUTOSAR_CP_EEPROM_Abstraction
  • Nordic nRF528xxx Beacon功能开发学习方案总结
  • Metasploit 跳板攻击
  • doris:负载均衡
  • centos 9 编译安装 rtpengine
  • 【WebGL】texImage2D函数
  • 1.5.7 掌握Scala内建控制结构 - 变量作用域
  • 虚拟机的三种 Linux 网络配置原理图解读
  • 在Fedora-Workstation-Live-x86_64-41-1.4中使用最新版本firefox和腾讯翻译插件让英文网页显示中文翻译
  • 屠呦呦当选美国科学院外籍院士
  • 澎湃回声|山东莱州、潍坊对“三无”拖拉机产销市场展开调查排查
  • 河北:开展领导干部任性用权等形式主义官僚主义问题专项整治
  • 特朗普的百日执政支持率与他“一税解千愁”的世界观和方法论
  • 点燃“文化活火”,上海百年街区创新讲述“文化三地”故事
  • 重新认识中国女性|婚姻,自古以来就是一桩生意