一.框架配置文件

1.AppConst 文件 在SimpleFramework 这个框架项目中,有一个配置文件AppConst.cs, 该文件所在位置是:Scripts/ConstDefine/AppConst.cs。 在这个文件中配置了很多项目开发过程中,需要使用到的“公共常量信息”。 简单分析: 字段用“const”关键字修饰,方法用“static”关键字修饰,该脚本内所有的字段,方法,在外部脚本都可以使用“类名.xxxx”进行访问使用。 作用和价值: 该脚本的作用类似于“总控制台”,通过改变该脚本内的信息,就可以改变项目的一些核心状态。 AppConst.cs:

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 = false;                       //更新模式-默认关闭 
    public const bool AutoWrapMode = true;                      //自动添加Wrap模式

    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 int TimerInterval = 1;
    public const int GameFrameRate = 30;                       //游戏帧频

    public const string AppName = "SimpleFramework";           //应用程序名称
    public const string AppPrefix = AppName + "\_";             //应用程序前缀
    public const string WebUrl = "http://localhost:6688/";      //测试更新地址

    public static string UserId = string.Empty;                 //用户ID
    public static int SocketPort = 0;                           //Socket服务器端口
    public static string SocketAddress = string.Empty;          //Socket服务器地址

    public static string LuaBasePath {
        get { return Application.dataPath + "/uLua/Source/"; }
    }

    public static string LuaWrapPath {
        get { return LuaBasePath + "LuaWrap/"; }
    }
}

}

二.AssetBundle 文件

1.AB 打包命令 Game 菜单以及菜单下的子命令是通过uLua\Editor\Packager.cs 编辑器扩展脚本实现的。 2.框架案例AB 包 在我们执行完毕AB 打包命令后,在StreamingAssets 文件夹下,会出现3个后缀为“.assetbundle”的AB 包,这三个包就是Examples 示例工程需要使用到的AB 包。 [

](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112207-300x223.png)
](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112207-300x223.png)
演示: 将AppConst 脚本中的ExampleMode 修改为false,就不会再生成示例工程的AB 资源。

public class AppConst {
public const bool DebugMode = true; //调试模式-用于内部测试

/// <summary>
/// 如果想删掉框架自带的例子,那这个例子模式必须要
/// 关闭,否则会出现一些错误。
/// </summary>
public const bool ExampleMode = false;                       //例子模式

如图所示:[

](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112208-300x229.png)
](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112208-300x229.png)
3.生成自己的AB 包 将项目资源中的某个预制体设置Asset Labels 信息,然后使用Game 菜单下的命令打包成AB 资源。 你会发现我们自己的AssetBundle 文件无法打包成功。 需要分析Packager.cs 编辑器扩展脚本文件,Packager.cs原代码(部分):

\[MenuItem("Game/Build Windows Resource", false, 13)\]
public static void BuildWindowsResource() {
    BuildAssetResource(BuildTarget.StandaloneWindows, true);
}

/// <summary>
/// 生成绑定素材
/// </summary>
public static void BuildAssetResource(BuildTarget target, bool isWin) {
    if (AppConst.ExampleMode) {
        HandleExampleBundle(target);
    }
    HandleLuaFile(isWin);
    AssetDatabase.Refresh();
}

分析结果如下: ①示例工程中的资源并没有手动指定AssetLabels 信息,而是在编辑器扩展脚本内,使用代码的方式,动态指定AssetLabels 信息,然后一个资源一个资源 单独打包成AB 包; ②如果想实现能打包我们自己的AssetBundle 资源,需要对该脚本进行修改。需要对AppConst.ExampleMode 为假的情况进行代码处理: 让脚本可以打包项目中所有指定了AssetLabels 信息的游戏物体为AB 包。 演示: 新建一个Sphere物体,设置AssetBundle文件名和后缀 [

](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112209-300x120.png)
](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112209-300x120.png)
Packager.cs改造后的代码:

\[MenuItem("Game/Build Windows Resource", false, 13)\]
public static void BuildWindowsResource() {
    BuildAssetResource(BuildTarget.StandaloneWindows, true);
}

/// <summary>
/// 生成绑定素材
/// </summary>
public static void BuildAssetResource(BuildTarget target, bool isWin) {
    if (AppConst.ExampleMode) {
        HandleExampleBundle(target);
    }
    else
    {
        BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.None, target);
    }
    HandleLuaFile(isWin);
    AssetDatabase.Refresh();
}

结果如下,成功生成Sphere的AB包 [

](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112210-300x184.png)
](http://www.wjgbaby.com/wp-content/uploads/2017/11/17112210-300x184.png)
4.可能出现的Bug 在打包AssetBundle 资源时,可能出现LuaWrap 文件夹下的脚本文件报错的情况,解决方法步骤如下:**先清空LuaWrap 文件,然后生成AB 资源,最后再重新生成LuaWrap 文件。**

三.Lua 和files 文件

1.Lua 文件夹 StreamingAssets 下的lua 文件夹内的代码在打包AB 资源的时候,一块复制过来的。在ULua 热更新环境下,lua 文件不会被打包成AB 资源,而是直接从服务器端下载.lua 原生文件到本地。 2.files.txt 文件 在StreamingAssets 文件夹下有一个叫做files.txt 的文本文件,这个文件叫做:热更新清单文件。 作用类似于AssetBundle 原生的“目录manifest 文件”。 files 文件内包含AB 包和Lua 文件的路径信息,以及用于校验的MD5 值。 因为ULua 环境下,lua 脚本不会打包成ab 包,也就意味着lua 脚本文件的信息不会出现在“目录manifest 文件”中,但是我们热更新的时候又需要知道更新哪些lua 文件,所以说出现了这个files.txt 热更新清单文件。