[编程工具]Unity配表导出工具TableExporter1.1

这篇具有很好参考价值的文章主要介绍了[编程工具]Unity配表导出工具TableExporter1.1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0. 前言

之前就在做的一个 unity 中使用的 Excel 导出工具,继续完善了一下。
这次改了挺多内容的,一方面是使用了反射然后再优化了代码,属性拓展更加简单,另一方面是优化了模板处理和窗口显示。相关的代码以及Demo已经打包为Unity包,连接如下。上一个版本有比较详细的使用方法介绍,链接也放在下面可供参考

链接:https://pan.baidu.com/s/1AdsaUDOW4e4D-beWUaqhXA?pwd=wsad 
提取码:wsad
前一个版本的文章:https://blog.csdn.net/Blue_carrot_/article/details/130954127

1. 属性拓展优化

(1)反射获取转化函数 TryParse

~ TryParse
比如“int.TryParse”,是用于尝试将字符串转化为int类型,这对于数据导出工具来说还是很重要的,可以用于做数据的校验,另外在游戏运行时也可以作为将数据转化为对应类型。

~ 获取TryParse
作为一个unityEditor相关插件,与其他独立的导出工具不同的是,可以直接通过反射获取到程序内正在使用的类。这种情况下,我们可以将写在表格中的类型,用反射来获取到该类型的转化函数TryParse,通过这个函数来校验数据以及导出后的数据处理。

比如,“Color”类型,我们需要从有个方法来校验数据是否正确,另外导出代码时能够写入转化的方法。Unity中已经提供了ColorUtility.TryParseHtmlString来转16进制的颜色,比如“#FF00FF”。我们可以把每个属性对应的函数都列举到一个类中,方便我们去反射调用。如下:

using UnityEngine;
namespace Exporter
{
    public static partial class DataTable
    {
    	public delegate bool TryParseFunc<T>(string text, out T result);
    	
        public static TryParseFunc<int> TryParse_int = int.TryParse;
        public static TryParseFunc<float> TryParse_float = float.TryParse;
        public static TryParseFunc<double> TryParse_double = double.TryParse;
        public static TryParseFunc<bool> TryParse_bool = bool.TryParse;
        public static TryParseFunc<Color> TryParse_Color = ColorUtility.TryParseHtmlString;
    }
}

这里用到的是delegate委托,不用担心委托会有额外的开销,委托在新建的时候会有额外一点开销,但执行的时候几乎和原本的函数是一致的。比起反射到各个不同的类中的不同函数,使用委托不用考虑程序集的问题,这样显然会方便很多。那么反射获取函数可以这样处理.

string TryParseDelegateFieldName = "TryParse_" + typeName;
FieldInfo tryParseFuncFieldInfo = typeof(DataTable).GetField(TryParseDelegateFieldName);
Delegate tryParseFunc = tryParseFuncFieldInfo?.GetValue(null) as Delegate;

~ 使用TryParse
这个时候因为已经获取到了TryParse的委托,那么只要调用Invoke去使用就可以了

object[] tryParseParameters = new object[2] { "", tryParseOutParameter };
(bool)tryParseFunc.Method.Invoke(tryParseFunc.Target, tryParseParameters);

(2)反射获取EmptyReplace

EmptyReplace其实只是为了当这个表格没有配置时,我期望能够有个默认的值,比如说bool类型,希望没有填值的时候能为“False”。基本反射获取也和上边的一样。这里就只放一下定义

using UnityEngine;
namespace Exporter
{
    public static partial class EmptyReplace
    {
        public static string Default_int = "0";
        public static string Default_float = "0";
        public static string Default_double = "0";
        public static string Default_bool = "FALSE";
        public static string Default_Color = "#FFFFFF";
    }
}

(3)属性类型

那么对于一个属性而言PropertyInfo,可以抽象如下

 internal class PropertyInfo
 {
  		private string typeName
  	 	public bool Check(string str)
  	 	public void ReplaceParse()
 }
  • typeName:属性类型名,在表中可区分哪个类型
  • Check:类型的校验方式,用于检查数据是否正确
  • ReplaceParse:这个主要是为了生成代码做处理,告知运行是如何转化数据为是个属性

