Unity excle 配置 ScriptObject脚本资源 excel转SO 学习笔记

【用Excel设计游戏关卡,僵尸看了都说好!】https://www.bilibili.com/video/BV16d4y1r7bC?vd_source=fe688d296a49c21a47090f9730a67ab4

前置知识

Editor 编辑器文件夹
这个文件夹是专门用来做编辑器级别功能的,比如一些辅助开发的插件,或者地图生成器、角色展示器等,这类功能都是在开发过程中使用的,不需要打包到游戏中。

Editor文件夹可以有多个,可以直接放在Assets文件夹下,也可以放在某个功能子文件夹下,官方说法是可在 Assets 文件夹中的任何位置添加多个 Editor 文件夹。应将 Editor 脚本放在 Editor 文件夹内或其中的子文件夹内。

使用 Editor 脚本中的 EditorGUIUtility.Load 函数可从 Editor 文件夹中的 Resources 文件夹加载资源。这些资源只能通过 Editor 脚本加载,并会从构建中剥离。

注意:如果脚本位于 Editor 文件夹中,Unity 不允许将派生自 MonoBehaviour 的组件分配给游戏对象。
Resources 资源文件夹
只读,其中的文件打包时会压缩加密,使用Resources.Load方法动态加载,一般放一些动态加载的模型资源Prefab、Object之类的,跟cocos的Resources是一样的。
这个文件夹好不好?好!但是该不该随便用呢?答案是不应该。
1:它使内存管理变得困难;
2:不恰当的使用Resource文件夹,会增加程序启动时间和打包时间;
3:降低了工程中的内容转换到特定平台的能力,使内容更新困难;
4:随着Resources文件夹数量的增加,对这些文件夹中的Assets的管理变得非常困难;
5:资源系统降低了项目向特定平台提供自定义内容的能力,并消除了增量内容升级的可能性;
6:unity为了兼容所有平台,Resources文件下的资源使用的统一打包,这就会对资源的优化有一定的限制,比如说把图片放在Resource文件夹下,unity不会对这些图片做压缩,这无异是增加了包体大小。
 

创建表格

创建ScriptObject脚本

将表格转化为SO资源文件

前置插件

EPPlus插件

下载地址:https://pan.baidu.com/s/1mhQyASOZvcipr8g13z6_BQ 提取码:900v
EPPlus官网:https://archive.codeplex.com/?p=epplus

使用这个代码以便与我们编辑器启动时自动去读取我们的excle表格


启动时运行 Editor 脚本代码 - Unity 手册

这里我觉得可以给编辑器添加一次菜单,当我们要刷新内容时来调用来代替上面的内容。

1.19 从0开始学习Unity游戏开发--扩展编辑器 - 知乎

具体内容

最终效果

大家具体理解这一张

如果理解不了,看一下up主的视频。

下面是我自己的再现过程:

using OfficeOpenXml;
using System;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public static class ReadTable 
{
    [MenuItem("ReadTable")]//可以在编辑器上的选项点击运行下面代码
    public static void ReadTable()
    {
        string path = Application.dataPath + "/Editor/Buildings.xlsx";//表格路径
        string assetName = "BuildingsSO";//导出的SO文件名字

        FileInfo fileInfo = new FileInfo(path);//打开表格
        //(class名) (声明变量的名)
        BuildingSO buildingSO = (BuildingSO)ScriptableObject.CreateInstance(typeof(BuildingSO));//创建一个脚本

        using (ExcelPackage excelPackage = new ExcelPackage(fileInfo))
        {
            ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets["Sheet1"];//打开表格 Sheet1
//这里是行列遍历
            for (int i = excelWorksheet.Dimension.Start.Row + 2; i <= excelWorksheet.Dimension.End.Row; i++)
            {
                BuildingData buildingData = new BuildingData();

                Type type = typeof(BuildingData);
                
                for(int j = excelWorksheet.Dimension.Start.Column;j <= excelWorksheet.Dimension.End.Column; j++)
                {
                   /* Debug.Log(excelWorksheet.GetValue(i,j).ToString());*/
                    FieldInfo fieldInfo = type.GetField(excelWorksheet.GetValue(2,j).ToString());
                    string tableValue = excelWorksheet.GetValue(i,j).ToString();
             /*       Debug.Log(fieldInfo.FieldType);*/
                    fieldInfo.SetValue(buildingData, Convert.ChangeType(tableValue, fieldInfo.FieldType));
                }
                buildingSO.buildingDataList.Add(buildingData);
            }

        }
        AssetDatabase.CreateAsset(buildingSO, "Assets/Resources/" + assetName + ".asset");
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();    
    }
    
}
using System;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName ="Building",menuName ="Buildings")]
public class BuildingSO : ScriptableObject
{
   
    public List<BuildingData> buildingDataList = new List<BuildingData>();

}
[Serializable]
public class BuildingData
{
    
    public string buildingName;
    public int id;
    public int health;
    public bool canAttack;
    public string buildingObjectPath;
    public string buildingSpritePath ;
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值