一.框架配置文件
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 包。 [ 演示: 将AppConst 脚本中的ExampleMode 修改为false,就不会再生成示例工程的AB 资源。
public class AppConst {
public const bool DebugMode = true; //调试模式-用于内部测试
/// <summary>
/// 如果想删掉框架自带的例子,那这个例子模式必须要
/// 关闭,否则会出现一些错误。
/// </summary>
public const bool ExampleMode = false; //例子模式
如图所示:[ 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文件名和后缀 [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包 [ 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 热更新清单文件。