这个两个方法基本在获取到TryPrase的时候就可以解决了。就不多赘述了,完整的代码如下,可供参考。

using System;
using System.Reflection;
using System.Text;

namespace Exporter
{
    internal class PropertyInfo
    {
        private string typeName;
        private bool isStringProperty;
        private Delegate tryParseFunc;
        public string emptyReplace;
        private object tryParseOutParameter;
        private object[] tryParseParameters;
        private string TryParseDelegateFieldName => "TryParse_" + typeName;
        private string EmptyReplaceFieldName => "Default_" + typeName;
        public string EmptyReplace => emptyReplace;

        public bool Init(string typeName)
        {
            this.typeName = typeName;
            this.isStringProperty = typeName == "string";

            if (isStringProperty)
            {
                emptyReplace = "";
                return true;
            }
            else
            {
                FieldInfo tryParseFuncFieldInfo = typeof(DataTable).GetField(TryParseDelegateFieldName);
                tryParseFunc = tryParseFuncFieldInfo?.GetValue(null) as Delegate;

                FieldInfo emptyReplaceInfo = typeof(EmptyReplace).GetField(EmptyReplaceFieldName);
                object value = emptyReplaceInfo?.GetValue(null);
                emptyReplace = value != null ? value as string : "";

                tryParseParameters = new object[2] { "", tryParseOutParameter };

                return tryParseFunc != null;
            }
        }

        public bool Check(string str)
        {
            if (isStringProperty)
            {
                return true;
            }
            else
            {
                tryParseParameters[0] = str;
                return (bool)tryParseFunc.Method.Invoke(tryParseFunc.Target, tryParseParameters);
            }
        }

        public void ReplaceParse(StringBuilder template, bool isArray, bool isOutputKey, string propertyName)
        {
            // 获取值
            string getValueFromKey = "DataTable.GetStringFromKey";
            string value = Config.Inst.PropertyParseValue;
            if (isOutputKey)
            {
                value = getValueFromKey + "(" + value + ")";
            }

            // 获取函数
            string TryParseDelegateName = "DataTable." + TryParseDelegateFieldName;
            string parse = "";
            if (isStringProperty && isArray)
            {
                // 字符数组
                parse = string.Format("DataTable.SplitStrng({0})", value);
            }
            else if (isStringProperty && !isArray)
            {
                // 字符
                parse = value;
            }
            else if (!isStringProperty && isArray)
            {
                // 其他属性数组
                parse = "DataTable.ParseArr<{0}>({1}, {2})";
                parse = string.Format(parse, typeName, value, TryParseDelegateName);
            }
            else if (!isStringProperty && !isArray)
            {
                // 其他属性
                parse = "DataTable.Parse<{0}>({1}, {2})";
                parse = string.Format(parse, typeName, value, TryParseDelegateName);
            }
            template.Replace("{parse}", parse);
        }
    }
}

(4)属性拓展

那在此之后,我们去拓展一个属性,只需要创建一个对应的委托即可!

比如Vector2Int,我们只需要在DataTable中写入转化函数即可。(这里是需要前置一个V,比如“V1,1000”,主要是为了区别数字与字符串。如果没有前置字符,Excel在常规时会认为他是个数,比如"1,1000",会被识别为数字11000,为了防止到时候失误,所以加了个V)

public static TryParseFunc<Vector2Int> TryParse_Vector2Int = (string text, out Vector2Int result) =>
{
    if (!text.StartsWith("V"))
    {
        result = Vector2Int.zero;
        return false;
    }

    string[] temp = text.Substring(1, text.Length - 1).Split(",");
    int x, y;
    if (temp.Length == 2 &&
        int.TryParse(temp[0], out x) &&
        int.TryParse(temp[1], out y))
    {
        result = new Vector2Int(x, y);
        return true;
    }
    else
    {
        result = Vector2Int.zero;
        return false;
    }
};

