C#核心脚本

1.框架入口 GlobalGenerator.cs 在场景中有一个空物体,该物体上挂载了一个“GlobalGenerator.cs”脚本。 该脚本字面意思理解是“全局生成器”,它是ULua 热更新框架的入口启动脚本。作用类似于VS 控制台项目中的入口脚本Program.cs。

using UnityEngine;
using System.Collections;

namespace SimpleFramework {
///


/// 全局构造器,每个场景里都有,所以每个场景都会初始化一遍,也会初始化游戏管理器一次
/// 如果游戏管理器已经存在了,就跳过了,否则创建游戏管理器,来保证游戏里只有一个GameManager
///

public class GlobalGenerator : MonoBehaviour {

    void Awake() {
        InitGameMangager();
    }

    /// <summary>
    /// 实例化游戏管理器
    /// </summary>
    public void InitGameMangager() {
        //定义一个字符串变量.
        string name = "GameManager";
        //在当前场景中查找该名称的变量,如果没有则实例化该游戏物体,并且给它设置物体名称.
        GameObject manager = GameObject.Find(name);
        if (manager == null) {
            manager = new GameObject(name);
            manager.name = name;

            //调用框架中的功能方法,启动热更新框架.
            AppFacade.Instance.StartUp();   //启动游戏
        }
    }
}

}

2.启动命令 StartUpCommand.cs 在ULua 框架启动后,会执行到“StartUpCommand.cs”脚本。 这个脚本的作用是给场景内的游戏物体添加必备的管理器脚本。

using UnityEngine;
using System.Collections;
using SimpleFramework;
using SimpleFramework.Manager;

///


/// 框架启动命令.
///

public class StartUpCommand : ControllerCommand {

public override void Execute(IMessage message) {
    if (!Util.CheckEnvironment()) return;

    //查找当前场景中的GlobalGenerator游戏物体.
    GameObject gameMgr = GameObject.Find("GlobalGenerator");
    //如果存在就给该游戏物体添加一个AppView.cs脚本.
    if (gameMgr != null) {
        AppView appView = gameMgr.AddComponent<AppView>();
    }
    //-----------------关联命令-----------------------
    AppFacade.Instance.RegisterCommand(NotiConst.DISPATCH\_MESSAGE, typeof(SocketCommand));

    //-----------------初始化管理器-----------------------
    AppFacade.Instance.AddManager(ManagerName.Lua, new LuaScriptMgr());

    //给“GameManager游戏物体”动态的添加7个管理器脚本.
    AppFacade.Instance.AddManager<PanelManager>(ManagerName.Panel);
    AppFacade.Instance.AddManager<MusicManager>(ManagerName.Music);
    AppFacade.Instance.AddManager<TimerManager>(ManagerName.Timer);
    AppFacade.Instance.AddManager<NetworkManager>(ManagerName.Network);
    AppFacade.Instance.AddManager<ResourceManager>(ManagerName.Resource);
    AppFacade.Instance.AddManager<ThreadManager>(ManagerName.Thread);
    AppFacade.Instance.AddManager<GameManager>(ManagerName.Game);

    Debug.Log("SimpleFramework StartUp-------->>>>>");
}

}

