工具:VS、.2.3f、LuaStudio(方便编写Lua)、SimpleFramework_UGUI-0.3.7.2
建议阅读原文下载我写的一个Dem和本文一起参考!!
Demo介绍如何使用uLua对UI进行热更新
【框架结构介绍】
Editor:一些编辑器扩展的脚本代码
Example:一个热更新例子介绍
Lua:实现热更新的核心lua代码
Source:实现热更新的核心C#代码
StreamingAssets:将生成的AssetBundles放入其中
uLua:luainterface代码lua与.net调用
【UI面板的创建】
我们要实现的功能是点击按钮A,弹出面板P,P中有个按钮B,点击按钮B,面板P隐藏
UI结构图如下图:
将SettingPanel、BackBoundPanel打包成一个预制体(预制体命名以'Panel'结尾)
并且将预制体分别设置为AssetBundle,分别命名为Setting.assetbundle、BackBound.assetbundle
可以参考AssetBundle的创建链接地址
【GameManager.lua代码的编写】
用LuaStudio打开Lua目录下的Lua.luapri,目录如下:
由于本身的GameManager.lua是案例的,所以在这里我把它重新命名为GameManager.lua_pre
并且新建一个.lua脚本放在Logic文件夹下(不然C#无法读取到),命名为GameManager.lua
GameManager.lua文件代码如下:
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
require
"Common/define"
require
"Controller/BackGroundCtl"
require
"Controller/SettingCtl"
--管理器--
GameManager={};
local
this=GameManager;
function
GameManager.LuaScriptPanel()
--C#执行该函数,获取以下两个字符串,自后会执行SettingPanel.lua、BackGroundPanel.lua
return
'Setting','BackGround';
end
function
GameManager.Awake()
end
--启动事件--
function
GameManager.Start()
end
--初始化完成,发送链接服务器信息--
function
GameManager.OnInitOK()
AppConst.SocketPort
=
2012;
AppConst.SocketAddress
=
"127.0.0.1";
NetManager:SendConnect();
SettingCtl.Awake();
BackGroundCtl.Awake();
end
|
【编写View层下的lua文件】
View下是编写显示层,一般获取其游戏对象上的组件或子对象
在View文件下添加SettingPanel.lua(注意新建文件时一定要将文件添加到View文件夹下,否则会报错滴)
SettingPanel.lua
在View文件下添加BackGroundPanel.lua(注意新建文件时一定要将文件添加到View文件夹下,否则会报错滴)
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
BackGroundPanel={};
local
this=BackGroundPanel;
local
transform;
local
gameobject;
function
BackGroundPanel.Awake(obj)
gameobject=obj;
transform=obj.transform;
this.InitPanel();
end
function
BackGroundPanel.InitPanel()
--获取其中Animator组件
this.anim=transform:GetComponent("Animator");
this.ColseButton=transform:FindChild("Button").gameObject;
end
|
【编写Controller文件下的lua文件】
Controller层一般处理动画、按钮点击事件等相关逻辑
在Controller文件下添加SettingCtl.lua(注意新建文件时一定要将文件添加到View文件夹下,否则会报错滴)
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
require
"Common/define"
SettingCtl={};
local
this=SettingCtl;
local
gameobject;
local
setting;
function
SettingCtl.New()
return
this;
end
function
SettingCtl.Awake()
PanelManager:CreatePanel("Setting",this.OnCreate);
end
--启动事件--
function
SettingCtl.OnCreate(obj)
gameobject=obj;
--添加事件响应--
setting=obj:GetComponent('LuaBehaviour');
setting:AddClick(SettingPanel.buttonSetting,this.OnClick);
end
--事件响应函数--
function
SettingCtl.OnClick()
BackGroundCtl.Show();
end
|
在Controller文件下添加BackBoundCtl.lua(注意新建文件时一定要将文件添加到View文件夹下,否则会报错滴)
[AppleScript] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
require
"Common/define"
BackGroundCtl={};
local
this=BackGroundCtl;
local
gameobject;
local
backGround;
function
BackGroundCtl.New()
return
this;
end
function
BackGroundCtl.Awake()
PanelManager:CreatePanel("BackGround",this.OnCreate);
end
--启动事件--
function
BackGroundCtl.OnCreate(obj)
gameobject=obj;
backGround=obj:GetComponent("LuaBehaviour");
backGround:AddClick(BackGroundPanel.ColseButton,this.OnClick);
end
function
BackGroundCtl.OnClick()
this.Hide();
end
function
BackGroundCtl.Show()
BackGroundPanel.anim:SetBool("IsShow",true);
end
function
BackGroundCtl.Hide()
BackGroundPanel.anim:SetBool("IsShow",false);
end
|
这样Lua下代码逻辑编写完成
【修改C#代码】
接下来需要C#有些代码细节需要改改
一.按如下图找到打开PanelManager.cs文件
按如下图修改
将Tag修改为Canvas,意思是AssetBundle将加载到Tag为Canvas对象上(可以自行选择把实例化对象加载到自定义的对象上)
所以将画布的Tag修改为Canvas
二.按如下图目录找到打开Util.cs文件
在最后几行按如下图修改:
这个修改可以说是框架的一个小Bug,以后版本可能会完善
三.按如下图找到AppConst.cs文件
修改后的AppConst.cs文件代码:
[C#] 纯文本查看 复制代码
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
using
UnityEngine;
using
System;
using
System.Collections;
using
System.Collections.Generic;
namespace
SimpleFramework {
public
class
AppConst {
public
const
bool
DebugMode = false;
//调试模式-用于内部测试
///
<summary>
///
如果想删掉框架自带的例子,那这个例子模式必须要
///
关闭,否则会出现一些错误。
///
</summary>
public
const
bool
ExampleMode = true;
//例子模式
///
<summary>
///
如果开启更新模式,前提必须启动框架自带服务器端。
///
否则就需要自己将StreamingAssets里面的所有内容
///
复制到自己的Webserver上面,并修改下面的WebUrl。
///
</summary>
public
const
bool
UpdateMode = true;
//更新模式-默认关闭
public
const
int
TimerInterval = 1;
public
const
int
GameFrameRate = 30; //游戏帧频
public
const
bool
UsePbc = true;
//PBC
public
const
bool
UseLpeg = true;
//LPEG
public
const
bool
UsePbLua = true;
//Protobuff-lua-gen
public
const
bool
UseCJson = true;
//CJson
public
const
bool
UseSproto = true;
//Sproto
public
const
bool
LuaEncode = false;
//使用LUA编码
public
const
string
AppName = "SimpleFramework";
//应用程序名称
public
const
string
AppPrefix = AppName + "_";
//应用程序前缀
public
const
string
ExtName = ".assetbundle";
//素材扩展名
public
const
string
AssetDirname = "StreamingAssets";
//素材目录
public
const
string
WebUrl = "http://192.168.1.102:6688/";
//测试更新地址
public
static
string
UserId = string.Empty;
//用户ID
public
static
int
SocketPort = 0; //Socket服务器端口
public
static
string
SocketAddress = string.Empty;
//Socket服务器地址
}
}
|
更新模式:为false时,不连接服务器;为true时,连接服务器更新(接下来会介绍怎么开启服务器)
【连接服务器更新模式】
按如上图方式将WebUrl改为
[AppleScript] 纯文本查看 复制代码
|
|
public
const string
WebUrl =
"http://192.168.1.102:6688/";
//测试更新地址
|
Url地址为局域网下的IP地址(获取IP地址方式在这里就不介绍了)
接下来是用VS开启..\SimpleFramework_UGUI-0.3.7.2\Server目录下的server.sln文件
按如下图在文件下的host地址更改下
接下来重新生成下
之后在..\SimpleFramework_UGUI-0.3.7.2\Server\Server\bin\Debug目录下找到SuperSocket.SocketService.exe文件
右键按管理员身份运行
输入r开始运行服务器
最后按如下图步骤执行并将更新模式改为true
最后开始运行游戏,客户端也接收到了数据