2. 模板处理

代码模板独立成一个文本Template_code.txt,这样比起在UnIty中会更容易更改,另外重新更改了替换方式,尽量将能改的内容都写在样本中。

(1)替换内容

模板最常用的就是替换啦,这里我们可以设定“ {sheetName}“ 和“{fileName}”这两个字符,这样可以用于替换文件名和表格名。

(2)属性段

对于一个属性,要替换的内容有类型,名字之类的,但因为属性数量不同,所以单纯的替换就比较麻烦,这里加入属性段的概念,[properties][propertiesEnd]用于标记属性段,此时标记的部分就会按照属性来依次重复,然后对应的去替换属性的相关值

(3)模板特殊符号定义

那么,我们约定模板内的特殊符号以及其作用。

内容 作用
{fileName} 替换文件名
{sheetName} 替换表格名
{parse} 替换属性转化方式
{type} 替换属性类型
{name} 替换属性名字
{note} 替换属性注释
{setting} 替换属性设置
[properties] 标记属性段的开始
[properties] 标记属性段的结束

(4)模板

估计单讲没什么感觉,直接看模板估计就知道这么设定的作用了。

using System.Collections.Generic;
using UnityEngine;
using Exporter;

namespace GDT
{
    /// <summary>
    /// {sheetName} data,{fileName}.xlsx
    /// </summary>
    public class DR{sheetName}: IDataRow
    {
        
[properties]
        /// <summary>
        /// {note}  {setting}
        /// </summary>
        public {type} {name} { get; protected set; }

[propertiesEnd]
        
        public void ParseDataRow(string input)
        {
            string[] text = input.Split('\t');
            int index = 0;
[properties]
            {name} = {parse};
[propertiesEnd]
        }
        
        private void AvoidJIT()
        {
            new Dictionary<int, DR{sheetName}>();
        }
    }
}

3. 面板优化

主要是之前只弹出提示窗口显示有限,而且显示不完,所以特地额外弄了个窗口来显示这个内容。然后加了点富文本,方便显示。具体就不说怎么弄了,项目里面都有。关于Editor相关的内容以后再写文章记录一下吧。现在就简单放一下图吧。

[编程工具]Unity配表导出工具TableExporter1.1

4. 结束咯

这个处理的主要内容就讲完咯,下回有空再见吧。以后的可能会完善的内容有,关联额外检查、公式导出、Json导出等。不过等用到了再去弄吧,做这个东西还挺花时间的。然后,使用上有问题的话,可以再Q我.文章来源地址https://www.toymoban.com/news/detail-483378.html