3.七个管理器脚本 ULua 框架运行后,会自动给“GameManager 游戏物体”添加7 个管理器脚本,这7 个管理器脚本内,存放了大量的“可复用代码”。 [

](http://www.wjgbaby.com/wp-content/uploads/2017/12/17122401-300x276.jpg)
](http://www.wjgbaby.com/wp-content/uploads/2017/12/17122401-300x276.jpg)
4.游戏管理器 GameManager.cs 这7 个管理器脚本中,代码量最大的是GameManager.cs 脚本,在开发发中操作也是最多的。 热更新框架中核心的“资源热更新下载功能”就是在该脚本内实现的。 OnResourceInited()方法:C#与Lua 交互的入口。 部分代码:

///


/// 资源初始化结束
///

public void OnResourceInited() {
//启动Lua管理器,其实还是Lua解析器(Lua运行虚拟机).
LuaManager.Start();
//DoFile方法加载外部的文件并且执行.
LuaManager.DoFile(“Logic/Network”); //加载网络
LuaManager.DoFile(“Logic/GameManager”); //加载游戏
initialize = true; //初始化完

NetManager.OnInit();    //初始化网络

//调用GameManager.lua脚本中的"LuaScriptPanel"方法.
object\[\] panels = CallMethod("LuaScriptPanel");  
//---------------------Lua面板---------------------------
foreach (object o in panels) {
    string name = o.ToString().Trim();
    if (string.IsNullOrEmpty(name)) continue;
    //将名称和"Panel"相加组拼成新的名称,如:MessagePanel.
    name += "Panel";    //添加

    //加载View/目录下的对应的界面脚本.
    LuaManager.DoFile("View/" + name);
    Debug.LogWarning("LoadLua---->>>>" + name + ".lua");
}
//------------------------------------------------------------
//全部加载完毕后,回调执行GameManager.lua脚本中的"OnInitOK"方法.
CallMethod("OnInitOK");   //初始化完成

}

Lua 核心脚本

1.游戏管理器 GameManager.lua C#版本的GameManger.cs 中会加载Lua 版的GameManger.lua 脚本。 LuaScriptPanel():返回一个名称数组. OnInitOK():加载完View 资源后的回调方法.

require “3rd/pblua/login_pb”
require “3rd/pbc/protobuf”

local lpeg = require “lpeg”

local json = require “cjson”
local util = require “3rd/cjson.util”

local sproto = require “3rd/sproto/sproto”
local core = require “sproto.core”
local print_r = require “3rd/sproto/print_r”

require “Logic/LuaClass”
require “Logic/CtrlManager”
require “Common/functions”
require “Controller/PromptCtrl”

–管理器–
GameManager = {};
local this = GameManager;

local game;
local transform;
local gameObject;
local WWW = UnityEngine.WWW;

–返回Lua中面板的名称.
function GameManager.LuaScriptPanel()
return ‘Prompt’, ‘Message’;
end

function GameManager.Awake()
–warn(‘Awake—>>>’);
end

–启动事件–
function GameManager.Start()
–warn(‘Start—>>>’);
end

–初始化完成,发送链接服务器信息–
function GameManager.OnInitOK()
–设置Socket相关属性,然后发起请求.
AppConst.SocketPort = 2012;
AppConst.SocketAddress = “127.0.0.1”;
NetManager:SendConnect();

--执行相应的测试方法.
this.test\_class\_func();
this.test\_pblua\_func();
this.test\_cjson\_func();
this.test\_pbc\_func();
this.test\_lpeg\_func();
this.test\_sproto\_func();
coroutine.start(this.test\_coroutine);

--启动"控制器管理器脚本".
CtrlManager.Init();

--获取Prompt界面的Ctrl,如果当前是“案例模式”,即执行当前的Ctrl中的Awake方法.
local ctrl = CtrlManager.GetCtrl(CtrlName.Prompt);
if ctrl ~= nil and AppConst.ExampleMode then
    ctrl:Awake();
end

warn('SimpleFramework InitOK--->>>');

end

2.控制器管理器 CtrlManager.lua 该脚本用于管理Lua 环境中所有的Ctrl 类型的脚本. 只需要根据开发需求引入对应的Ctrl 文件,并且往Init()方法中添加数据即可。

require “Common/define” –引入Define文件.
require “Controller/PromptCtrl” –引入Lua中的Ctrl脚本.
require “Controller/MessageCtrl”

CtrlManager = {};
local this = CtrlManager;
local ctrlList = {}; –控制器列表–

–控制器的初始化方法.
function CtrlManager.Init()
warn(“CtrlManager.Init—–>>>”);
–ctrlList是一个表,表里面添加元素.
–ctrlList[‘名’] = 值.最终该ctrlList中存放的是所有的Ctrl脚本的对象.
ctrlList[CtrlName.Prompt] = PromptCtrl.New();
ctrlList[CtrlName.Message] = MessageCtrl.New();
–返回当前对象.
return this;
end

–添加控制器–
function CtrlManager.AddCtrl(ctrlName, ctrlObj)
ctrlList[ctrlName] = ctrlObj;
end

–获取控制器–
function CtrlManager.GetCtrl(ctrlName)
return ctrlList[ctrlName];
end

–移除控制器–
function CtrlManager.RemoveCtrl(ctrlName)
ctrlList[ctrlName] = nil;
end

–关闭控制器–
function CtrlManager.Close()
warn(‘CtrlManager.Close—->>>’);
end

3.定义 define.lua 存放Lua 环境中的一些定义,我们只需要根据开发需求往CtrlName 表中添加数据即可。

CtrlName = {
Prompt = “PromptCtrl”,
Message = “MessageCtrl”
}

–协议类型–
ProtocalType = {
BINARY = 0,
PB_LUA = 1,
PBC = 2,
SPROTO = 3,
}
–当前使用的协议类型–
TestProtoType = ProtocalType.BINARY;

Util = SimpleFramework.Util;
AppConst = SimpleFramework.AppConst;
LuaHelper = SimpleFramework.LuaHelper;
ByteBuffer = SimpleFramework.ByteBuffer;

ResManager = LuaHelper.GetResManager();
NetManager = LuaHelper.GetNetManager();
PanelManager = LuaHelper.GetPanelManager();
MusicManager = LuaHelper.GetMusicManager();