【Unity】关于Luban的简单使用

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

【Unity】关于Luban的简单使用

安装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%\output

pause

新建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 os

import xlrd
import xlwt
import pandas
import subprocess

execlDataTitle = []
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.THIN
    borders.right = xlwt.Borders.THIN
    borders.top = xlwt.Borders.THIN
    borders.bottom = xlwt.Borders.THIN
    ##设置居中
    alignment = xlwt.Alignment()
    alignment.horz = xlwt.Alignment.HORZ_CENTER
    alignment.vert = xlwt.Alignment.VERT_CENTER
    for 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 = 1
            if i <= 2:
                pattern = xlwt.Pattern()
                pattern.pattern = xlwt.Pattern.SOLID_PATTERN
                pattern.pattern_fore_colour = 17
                style.pattern = pattern
                style.borders = borders
                sheet.write(i, j, execlDataTitle[i][j], style)  # 像表格中写入数据(对应的行和列)
            else:
                style.borders = borders
                fileName = 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

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

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
unity luban是一个最佳游戏配置解决方案,它支持多种数据格式,包括excel、csv、xls、xlsx、json、bson、xml、yaml、lua和unity scriptableobject,并能够将这些格式转换为json、bson、xml、lua、yaml、protobuf(pb)、msgpack、flatbuffers、erlang和自定义模板。 在Unity中,luban还提供了逆向运动学解决方案,适用于Humanoid、Generic和Legacy动画类型,并经过了在多个平台上的测试,包括Standalone、WebGL、iOS、Android和所有VR平台(包括Oculus Quest)。它还包含源代码,并适用于各个组件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Unity导表工具Luban插件的数据加载原理与优化](https://blog.csdn.net/wankcn/article/details/127883528)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Unity学习笔记——Luban工具的使用](https://blog.csdn.net/qq_55042292/article/details/125665772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [UnityIK人体骨骼反向动力学系统插件 Final IK 2.2](https://download.csdn.net/download/mayzhengxi/88262273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值