Luban配置教程
首先你的去下载Dotnet sdk,然后去github主页:https://github.com/focus-creative-games/luban下载鲁班。
2.下载luban工程项目
3.创建Unity工程,从luban工程项目里面复制Luban目录
4.从luban复制工程库和MiniDesignerConfigsTemplate文件夹
5.编辑生成命令
在unity的玩家设置里面的其他设置勾选
在unity这里配置好Luban相关的文件目录。
然后就是你一定要保证有这这几个文件夹
就是在Luban示例项目: https://github.com/focus-creative-games/编辑luban_examples里面的
然后去下载最新版本的luban,在这个链接 :Releases · focus-creative-games/luban
下载解压之后是这是这样
var代表字段名,Type代表字段类型,group是分组,有client,server和all(默认不填也是)
##代表注释
- 第1行是字段名行。单元格 A1 必须以##开头。表示这是一个有效数据表。
- 第2行是字段类型行。第1个单元格必须为 ##type。
- 第3行是分组行。
c
表示字段属于客户端,s
表示属于属于服务器,c,s
表示同时属于所有,留空也表示属于所有。 - 第4行是注释行。 以##开头。 可以有0-N个注释行,而且可以出现在任何位置
- 第5行起是数据行。
然后填入数据即可
下面这里是配置导出文件
luban conf的位置:也就是下图这个文件,此处是与gen.bat同级,所以填一个点就行
'-t' 生成目标。可以为client、server、all之类的值
d代表生成的数据目标
c代表生成的代码目标
conf代表Config的位置
两个output分别代表数据和代码的输出路径
详细内容请参考这个:快速上手 | Luban
在这里需要补充几点:
下面两个表格里面的最好需要进行填写,不然导出会出现错误。
类似于下面这样,这个表格是定义你的枚举类型的,就是你的导出类型,枚举类型(Enum)的定义配置表,用于描述游戏或软件中的枚举值(如奖励类型、格子类型等),可能是配合自动化工具(如 Excel 转代码/JSON 的导出工具)使用的。
列名 | 说明 |
---|---|
##tvar__ | 可能是内部标记(如 ##var 表示变量定义,##tvar__ 表示模板或类型定义)。 |
full name | 枚举的全名(如 EAwardType ),通常对应代码中的枚举类型名。 |
flags | 是否为 位标记枚举(即每个枚举值是二进制位,可组合使用,如 1, 2, 4, 8… )。 |
unique | 枚举项是否唯一(TRUE /FALSE )。 |
group | 分组名称(如 Coin 可能表示“货币奖励”分组)。 |
comment | 注释(如“奖励灵石”是对 EAwardType 的说明)。 |
tags | 标签,可能用于工具分类或筛选。 |
vitems | 枚举项的具体定义(下方 ##var 开头的行)。 |
枚举项定义部分(##var
开头的行)
列名 | 说明 |
---|---|
name | 枚举项的名称(如 Coin )。 |
alias | 枚举项的别名(可选)。 |
value | 枚举项的数值(如果是位标记枚举,需为 2 的幂次方,如 1, 2, 4, 8… )。 |
comment | 枚举项的注释(如“奖励灵石”)。 |
下面这个表格是定义你的导出类型是否能被读取,用于 游戏/软件的数据表(Excel)自动导出和代码生成 的配置文件
列名 (B~K) | 说明 |
---|---|
fullname | 记录类名(如 GridTrayTableItem ),可能是生成的代码类名或数据结构名。 |
value_type | 值类型(如 GridTray ),可能对应代码中的枚举或父类。 |
read schema from file | TRUE 表示从 Excel 读取定义,FALSE 表示使用已有定义。 |
input | 输入文件列表(如 GridTray.xlsx ),可能是要解析的 Excel 文件。 |
index mode | 可能是指索引模式(如主键、唯一键等)。 |
group | 数据分组,可能用于分类或模块化。 |
comment | 注释,说明该表的用途。 |
tags | 标签,可能用于筛选或额外处理。 |
output | 输出文件名(如 GridTrayMode ),可能是生成的 JSON/CS 代码文件。 |
## 1. 数据结构与算法
### 1.1 核心数据结构
**UI组件映射表 (UI Component Mapping)**
```csharp
private const string LIST_COMPONENT_NAME = "n21";
private const string TYPE_COMPONENT_NAME = "n31";
private const string ITEM_COMPONENT_NAME = "n2";
private const string TITLE_COMPONENT_NAME = "n3";
private const string ICON_COMPONENT_NAME = "n30";
```
**数据结构分析**:
- **映射关系**: 使用常量字符串映射UI组件名称
- **设计模式**: 常量映射模式
- **优势**:
- 集中管理UI组件名称
- 避免硬编码,便于维护
- 编译时检查,减少运行时错误
**法宝等级系统 (Grade System)**
```csharp
private const int MAX_GRADE_COUNT = 5;
private int m_CurFaBaoGrade;
```
**数据结构特点**:
- **等级上限**: 每个法宝最多5个等级
- **当前等级**: 记录玩家已解锁的等级
- **算法应用**: 用于控制UI显示和动画播放
### 1.2 列表渲染算法
**虚拟列表渲染 (Virtual List Rendering)**
```csharp
m_FaBaoList.itemRenderer = FaBaoListItemRenderer;
m_FaBaoList.numItems = OldFaBaoMgr.Inst.m_FaBaoIDList.Count;
```
**算法分析**:
- **虚拟化**: 只渲染可见区域的列表项
- **性能优化**: 避免创建所有列表项,节省内存
- **动态渲染**: 根据滚动位置动态创建/回收列表项
**渲染器回调模式**:
```csharp
private void FaBaoListItemRenderer(int index, GObject obj)
{
// 根据索引获取数据
var itemId = OldFaBaoMgr.Inst.m_FaBaoIDList[index];
var data = DataMgr.Inst.m_ExcelData.OldGetItemData(itemId);
// 设置UI内容
title.text = data.ShowName;
describe.text = data.Describe;
}
```
**算法特点**:
- **延迟加载**: 只在需要时加载数据
- **数据绑定**: 将数据与UI组件绑定
- **状态管理**: 根据数据状态设置UI状态
### 1.3 动画状态机算法
**动画状态管理**
```csharp
var trans = item.GetTransition(GRADE_ICON_TRANSITION_NAME);
trans.Play();
trans.SetPaused(true);
if (index == m_CurFaBaoGrade && m_CurFaBaoGrade != 0)
{
trans.Play(-1, 0, null); // 播放升级动画
}
```
**状态机模式**:
- **初始状态**: 动画暂停
- **条件判断**: 检查是否为当前等级
- **状态转换**: 满足条件时播放动画
### 1.4 事件防重复算法
**点击防抖机制**
```csharp
private bool m_IsClick = false;
private bool m_IsRegisterEvent = false;
private void OnClickItem(EventContext context)
{
if (context == null || context.data == null || m_IsClick) return;
m_IsClick = true;
// 处理点击逻辑...
}
```
**算法设计**:
- **防重复点击**: 使用布尔标志防止重复处理
- **状态重置**: 在适当时机重置标志
- **用户体验**: 避免因快速点击导致的异常
## 2. 语法结构详解
### 2.1 常量声明与命名规范
**常量定义**
```csharp
private const string LIST_COMPONENT_NAME = "n21";
private const int MAX_GRADE_COUNT = 5;
```
**语法要点**:
- `const`: 编译时常量,值在编译时确定
- `private`: 访问修饰符,只在类内部可见
- **命名规范**: 使用大写字母和下划线,表示常量
**命名空间组织**
```csharp
using FairyGUI;
using WeiLai.OldGameWorld.FaBao;
using WeiLai.Mgr;
using UnityEngine;
```
**语法分析**:
- `using`: 导入命名空间,简化类型引用
- **命名空间层次**: 按功能模块组织代码
### 2.2 继承与重写
**类继承结构**
```csharp
public class FaBaoChoiceView : BaseView
{
public override void Show()
{
base.Show(); // 调用基类方法
// 子类特定逻辑
}
}
```
**语法特点**:
- `: BaseView`: 继承自BaseView类
- `override`: 重写基类的虚方法
- `base.Show()`: 调用基类方法
### 2.3 委托与事件处理
**事件绑定**
```csharp
m_FaBaoList.onClickItem.Add(OnClickItem);
```
**语法分析**:
- `onClickItem`: 事件对象
- `Add()`: 添加事件处理器
- `OnClickItem`: 事件处理方法
**Lambda表达式**
```csharp
trans.Play(() =>
{
OldFaBaoMgr.Inst.AddFaBaoOrShuFa(itemId);
// 回调逻辑...
});
```
**语法特点**:
- `() =>`: Lambda表达式语法
- **匿名方法**: 内联定义回调函数
- **闭包**: 可以访问外部变量
### 2.4 空值检查与防御性编程
**空值检查模式**
```csharp
if (obj == null || index < 0 || index >= OldFaBaoMgr.Inst.m_FaBaoIDList.Count) return;
```
**语法要点**:
- **短路求值**: `||` 运算符,第一个条件为真时跳过后续检查
- **边界检查**: 确保索引在有效范围内
- **防御性编程**: 防止空引用异常
### 2.5 类型转换与访问
**类型转换**
```csharp
var btn = obj.asButton;
var item = btn.GetChild(ITEM_COMPONENT_NAME).asCom;
var title = item.GetChild(TITLE_COMPONENT_NAME).asTextField;
```
**语法分析**:
- `as`: 安全类型转换,失败时返回null
- **链式调用**: 连续调用方法获取子组件
- **类型推断**: 编译器自动推断变量类型
## 3. 逻辑实现详解
### 3.1 UI初始化流程
**组件初始化**
```csharp
private void InitComponent()
{
if (m_FaBaoList == null)
{
m_FaBaoGLoader = m_Panel.ui.GetChild(LIST_COMPONENT_NAME).asLoader;
}
m_FaBaoGLoader.alpha = 1;
if (m_FaBaoList == null)
{
m_FaBaoList = m_FaBaoGLoader.component.GetChild("n1").asList;
}
}
```
**逻辑流程**:
1. **延迟初始化**: 只在需要时创建组件引用
2. **空值检查**: 避免重复初始化
3. **状态设置**: 设置组件的初始状态
### 3.2 列表数据绑定
**数据绑定流程**
```csharp
private void InitFaBaoList()
{
m_FaBaoList.itemRenderer = FaBaoListItemRenderer;
m_FaBaoList.numItems = OldFaBaoMgr.Inst.m_FaBaoIDList.Count;
m_Panel.ui.GetTransition("enter").Play();
}
```
**绑定机制**:
- **渲染器设置**: 指定列表项渲染方法
- **数据源设置**: 设置列表项数量
- **动画播放**: 播放进入动画
### 3.3 法宝等级显示逻辑
**等级状态管理**
```csharp
private void GradeListItemRenderer(int index, GObject obj)
{
var iconLight = item.GetChild(GRADE_ICON_LIGHT_COMPONENT_NAME).asLoader;
var iconDark = item.GetChild(GRADE_ICON_DARK_COMPONENT_NAME).asLoader;
// 默认显示未解锁状态
iconLight.visible = false;
iconDark.visible = true;
// 已解锁的等级显示亮图标
if (index <= m_CurFaBaoGrade)
{
iconLight.visible = true;
// 当前等级播放升级动画
if (index == m_CurFaBaoGrade && m_CurFaBaoGrade != 0)
{
trans.Play(-1, 0, null);
}
}
}
```
**逻辑分析**:
- **状态判断**: 根据索引和当前等级判断显示状态
- **动画控制**: 当前等级播放特殊动画
- **视觉反馈**: 通过图标状态提供清晰的等级信息
### 3.4 法宝选择与动画
**选择流程**
```csharp
private void OnClickItem(EventContext context)
{
// 1. 获取点击的法宝信息
var index = m_FaBaoList.GetChildIndex(context.data as GObject);
var itemId = OldFaBaoMgr.Inst.m_FaBaoIDList[index];
// 2. 计算动画位置
var pos = new Vector2(item.x + item.width / 2, item.y + item.height / 2);
var posEndPos = new Vector2(faBaoCom.x + faBaoCom.width / 2, faBaoCom.y + faBaoCom.height / 2);
// 3. 创建获取动画
OldFguiAniMgr.Inst.CreateTwoStageAni(itemData, pos, pos + new Vector2(0, -100), posEndPos, 0.0f, with, height);
// 4. 播放关闭动画并添加法宝
trans.Play(() => {
OldFaBaoMgr.Inst.AddFaBaoOrShuFa(itemId);
// 后续处理...
});
}
```
**流程分析**:
1. **数据获取**: 从点击事件获取法宝信息
2. **位置计算**: 计算动画的起始和结束位置
3. **动画创建**: 创建两阶段动画效果
4. **状态更新**: 添加法宝到玩家背包
5. **界面更新**: 刷新界面或关闭界面
### 3.5 界面状态管理
**状态转换逻辑**
```csharp
if (OldFaBaoMgr.Inst.m_FaBaoIDListPool.Count == 0)
{
// 所有法宝选择完毕,关闭界面
UIMgr.Inst.ClosePage(m_PageInfo);
EventMgr.Inst.BroadcastEmpty(EventId.ChoiceRewardFinish);
// 检查任务完成状态
if (DataMgr.Inst.m_IsMonsterGenerated && PlayerMgr.Inst.m_MonsterList.Count == 0)
{
EventMgr.Inst.BroadcastEmpty(EventId.MissionSuccess);
}
}
else
{
// 还有法宝可选,刷新列表
RefreshFaBaoList();
m_IsClick = false;
}
```
**状态管理**:
- **完成检查**: 检查是否所有法宝都已选择
- **事件广播**: 通知其他系统状态变化
- **条件分支**: 根据状态执行不同逻辑
## 4. 性能优化分析
### 4.1 虚拟列表优化
```csharp
m_FaBaoList.itemRenderer = FaBaoListItemRenderer;
```
**优化效果**:
- **内存效率**: 只创建可见的列表项
- **渲染性能**: 减少不必要的UI组件创建
- **滚动流畅**: 大量数据时保持流畅滚动
### 4.2 延迟初始化
```csharp
if (m_FaBaoList == null)
{
m_FaBaoList = m_FaBaoGLoader.component.GetChild("n1").asList;
}
```
**优化特点**:
- **按需加载**: 只在需要时初始化组件
- **资源节约**: 避免不必要的组件创建
- **启动速度**: 提高界面启动速度
### 4.3 事件防抖
```csharp
if (m_IsClick) return;
m_IsClick = true;
```
**优化效果**:
- **防止重复**: 避免重复处理点击事件
- **性能保护**: 防止快速点击导致的性能问题
- **用户体验**: 提供稳定的交互体验
## 5. 扩展性设计
### 5.1 配置化设计
```csharp
private const int MAX_GRADE_COUNT = 5;
private const string LIST_COMPONENT_NAME = "n21";
```
**扩展性特点**:
- **常量配置**: 通过修改常量调整功能
- **组件映射**: 通过修改组件名称适配不同UI
- **等级系统**: 可以轻松调整等级上限
### 5.2 事件驱动架构
```csharp
EventMgr.Inst.BroadcastEmpty(EventId.ChoiceRewardFinish);
EventMgr.Inst.BroadcastEmpty(EventId.MissionSuccess);
```
**架构优势**:
- **解耦合**: 界面与业务逻辑分离
- **可扩展**: 易于添加新的事件监听者
- **维护性**: 便于调试和修改
## 总结
**数据结构**: 使用常量映射管理UI组件,虚拟列表优化性能,等级系统管理法宝状态
**算法**: 列表渲染算法、动画状态机、事件防抖机制、状态转换逻辑
**语法**: 大量使用继承重写、委托事件、Lambda表达式、类型转换等C#高级语法
**逻辑**: 完整的UI初始化、数据绑定、用户交互、动画播放、状态管理流程
**优化**: 虚拟列表、延迟初始化、事件防抖等性能优化技术
这个法宝选择界面设计完善,性能优化到位,是典型的游戏UI系统实现!