到了这里,关于[编程工具]Unity配表导出工具TableExporter1.1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • AIGC for code(AIGC/AI生成代码/生成式AI之代码生成/AI编程工具/自动编程/自动生成代码/智能编程工具/智能编程系统)

    AIGC for code(AIGC/AI生成代码/生成式AI之代码生成/AI编程工具/自动编程/自动生成代码/智能编程工具/智能编程系统)

    AIGC,Artificial Intelligence Generated Content,人工智能生成内容 AIGC for code,AI生成代码 Copilot是由微软的子公司Github与openAI共同开发的人工智能(AI)驱动的编程助手。它能够直接在你的编辑器中,为你提供代码片段或者整个函数的建议,以帮助你更快地编写和完成代码。这个工具

    2024年02月17日
    浏览(15)
  • 手机版python编程软件下载,手机端python编程工具

    手机版python编程软件下载,手机端python编程工具

    大家好,给大家分享一下手机python3.0编程软件下载,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 相信多数安卓用户都使用过Qpython这款移动端的Python编辑器吧?之前我也研究过一阵子这个工具,但因为一次简单的爬虫让我对它失望之极。Qpython不支持lxm

    2024年03月09日
    浏览(15)
  • 中文编程开发语言工具构件说明:屏幕截取构件的编程操作

    中文编程开发语言工具构件说明:屏幕截取构件的编程操作

    屏幕截取 用于截取指定区域的图像。 图    标: 构件类型:不可视 重要属性 l        截取类型 枚举型,设置在截取屏幕时的截取类型。包括:全屏幕、指定区域、活动窗口三种。当全屏幕截取时相当于执行了硬拷屏(PrintScreenSysRq键)功能;指定区域截取则是通过矩形

    2024年02月07日
    浏览(8)
  • AIGC for code(text-to-codeAIGC/AI生成代码/生成式AI之代码生成/AI编程工具/自动编程/自动生成代码/智能编程工具/智能编程系统)

    AIGC for code(text-to-codeAIGC/AI生成代码/生成式AI之代码生成/AI编程工具/自动编程/自动生成代码/智能编程工具/智能编程系统)

    AIGC,Artificial Intelligence Generated Content,人工智能生成内容 AIGC for code,AI生成代码 Copilot是由微软的子公司Github与openAI共同开发的人工智能(AI)驱动的编程助手。它能够直接在你的编辑器中,为你提供代码片段或者整个函数的建议,以帮助你更快地编写和完成代码。这个工具

    2024年02月15日
    浏览(16)
  • Aixcoder:AI辅助编程工具

    Aixcoder:AI辅助编程工具

    【产品介绍】   aixcoder是一款基于深度学习人工智能技术的AI辅助编程工具。提供了一个由各个领域的专业代码训练出来的“虚拟编程专家”,通过与aixcoder进行结对编程,程序员可以感受到工作效率的显著提升。   借助aixcoder的帮助,程序员可以摆脱传统的“逐字逐句”编

    2024年02月07日
    浏览(14)
  • 中文编程开发语言工具编程实际案例:美发店会员管理系统软件编程实例

    中文编程开发语言工具编程实际案例:美发店会员管理系统软件编程实例

    中文编程开发语言工具编程实际案例:美发店会员管理系统软件编程实例 中文编程开发语言工具编程实际案例:美发店会员管理系统软件编程实例。 软件功能: 1、系统设置:参数设定,账号及权限设置,系统初始化,卡类型设置,积分清零等。 2、会员信息登记:可以刷卡

    2024年02月07日
    浏览(12)
  • 中文编程工具免费版下载,中文开发语言工具免费版下载

    中文编程工具免费版下载,中文开发语言工具免费版下载

    中文编程工具免费版下载,中文开发语言工具免费版下载 中文编程工具开发的实际部分案例如下图 编程系统化课程总目录及明细,点击进入了解详情。https://blog.csdn.net/qq_29129627/article/details/134073098?spm=1001.2014.3001.5502

    2024年02月08日
    浏览(55)
  • 中文编程开发语言工具编程案例:计时计费管理系统软件连接灯控器编程案例

    中文编程开发语言工具编程案例:计时计费管理系统软件连接灯控器编程案例

    计时计费管理系统软件连接灯控器 计时计费管理系统软件连接灯控器编程案例

    2024年02月07日
    浏览(14)
  • 中文编程开发语言工具编程实际案例:台球棋牌混合计时计费软件使用的编程构件说明

    中文编程开发语言工具编程实际案例:台球棋牌混合计时计费软件使用的编程构件说明

    台球棋牌混合计时计费软件使用的编程构件说明 上图说明:该软件可以用于桌球和棋牌同时计时计费,在没有开台的时候,图片是处于等待状态,这使用编程工具中的固定图像构件,在正在计时的时候,图片自动变换为 进行中的状态,在编程中可以动态读取图片。 上图说明

    2024年02月08日
    浏览(10)
  • 编程实用工具推荐

    编程实用工具推荐

    Snipaste,一款简单强大的截图贴图利器 下载地址:Snipaste Codelf通过搜索在线开源平台Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Projec的项目源码,帮开发者从中找出已有的匹配的变量名。这个搜索服务支持直接搜索中文。codeif支持中文查询,输入中文意思,codeif可

    2024年02月12日
    浏览(14)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包