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

【Unity】关于Luban的简单使用

最近看了下Luban导出Excel数据的方式,来记录下

【Unity】关于Luban的简单使用

  • 安装Luban
  • 开始使用
    • Unity
    • Luban
    • C#
  • 扩展

安装Luban

Luban文档:https://luban.doc.code-philosophy.com/docs/beginner/quickstart
1.安装dotnet sdk 8.0或更高版本sdk
2.github上把luban_examples项目下载下来,有些文件配置可以直接使用示例项目里的
3.安装git,后续在unity安装插件时会用到

开始使用

Unity

1.新建Unity工程,这里我用的2021.3.19f1版本
2.打开Package Manger,在Window->Package Manager,使用url地址进行插件安装
在这里插入图片描述

在这里插入图片描述
url地址:https://github.com/focus-creative-games/luban_unity.git
在这里插入图片描述
在Unity的PlayerSettings里开启unsafe选项
在这里插入图片描述

Luban

创建gen.bat文件,位置无所谓,只要路径能写对就行,这个文件可以从上面下的实例项目里找到,也可以自己创建

  • LUBAN_DLL Luban.dll文件的路径。 指向 luban_examples/Tools/Luban/Luban.dll
  • CONF_ROOT 配置项目的路径。指向 luban_examples/DataTables
  • ‘-t’ 生成目标。可以为 client、server、all之类的值
  • ‘-c’ 生成的代码类型。 cs-simple-json为生成使用SimpleJSON加载json数据的c#代码
  • ‘-d’ 生成的数据类型
  • ‘outputCodeDir’ c#代码的输出目录
  • ‘outputDataDir’ json数据的输出目录
set WORKSPACE=..\..
set LUBAN_DLL=%WORKSPACE%\Tools\Luban\Luban.dll
set CONF_ROOT=..\dotnet %LUBAN_DLL% ^-t client ^-c cs-simple-json ^-d json  ^--conf %CONF_ROOT%\luban.conf ^-x outputCodeDir=%WORKSPACE%\LubanTest\Assets\Script\Template ^-x outputDataDir=%CONF_ROOT%\outputpause

新建Task表

  • 第1行是字段名行。单元格 A1 必须以##开头。表示这是一个有效数据表。
  • 第2行是字段类型行。第1个单元格必须为 ##type。
  • 第3行是分组行。c表示字段属于客户端,s表示属于属于服务器,c,s表示同时属于所有,留空也表示属于所有。
  • 第4行是注释行。 以##开头。 可以有0-N个注释行,而且可以出现在任何位置
  • 第5行起是数据行。

在这里插入图片描述
在__tables__.xlsx里添加导出类,这里我试了四个表
在这里插入图片描述
运行gen.bat文件,成功的话最后会出现bye
在这里插入图片描述
也可以在unity中看到导出的c#文件
在这里插入图片描述

C#

using System;
using System.IO;
using SimpleJSON;
using UnityEngine;namespace Script
{public class Main : MonoBehaviour{private void Start(){var tables = new cfg.Tables(readConfig);Debug.Log(tables.TbReward.Get(1001).Name);Debug.Log(tables.TbActivity.Get(1001).StartTime);}private JSONNode readConfig(string file){return JSON.Parse(File.ReadAllText(Application.dataPath + "/../../MiniTemplate/output/" + file + ".json", System.Text.Encoding.UTF8));}}
}

运行后打印结果
在这里插入图片描述

扩展

目前简单使用感受,每次新建一个表就要在__tables__.xlsx里手动添加一行,比较麻烦,写了一个py自动处理
xlrd库记得用1.2.0版本的,最新版无法读取xlsx文件

