---
# System prepended metadata

title: 开始新建一个界面

---

# 开始新建一个界面

## 准备工作

* TA 制作好界面 UI Prefab
* TA 配置好 UI 配置表
* 程序或者策划导出 UI 配置表到工程目录

## 基础内容

### 绑定 UI 节点
每个 UI Prefab 根节点必须有一个 LuaComponent.cs 组件

![](https://i.imgur.com/Kmlhdc4.png)

1. 点击 Bind 按钮，会自动把 ***GameObject 名符合 m_ 开头且带如下组件的控件*** 自动 Bind 到 LuaUIComponent 上

```
{ typeof(LoveButton), "_btn" },
{ typeof(Image), "_img" },
{ typeof(Button), "_btn" },
{ typeof(Text), "_txt" },
{ typeof(Slider), "_sld" },
{ typeof(Scrollbar), "_slb" },
{ typeof(TextMeshProUGUI),"_tmp" },
{ typeof(Dropdown), "_ddn" },
{ typeof(InputField), "_ipt" },
{ typeof(Animation), "_ani" },
{ typeof(Animator), "_anr" },
{ typeof(LuaUIComponent), "_cmp"},
{ typeof(GridView), "_gvw" },
{ typeof(PageView), "_pvw" },
{ typeof(ScrollRect), "_srt" },
{ typeof(FlexibleView), "_fvw"},
```
2. 点击 CreateLua 按钮，会根据 Prefab 文件名，在 Assets\Game\Resources\lua\pages 目录下创建一个同名的 lua 文件，生成内容包含（节点，常用事件）
> 比如 LoginPage.prefab -> LoginPage.lua

3. 点击 UpdateLua，一般 TA 增加了组件或节点需要更新 Bind 节点时使用，会根据当前绑定的节点重新生成 Lua 文件的 _OnBind 函数。
***需注意的是，后续新添加的按钮等事件不会自动生成，需要自行添加***

**以下是登录界面生成的 Lua 文件**
```
local LoginPage = class("LoginPage", gIndex.BasePage)
-- 界面对象创建时调用
function LoginPage:OnNew()
	self:_OnBind( )
	
end

-- 界面显示时调用
function LoginPage:OnShow()
    
end


function LoginPage:OnClick_m_AccountBtn( btn )
	
end

function LoginPage:OnClick_m_CGBtn( btn )
	
end

function LoginPage:OnClick_m_ServerBtn( btn )
	
end

function LoginPage:OnClick_m_StartBtn( btn )
	
end

-- 界面需要 Update 时调用，一般不用，所以默认是注释状态
--[[
function LoginPage:OnUpdate()
end
]]

-- 界面关闭时调用
function LoginPage:OnHide()

end

-- 当前界面跳转时调用，用于保存数据。
-- 当跳转的界面关闭时，会把 OnSave 保存的数据填充到 OnShow 函数里。
--anchorbegin[_OnSave]
function LoginPage:_OnSave()
	BasePage._OnSave( self )
end
--anchorend[_OnSave]

-- 绑定的节点列表
--anchorbegin[_OnBind]
function LoginPage:_OnBind()
	
	local nodes = self._mLuaUIComponent:GetNodes( )
	self._AccountBtn_btn = nodes[10]--Canvas (Environment)/LoginPage/safearea/Btn/m_AccountBtn/
	self._AccountBtn_img = nodes[9]--Canvas (Environment)/LoginPage/safearea/Btn/m_AccountBtn/
	self._CGBtn_btn = nodes[7]--Canvas (Environment)/LoginPage/safearea/Btn/m_CGBtn/
	self._CGBtn_img = nodes[6]--Canvas (Environment)/LoginPage/safearea/Btn/m_CGBtn/
	self._ID_tmp = nodes[0]--Canvas (Environment)/LoginPage/safearea/m_ID/
	self._Num_tmp = nodes[1]--Canvas (Environment)/LoginPage/safearea/m_Num/
	self._ServerBtn_btn = nodes[14]--Canvas (Environment)/LoginPage/safearea/Servers/m_ServerBtn/
	self._ServerName1_tmp = nodes[11]--Canvas (Environment)/LoginPage/safearea/Servers/m_ServerName1/
	self._ServerName2_tmp = nodes[12]--Canvas (Environment)/LoginPage/safearea/Servers/m_ServerName2/
	self._StartBtn_btn = nodes[4]--Canvas (Environment)/LoginPage/safearea/Btn/m_StartBtn/
	self._StartBtn_img = nodes[3]--Canvas (Environment)/LoginPage/safearea/Btn/m_StartBtn/
end

--anchorend

return LoginPage
```

### 响应事件

运行的时候 LuaUIComponent 会绑定一些常用控件的事件，当事件触发时会主动调用到 Lua 层。

```
现有如下控件的常用事件：
Button, Dropdown, InputField, Slider, Scrollbar

"OnClick_{button.name}"
"OnValueChanged_{dropdown.name}"
"OnEndEdit_{inputField.name}"
"OnValueChanged_{inputField.name}"
"OnValueChanged_{slider.name}"
"OnValueChanged_{scrollbar.name}"
```

**后续新添加的按钮得先点击 LuaUIComponent 的 Bind，然后自行在 Lua 里面申明函数**

```
比如新加个 m_Login 按钮，则在 Page Lua 文件里面声明

function LoginPage:OnClick_m_Login( btn )
	
end
```

**多个同名按钮回调会回调到一个函数里，根据函数 btn 参数去判断是哪个按钮即可**

### 操作 UI 节点

Page Lua 都继承于 BasePage.lua, BasePage 里面封装了大部分常用操作节点函数，强烈建议先提前浏览一遍 BasePage 熟悉。

## 常用接口

```
-- 打开界面
BasePage:Head( pagename, ... )
-- 关闭当前界面
BasePage:Back( )
-- 获取多语言文本
BasePage:getLangText(langId, ...)
-- 设置 Text 多语言文本
BasePage:setLangText(uiText, langId, ...)
-- 设置图标
BasePage.LoadSprite(self, uiImage, spriteName, callback)
-- 复制当前节点
BasePage:CopyComponent(component, count)
-- 横向排列节点列表
BasePage:HorizontalComponents(components, align, space)
-- 竖向排列节点列表
BasePage:VerticalComponents(components, align, space)
-- 设置 Text 文本
BasePage:setText( uitext, txt )
-- 设置 node 显隐
BasePage:setNodeVisible(uinode, visible)
-- 监听网络请求
BasePage:pbAttach(pbStructName, callback)
-- 监听消息
BasePage:attach(key, callback)
-- 设置大背景图，有缓存功能
BasePage.LoadBg(self, uiImage, spriteName, callback)
-- 创建 ScorllView
BasePage:CreateList( scrollrect, itemclass )
-- 创建 GridView
BasePage:CreateGrid(scrollrect, itemclass)
-- 创建 FlexibleView
BasePage:CreateFlexibleView(scrollrect, itemclass)
-- Load Spine 文件
BasePage:LoadSpine(uiParent, logicname, roleCfgId, callback)
-- 设置 Graphic 颜色值
BasePage:setColorCfg(uitext, color)
-- 设置文本颜色值
BasePage:setTextColor(uitext, r, g, b, a)
-- 设置 node 锚点
BasePage:SetAnchorPosition(uinode, x, y, z)
-- 设置 node local position
BasePage:SetLocalPosition(uinode, x, y, z)
-- 设置 node rotation
BasePage:SetRotation(uinode, x, y, z, w)
-- 设置节点变灰带虚边
BasePage:SetAllChildGrayAndEdge(uinode, isGray)
-- 设置节点变灰不带虚边
BasePage:SetAllChildGrayNoEdge(uinode, isGray)
-- 格式化成千进制
BasePage:Formatnumberthousands(num)
-- 播放动画
BasePage:PlayAnr(anr, aniName, layer, normalizedTime)
-- 停止缓动
BasePage:directValue( name, curr, callback )
-- 缓动，需要跟 directValue 函数配套使用
BasePage:tweenValue( name, target, last, cycle, callback, tweenFun )
-- directValue 和 tweenValue 的封装
BasePage:SimpleTween( name, start, target, cycle, time, callback )
-- 计时器
BasePage:OnceTimer(name, delay, callback)
-- 计时器
BasePage:CtrlTimer(name, duration, callback)
-- 停止一个计时器
BasePage.StopTimer( self, name )
```

## 常见问题及注意事项

1. LuaUIComponent Cteate UI Lua 文件时提示：“需要先配置且导出 table_page 表”
**一定是 TA 忘记配置 UI 配置表或者忘记同步配置到工程。**

2. LuaUIComponent Cteate UI Lua 文件时提示：“文件已经存在，需要重新生成请手动删除”
**防止误操作覆盖已经修改的 Lua 文件加的临时文件，有需要重新删除的需求，自行找到文件删除即可重新生成**

3. OnShow 函数在切换语言和重联的情况下，调用 OnShow 函数时不会回传参数列表，需要使用最后记录值
```
function LoginPage:OnShow(oldshow, x1)
    self.x1 = x1 or self.x1
end
```
