从GameManager开始执行,
创建面板过程
unction GameManager.OnInitOK()
AppConst.SocketPort = 2012;
AppConst.SocketAddress = "127.0.0.1";
NetManager:SendConnect();
--lua的一些测试方法
this.test_class_func();
this.test_pblua_func();
this.test_cjson_func();
this.test_pbc_func();
this.test_lpeg_func();
this.test_sproto_func();
--createPanel("Prompt");
--名字跟ctrl对应的表
CtrlManager.Init();
--根据名字获取ctrl对象
local ctrl = CtrlManager.GetCtrl(CtrlName.Prompt);
--案例模式
if ctrl ~= nil and AppConst.ExampleMode then
ctrl:Awake();
end
warn('SimpleFramework InitOK--->>>');
end
function CtrlManager.Init()
warn("CtrlManager.Init----->>>");
--CtrlName在define中定义了,panel对应的一个Ctrl文件
--每一个panel会对应一个view的lua脚本
ctrlList[CtrlName.Prompt] = PromptCtrl.New();
ctrlList[CtrlName.Message] = MessageCtrl.New();
return this;
end
function PromptCtrl.Awake()
warn("PromptCtrl.Awake--->>");
PanelManager:CreatePanel('Prompt', this.OnCreate);
end
Defines中定义的类相当于取到了C#中对应的类
ResManager = LuaHelper.GetResManager();
NetManager = LuaHelper.GetNetManager();
PanelManager = LuaHelper.GetPanelManager();
MusicManager = LuaHelper.GetMusicManager();
访问到C#Panel中的CreatPanel方法
--创建面板--
function createPanel(name)
PanelManager:CreatePanel(name);
end
C#中PanelManager中的方法
/// 创建面板,请求资源管理器
/// </summary>
/// <param name="type"></param>
public void CreatePanel(string name, LuaFunction func = null) {
StartCoroutine(OnCreatePanel(name, func));
}
IEnumerator OnCreatePanel(string name, LuaFunction func = null) {
yield return StartCoroutine(Initialize());
//prompt+Panel相当于预设的名字
string assetName = name + "Panel";
// Load asset from assetBundle.
string abName = name.ToLower() + AppConst.ExtName;
//加载assetbundle资源
AssetBundleAssetOperation request = ResourceManager.LoadAssetAsync(abName, assetName, typeof(GameObject));
if (request == null) yield break;
yield return StartCoroutine(request);
// Get the asset.
GameObject prefab = request.GetAsset<GameObject>();
if (Parent.FindChild(name) != null || prefab == null) {
yield break;
}
GameObject go = Instantiate(prefab) as GameObject;
go.name = assetName;
go.layer = LayerMask.NameToLayer("Default");
//父类为GuiCamera
go.transform.SetParent(Parent);
go.transform.localScale = Vector3.one;
go.transform.localPosition = Vector3.zero;
go.AddComponent<LuaBehaviour>();
//panel创建完之后会调用lua中的OnCreat方法
if (func != null) func.Call(go);
Debug.LogWarning("CreatePanel::>> " + name + " " + prefab);
}
得到父物体
Transform Parent {
get {
if (parent == null) {
GameObject go = GameObject.FindWithTag("GuiCamera");
if (go != null) parent = go.transform;
}
return parent;
}
}
回调到lua中的方法
--启动事件--
function PromptCtrl.OnCreate(obj)
gameObject = obj;
transform = obj.transform;
panel = transform:GetComponent('UIPanel');
prompt = transform:GetComponent('LuaBehaviour');
warn("Start lua--->>"..gameObject.name);
prompt:AddClick(PromptPanel.btnOpen, this.OnClick);
ResManager:LoadAsset('prompt', 'PromptItem', this.InitPanel);
end
Panel实例化出来之后会添加一个LuaBehaviour脚本
LuaBehaviour类,CallMethod()方法
protected void Awake() {
CallMethod("Awake", gameObject);
}
protected void Start() {
if (LuaManager != null && initialize) {
LuaState l = LuaManager.lua;
l[name + ".transform"] = transform;
l[name + ".gameObject"] = gameObject;
}
CallMethod("Start");
}
function PromptPanel.Awake(obj)
gameObject = obj;
transform = obj.transform;
this.InitPanel();
warn("Awake lua--->>"..gameObject.name);
end
--初始化面板--
function PromptPanel.InitPanel()
this.btnOpen = transform:FindChild("Open").gameObject;
this.gridParent = transform:FindChild('ScrollView/Grid');
end
Lua中的PromptCtrl.OnCreate方法
--启动事件--
function PromptCtrl.OnCreate(obj)
gameObject = obj;
transform = obj.transform;
panel = transform:GetComponent('UIPanel');
prompt = transform:GetComponent('LuaBehaviour');
warn("Start lua--->>"..gameObject.name);
prompt:AddClick(PromptPanel.btnOpen, this.OnClick);
ResManager:LoadAsset('prompt', 'PromptItem', this.InitPanel);
end
点击按钮事件
--单击按钮事件--
function PromptCtrl.OnClick(go)
if TestProtoType == ProtocalType.BINARY then
this.TestSendBinary();
end
if TestProtoType == ProtocalType.PB_LUA then
this.TestSendPblua();
end
if TestProtoType == ProtocalType.PBC then
this.TestSendPbc();
end
if TestProtoType == ProtocalType.SPROTO then
this.TestSendSproto();
end
warn("OnClick---->>>"..go.name);
end
MessagePanel是通过 Lua MessageCrtrl初始化的,
function MessageCtrl.Awake()
warn("MessageCtrl.Awake--->>");
PanelManager:CreatePanel('Message', this.OnCreate);
end
--启动事件--
function MessageCtrl.OnCreate(obj)
gameObject = obj;
message = gameObject:GetComponent('LuaBehaviour');
message:AddClick(MessagePanel.btnClose, this.OnClick);
warn("Start lua--->>"..gameObject.name);
end
每一个UiPanel对应View下UiPanel的一个脚本,UIPanel获取一些需要操作的属性,UIPanel的实例化是通过UICtrl去控制的,还有控制组件的一些行为