# -*- coding: utf-8 -*-
import lxml.etree as etree
import osimport xlrd
import xlwt
import pandas
import subprocessexeclDataTitle = []
fileList = []def read_excel_xls(path):workbook = xlrd.open_workbook(path)  # 打开工作簿sheets = workbook.sheet_names()  # 获取工作簿中的所有表格worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格for i in range(0, 3):data = []for j in range(0, worksheet.ncols):data.append(worksheet.cell_value(i, j))execlDataTitle.append(data)def write_excel_xls(path):if os.path.exists(path):os.remove(path)index = len(execlDataTitle)  # 获取需要写入数据的行数workbook = xlwt.Workbook()  # 新建一个工作簿sheet = workbook.add_sheet("Sheet1")  # 在工作簿中新建一个表格##设置边框实线borders = xlwt.Borders()borders.left = xlwt.Borders.THINborders.right = xlwt.Borders.THINborders.top = xlwt.Borders.THINborders.bottom = xlwt.Borders.THIN##设置居中alignment = xlwt.Alignment()alignment.horz = xlwt.Alignment.HORZ_CENTERalignment.vert = xlwt.Alignment.VERT_CENTERfor i in range(0, index + len(fileList)):##行高度tall_style = xlwt.easyxf('font:height 500')sheet.row(i).set_style(tall_style)for j in range(0, len(execlDataTitle[0])):##列宽度sheet.col(j).width = 5000##单元格样式style = xlwt.XFStyle()style.alignment = alignment##自动换行style.alignment.wrap = 1if i <= 2:pattern = xlwt.Pattern()pattern.pattern = xlwt.Pattern.SOLID_PATTERNpattern.pattern_fore_colour = 17style.pattern = patternstyle.borders = borderssheet.write(i, j, execlDataTitle[i][j], style)  # 像表格中写入数据(对应的行和列)else:style.borders = bordersfileName = fileList[i - 3]fileClass = fileList[i - 3].replace(".xlsx", "")if execlDataTitle[0][j] == "full_name":sheet.write(i, j, fileClass.lower() + ".Tb" + fileClass.capitalize(), style)elif execlDataTitle[0][j] == "value_type":sheet.write(i, j, fileClass.capitalize(), style)elif execlDataTitle[0][j] == "read_schema_from_file":sheet.write(i, j, "TRUE", style)elif execlDataTitle[0][j] == "input":sheet.write(i, j, fileName, style)elif execlDataTitle[0][j] == "comment":sheet.write(i, j, fileClass + "表", style)else:sheet.write(i, j, "", style)workbook.save(path)  # 保存工作簿print("xls格式表格写入数据成功!")if __name__ == "__main__":tableName = ""baseFileName = os.path.basename(__file__)for root, dirs, files in os.walk("../Datas"):for file in files:# name = os.path.join(root, file).split("\\")[-1].replace("-", "==").replace(".tar.gz", "").replace(".tar", "")firstName = file[1]if file != baseFileName and firstName != "_" and firstName != "$":print(file)fileList.append(file)if file.find("__tables__") != -1:tableName = os.path.join(root, file)if tableName == "":print("tableName为空")read_excel_xls(tableName)write_excel_xls(tableName)print("complete!!!")subprocess.run(['___Gen.bat'])

再用pyinstaller命令打包成exe文件就可以直接运行了

pyinstaller -F ___GenExcelData.py
copy /Y dist\___GenExcelData.exe .
rd /S /Q build
rd /S /Q dist
rd /S /Q __pycache__
del /Q ___GenExcelData.spec

我的是和表放在同一个目录下
在这里插入图片描述

相关文章:

【Unity】关于Luban的简单使用

最近看了下Luban导出Excel数据的方式&#xff0c;来记录下 【Unity】关于Luban的简单使用 安装Luban开始使用UnityLubanC# 扩展 安装Luban Luban文档&#xff1a;https://luban.doc.code-philosophy.com/docs/beginner/quickstart 1.安装dotnet sdk 8.0或更高版本sdk 2.githu…...

企业公户验证API如何使用JAVA、Python、PHP语言进行应用

在纷繁复杂的金融与商业领域&#xff0c;确保每笔交易的安全与合规是至关重要的。而企业公户验证API&#xff0c;正是这样一位默默守护的数字卫士&#xff0c;它通过智能化的手段&#xff0c;简化了企业对公账户验证流程&#xff0c;让繁琐的审核变得快捷且可靠。 什么是企业公…...

杰发科技Bootloader(2)—— 基于7840的Keil配置地址

序 在7840的sample代码里面有一个简单的Boot跳转APP的示例 PFlash地址从0开始 DFlash的地址从1000000开始 Boot解析 他的boot地址配置为0 Boot的代码主要是这几行&#xff0c;主要作用就是Flash的跳转 int main(void) {SystemClock_Config();InitDebug();printf("demo…...

cmd常用命令

在Windows操作系统中&#xff0c;CMD&#xff08;Command Prompt&#xff09;是一个强大的命令行工具&#xff0c;允许用户通过键入命令来执行各种系统级操作。以下是一些常用的CMD命令及其功能&#xff1a; 文件与目录管理 dir&#xff1a;显示当前目录下的文件和子目录列表。…...

PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘

1,下载 RTL8125B driver 下载页&#xff1a; https://www.realtek.com/Download/List?cate_id584 2,RTL8125B datasheet下载 下载页&#xff1a; https://file.elecfans.com/web2/M00/44/D8/poYBAGKHVriAHnfWADAT6T6hjVk715.pdf3, 编译driver 解压&#xff1a; $ tar xj…...

Python tkinter Menu菜单组件详解

好久没有更新了&#xff0c;今天我来领大家熟悉一下Menu组件 1.认识、了解Menu 什么是Menu menu组件是tkinter中的菜单组件&#xff0c;通过该组件&#xff0c;开发者可以为窗口设计菜单和工具栏等。&#xff08;ttk还提供了treeview树形菜单&#xff0c;python遍历目录的两种…...

谷粒商城实战笔记-46-商品服务-API-三级分类-配置网关路由与路径重写

文章目录 一&#xff0c;准备工作1&#xff0c;新增一级菜单2&#xff0c;新增二级菜单 二&#xff0c;前端树形界面开发1&#xff0c;开发分类展示组件 三&#xff0c;远程调用接口获取商品分类数据1&#xff0c;远程调用2&#xff0c;路由配置 错误记录 本节的主要内容&#…...

简要了解sql注入

sql注入安全测试中危害 数据库中的数据&#xff0c;对数据库数据进行操作&#xff08;查询、删除等&#xff09;&#xff1b;网站的权限&#xff0c;找到注入点后可后门写入&#xff1b; sql注入产生原理详细分析 可控变量&#xff0c;带入数据库查询&#xff0c;变量未存在…...

Java 扫雷游戏

程序分析 使用Java编写的扫雷游戏界面程序&#xff0c;主要内容总结如下&#xff1a; Frame类继承自JFrame&#xff0c;构建了扫雷游戏的界面。 包含文本框text、标签nowBomb和setBomb、按钮start、面板MenuPamel和bombPanel等组件。通过jbInit方法进行初始化设置&#xff0c;…...

vue3 命令运行窗口暴露网络地址,以及修改端口号

一般情况下这里的地址是隐藏的 这里加上 --host 可以暴露网络地址&#xff0c;再加上--port --8080 就可以将端口号修改为8080&#xff08;修改后边的数字就可以修改为你想要的端口号&#xff09;...

由CANoe自带协议栈在TCP断开连接时同时发送两条FIN报文引起的注意事项

在我写这篇文章CAPL如何在底层模拟TCP Server端断开TCP连接时,我发现了一个奇怪的现象。我为了使用CAPL组装报文的方式实现TCP Server断开连接的过程,插入一个网络节点作为Client端。为了让Client能够发起连接和发起断开连接,给网络节点配置了独立的TCP/IP Stack,也就是CAN…...

FastGPT部署和接入使用重排模型bce-reranker-base

bce-reranker简介 bce-reranker 是一种专门用于信息检索和自然语言处理领域中的重排序(reranking)模型。这种模型由北京智源人工智能研究院(BAAI)开发,是 BGE(BAAI General Embedding)系列的一部分。BGE 系列模型专注于提供通用的嵌入表示,而 bce-reranker 则更进一步…...

Android笔试面试题AI答之线程Handler、Thread(2)

答案仅供参考&#xff0c;来自 讯飞星火大模型 目录 1.Android多线程间通信和多进程之间通信有什么不同&#xff0c;分别怎么实现?2.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系&#xff1f;3.Android 线程间通信有哪几种方式?4.子线程发消息…...

某某物联rabbitmqhttp二轮充电桩协议充电协议对接

对接方式概述&#xff1a; 1&#xff09;请求采用 http 协议方式&#xff0c;推送数据采用 amqp(默认 rabbitmq)点对点消息队 列方式。 2&#xff09;消息队列连接信息&#xff0c;需贵方完善。 1 hostIp&#xff1a; 2 virtualHost&#xff1a; 3 userName&#xff1a; 4 pass…...

黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型

文章目录 前言一、正文排版1. 视频标签: < video >2. 音频标签: < audio >3. 换行标签: < br >4. 段落标签 < p >5. vscode实现 二、布局1. 盒子模型2. 布局标签< div >和< span >3. VScode实现 三、源代码和运行结果总结 前言 本篇文章是…...

Java | Leetcode Java题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution {public void moveZeroes(int[] nums) {int n nums.length, left 0, right 0;while (right < n) {if (nums[right] ! 0) {swap(nums, left, right);left;}right;}}public void swap(int[] nums, int left, int right)…...

Django REST Framework(十三)视图集-GenericViewSet

Django REST Framework 中&#xff0c;ModelViewSet 和 ReadOnlyModelViewSet 提供了快速实现常见视图操作的便捷方法。它们分别继承自 GenericViewSet 并组合了多个 Mixin 类&#xff0c;使得视图的编写变得更加简单。 ModelViewSet ModelViewSet 继承自 GenericViewSet&…...

《0基础》学习Python——第二十四讲__爬虫/<7>深度爬取

一、深度爬取 深度爬取是指在网络爬虫中&#xff0c;获取网页上的所有链接并递归地访问这些链接&#xff0c;以获取更深层次的页面数据。 通常&#xff0c;一个简单的爬虫只会获取到初始页面上的链接&#xff0c;并不会进一步访问这些链接上的其他页面。而深度爬取则会不断地获…...

Python Pygame制作简单五子棋游戏

代码参考自&#xff1a;https://blog.csdn.net/weixin_43918046/article/details/119521845 新增功能&#xff1a;1任意棋盘大小&#xff1b;2.任意棋子连线 # 棋盘大小 [670, 670] # 棋盘行列 15*15 import pygame from pygame.locals import QUIT, KEYDOWN import numpy as…...

JS+H5在线文心AI聊天(第三方接口)

源码在最后面 调用的不是文心官方接口 可以正常聊天 有打字动画 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

GraphQL 实战篇:Apollo Client 配置与缓存

GraphQL 实战篇&#xff1a;Apollo Client 配置与缓存 上一篇&#xff1a;GraphQL 入门篇&#xff1a;基础查询语法 依旧和上一篇的笔记一样&#xff0c;主实操&#xff0c;没啥过多的细节讲解&#xff0c;代码具体在&#xff1a; https://github.com/GoldenaArcher/graphql…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...