提交 fb17fbbd 编写于 作者: timchen1002's avatar timchen1002

update

上级

要显示的变更太多。

To preserve performance only 1000 of 1000+ files are displayed.
{
"version": "0.2.0",
"configurations": [
{
"type": "lua",
"request": "launch",
"tag": "normal",
"name": "LuaPanda",
"description": "通用模式,通常调试项目请选择此模式 | launchVer:3.2.0",
"cwd": "${workspaceFolder}",
"luaFileExtension": "",
"connectionPort": 8818,
"stopOnEntry": true,
"useCHook": true,
"autoPathMode": true
},
{
"type": "lua",
"request": "launch",
"tag": "independent_file",
"name": "LuaPanda-IndependentFile",
"description": "独立文件调试模式,使用前请参考文档",
"luaPath": "",
"packagePath": [],
"luaFileExtension": "",
"connectionPort": 8820,
"stopOnEntry": true,
"useCHook": true
}
]
}
\ No newline at end of file
{
"files.exclude":
{
"**/.DS_Store":true,
"**/.git":true,
"**/.gitignore":true,
"**/.gitmodules":true,
"**/*.booproj":true,
"**/*.pidb":true,
"**/*.suo":true,
"**/*.user":true,
"**/*.userprefs":true,
"**/*.unityproj":true,
"**/*.dll":true,
"**/*.exe":true,
"**/*.pdf":true,
"**/*.mid":true,
"**/*.midi":true,
"**/*.wav":true,
"**/*.gif":true,
"**/*.ico":true,
"**/*.jpg":true,
"**/*.jpeg":true,
"**/*.png":true,
"**/*.psd":true,
"**/*.tga":true,
"**/*.tif":true,
"**/*.tiff":true,
"**/*.3ds":true,
"**/*.3DS":true,
"**/*.fbx":true,
"**/*.FBX":true,
"**/*.lxo":true,
"**/*.LXO":true,
"**/*.ma":true,
"**/*.MA":true,
"**/*.obj":true,
"**/*.OBJ":true,
"**/*.asset":true,
"**/*.cubemap":true,
"**/*.flare":true,
"**/*.mat":true,
"**/*.meta":true,
"**/*.prefab":true,
"**/*.unity":true,
"build/":true,
"Build/":true,
"Library/":true,
"library/":true,
"obj/":true,
"Obj/":true,
"ProjectSettings/":true,
"temp/":true,
"Temp/":true
}
}
\ No newline at end of file
此差异已折叠。
此差异已折叠。
fileFormatVersion: 2
guid: c82e12e99cbed1f4e902a89ed3daf438
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: a7203283c25a93a4fb2412f79f76f275
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class BuildApp : EditorWindow
{
private VersionGUI mVersionGUI;
[MenuItem("Build/打包App")]
public static void ShowWindow()
{
var win = GetWindow<BuildApp>();
win.Show();
}
private void Awake()
{
mVersionGUI = new VersionGUI();
mVersionGUI.Awake();
}
private void OnGUI()
{
mVersionGUI.DrawVersion();
DoBuildApp();
}
private void DoBuildApp()
{
if (GUILayout.Button("Build AssetBundles"))
{
// 生成原始lua全量文件的md5
BuildUtils.GenOriginalLuaFrameworkMD5File();
GameLogger.Log("GenLuaFrameworkMd5 Done");
// 打assetbundle
string targetPath = Application.streamingAssetsPath + "/res";
BuildUtils.BuildLuaBundle(targetPath);
BuildUtils.BuildNormalCfgBundle(targetPath);
BuildUtils.BuildGameResBundle(targetPath);
GameLogger.Log("BuildAssetBundle Done");
}
if (GUILayout.Button("Build App"))
{
// 生成原始lua全量文件的md5
BuildUtils.GenOriginalLuaFrameworkMD5File();
GameLogger.Log("GenLuaFrameworkMd5 Done");
// 打assetbundle
string targetPath = Application.streamingAssetsPath + "/res";
BuildUtils.BuildLuaBundle(targetPath);
BuildUtils.BuildNormalCfgBundle(targetPath);
BuildUtils.BuildGameResBundle(targetPath);
GameLogger.Log("BuildAssetBundle Done");
// 打包app
BuildUtils.BuildApp();
GameLogger.Log("Build App Done");
}
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 9a83659abad55f3408cac09632c71c44
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using System.IO;
using System.Collections;
using System.Collections.Generic;
using LitJson;
using UnityEditor;
using UnityEngine;
using Ionic.Zip;
public class BuildUpdateUtils
{
public static void BuildLuaUpdateBundle(string zipDir, string luaFrameworkFilesVersion)
{
var needUpdateLuaFiles = GetNeedUpdateLuaList(luaFrameworkFilesVersion);
GameLogger.Log("needUpdateFluaFiles.Count = " + needUpdateLuaFiles.Count);
var luaBundleDir = BuildUtils.CreateTmpDir("luabundle");
BuildUtils.CopyLuaToBuildDir(needUpdateLuaFiles, luaBundleDir);
// 打包AssetBundle
Hashtable tab = new Hashtable();
tab["lua_update.bundle"] = "luabundle";
AssetBundleBuild[] buildArray = BuildUtils.MakeAssetBundleBuildArray(tab);
BuildUtils.BuildBundles(buildArray, zipDir);
BuildUtils.DeleteDir(luaBundleDir);
AssetDatabase.Refresh();
}
public static bool BuildObjBundle(string zipDir, List<UnityEngine.Object> objList)
{
if (0 == objList.Count) return false;
AssetBundleBuild[] bundleBuilds = new AssetBundleBuild[objList.Count];
bool contionsObj = false;
for (int i = 0; i < objList.Count; i++)
{
var obj = objList[i];
if (null == obj) continue;
var assetPath = AssetDatabase.GetAssetPath(obj);
var fileName = Path.GetFileName(assetPath);
bundleBuilds[i].assetBundleName = fileName;
bundleBuilds[i].assetNames = new string[] { assetPath };
contionsObj = true;
}
BuildUtils.BuildBundles(bundleBuilds, zipDir);
return contionsObj;
}
public static void ZipUpdateDir(string zipDir, bool contionsObj)
{
var zipFilePath = BuildUtils.BIN_PATH + "/" + (contionsObj ? "res_" : "script_") + VersionMgr.instance.resVersion + ".zip";
if (File.Exists(zipFilePath))
{
File.Delete(zipFilePath);
}
ZipFile zipFile = new ZipFile();
var fs = Directory.GetFiles(zipDir);
foreach (var f in fs)
{
if (f.EndsWith("meta") || f.EndsWith("*.manifest"))
{
continue;
}
zipFile.AddFile(f, "");
}
zipFile.Save(zipFilePath);
zipFile.Dispose();
}
/// <summary>
/// 获取需要更新的Lua列表
/// </summary>
/// <returns></returns>
public static List<string> GetNeedUpdateLuaList(string luaFrameworkFilesVersion)
{
var localLuaMD5 = BuildUtils.GetOriginalLuaframeworkMD5Json();
var originalLuaMD5FilePath = BuildUtils.BIN_PATH + "/LuaFrameworkFiles_" + luaFrameworkFilesVersion + ".json";
var originalLuaMD5File = File.OpenRead(originalLuaMD5FilePath);
StreamReader sr = new StreamReader(originalLuaMD5File);
var jsonStr = sr.ReadToEnd();
sr.Close();
var originalLuaMD5 = JsonMapper.ToObject(jsonStr);
List<string> needUpdateLuaFiles = new List<string>();
// 对比MD5值,不同的需要更新
foreach (var key in localLuaMD5.Keys)
{
if (!originalLuaMD5.ContainsKey(key) || originalLuaMD5[key].ToString() != localLuaMD5[key].ToString())
{
needUpdateLuaFiles.Add(key);
}
}
return needUpdateLuaFiles;
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 7b87c13e52583914caa28bf790133c63
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEditor;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class BuildUpdateZip : EditorWindow
{
private VersionGUI mVersionGUI;
private string mLuaFrameworkFilesVersion;
private List<UnityEngine.Object> mObjList = new List<UnityEngine.Object>();
private Vector2 mScrollViewPos;
[MenuItem("Build/打热更包")]
public static void ShowWindow()
{
var win = GetWindow<BuildUpdateZip>();
win.Show();
}
private void Awake()
{
mVersionGUI = new VersionGUI();
mVersionGUI.Awake();
mLuaFrameworkFilesVersion = BuildUtils.TryGetLuaFrameworkFilesVersion();
}
private void OnGUI()
{
mVersionGUI.DrawVersion();
DoBuildUpdateZip();
}
private void DoBuildUpdateZip()
{
GUILayout.BeginHorizontal();
GUILayout.Label("LuaFrameworkFiles.json");
mLuaFrameworkFilesVersion = EditorGUILayout.TextField(mLuaFrameworkFilesVersion);
GUILayout.EndHorizontal();
if (GUILayout.Button("打热更包"))
{
var zipDir = BuildUtils.CreateTmpDir("updateZip");
BuildUtils.BuildNormalCfgBundle(zipDir);
BuildUpdateUtils.BuildLuaUpdateBundle(zipDir, mLuaFrameworkFilesVersion);
var contionsObj = BuildUpdateUtils.BuildObjBundle(zipDir, mObjList);
BuildUpdateUtils.ZipUpdateDir(zipDir, contionsObj);
BuildUtils.DeleteDir(zipDir);
AssetDatabase.Refresh();
}
DrawObjList();
}
private void DrawObjList()
{
mScrollViewPos = GUILayout.BeginScrollView(mScrollViewPos);
if (GUILayout.Button("+"))
{
mObjList.Add(null);
}
for (int i = 0; i < mObjList.Count; ++i)
{
GUILayout.BeginHorizontal();
mObjList[i] = EditorGUILayout.ObjectField(mObjList[i], typeof(UnityEngine.Object), false);
if (GUILayout.Button("-"))
{
mObjList.RemoveAt(i);
break;
}
GUILayout.EndHorizontal();
}
GUILayout.EndScrollView();
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: ccdc366a478e05d45bb7591b4bad36f1
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using LitJson;
using System.Text.RegularExpressions;
public class BuildUtils
{
/// <summary>
/// 递归遍历获取目标目录中的所有文件
/// </summary>
/// <param name="sourceDir">目标目录</param>
/// <param name="splitAssetPath">是否要切割目录,以assets目录为根</param>
/// <returns></returns>
public static List<string> GetFiles(string sourceDir, bool splitAssetPath)
{
List<string> fileList = new List<string>();
string[] fs = Directory.GetFiles(sourceDir);
string[] ds = Directory.GetDirectories(sourceDir);
for (int i = 0; i < fs.Length; i++)
{
var index = splitAssetPath ? fs[i].IndexOf("Assets") : 0;
fileList.Add(fs[i].Substring(index));
}
for (int i = 0; i < ds.Length; i++)
{
fileList.AddRange(GetFiles(ds[i], splitAssetPath));
}
return fileList;
}
/// <summary>
/// 递归遍历获取目标目录中的所有文件
/// </summary>
/// <param name="sourceDirs">目标目录数组</param>
/// <param name="splitAssetPath">是否要切割目录,以assets目录为根</param>
/// <returns></returns>
public static List<string> GetFiles(string[] sourceDirs, bool splitAssetPath)
{
List<string> fileList = new List<string>();
foreach (var sourceDir in sourceDirs)
{
fileList.AddRange(GetFiles(sourceDir, splitAssetPath));
}
return fileList;
}
/// <summary>
/// 根据哈希表构建AssetBundleBuild列表
/// </summary>
/// <param name="tab">哈希表,key为AssetBundleName,value为路径</param>
/// <returns></returns>
public static AssetBundleBuild[] MakeAssetBundleBuildArray(Hashtable tab)
{
AssetBundleBuild[] buildArray = new AssetBundleBuild[tab.Count];
int index = 0;
foreach (string key in tab.Keys)
{
buildArray[index].assetBundleName = key;
List<string> fileList = new List<string>();
fileList = GetFiles(Application.dataPath + "/" + tab[key], true);
buildArray[index].assetNames = fileList.ToArray();
++index;
}
return buildArray;
}
/// <summary>
/// 打包常规配置表AssetBundle
/// </summary>
/// <param name="targetPath">目标路径</param>
public static void BuildNormalCfgBundle(string targetPath)
{
Hashtable tab = new Hashtable();
tab["normalcfg.bundle"] = "GameRes/Config";
AssetBundleBuild[] buildArray = BuildUtils.MakeAssetBundleBuildArray(tab);
BuildBundles(buildArray, targetPath);
}
/// <summary>
/// 打包Lua的AssetBundle
/// </summary>
/// <param name="targetPath">目标路径</param>
public static void BuildLuaBundle(string targetPath)
{
// 创建lua的Bundle临时目录
var luaBundleDir = CreateTmpDir("luabundle");
// 将Lua代码拷贝到Bundle临时目录(加密处理)
var luaFiles = GetFiles(new string[] {
Application.dataPath + "/LuaFramework/Lua",
Application.dataPath + "/LuaFramework/ToLua/Lua",
}, true);
BuildUtils.CopyLuaToBuildDir(luaFiles, luaBundleDir);
// 构建AssetBundleBuild列表
Hashtable tab = new Hashtable();
tab["lua.bundle"] = "luabundle";
AssetBundleBuild[] buildArray = MakeAssetBundleBuildArray(tab);
// 打包AssetBundle
BuildBundles(buildArray, targetPath);
// 删除Lua的AssetBundle临时目录
DeleteDir(luaBundleDir);
AssetDatabase.Refresh();
}
public static void BuildGameResBundle(string targetPath)
{
Hashtable tab = new Hashtable();
tab["baseres.bundle"] = "GameRes/BaseRes";
tab["uiprefabs.bundle"] = "GameRes/UIPrefabs";
AssetBundleBuild[] buildArray = MakeAssetBundleBuildArray(tab);
BuildBundles(buildArray, targetPath);
}
/// <summary>
/// 打AssetBundle
/// </summary>
/// <param name="buildArray">AssetBundleBuild列表</param>
/// <param name="targetPath">目标目录</param>
public static void BuildBundles(AssetBundleBuild[] buildArray, string targetPath)
{
if (!Directory.Exists(targetPath))
{
Directory.CreateDirectory(targetPath);
}
BuildPipeline.BuildAssetBundles(targetPath, buildArray, BuildAssetBundleOptions.ChunkBasedCompression, GetBuildTarget());
}
/// <summary>
/// app打包
/// </summary>
public static void BuildApp()
{
// 场景
string[] scenes = new string[] { "Assets/Scenes/Main.unity"};
// 文件名
string appName = PlayerSettings.productName + "_" + VersionMgr.instance.appVersion + GetTargetPlatfromAppPostfix();
// 输出目录
string outputPath = Application.dataPath + "/../Bin/";
if (!Directory.Exists(outputPath))
{
Directory.CreateDirectory(outputPath);
}
// 包体完整路径
string appPath = Path.Combine(outputPath, appName);
BuildPipeline.BuildPlayer(scenes, appPath, GetBuildTarget(), BuildOptions.None);
}
/// <summary>
/// 生成原始Lua代码的md5
/// </summary>
public static void GenOriginalLuaFrameworkMD5File()
{
VersionMgr.instance.Init();
JsonData jsonData = GetOriginalLuaframeworkMD5Json();
var jsonStr = JsonMapper.ToJson(jsonData);
jsonStr = jsonStr.Replace(",", ",\n");
if (!Directory.Exists(BIN_PATH))
{
Directory.CreateDirectory(BIN_PATH);
}
using (StreamWriter sw = new StreamWriter(BIN_PATH + "LuaFrameworkFiles_" + VersionMgr.instance.appVersion + ".json"))
{
sw.Write(jsonStr);
}
}
/// <summary>
/// 获取原始lua代码md5json
/// </summary>
/// <returns></returns>
public static JsonData GetOriginalLuaframeworkMD5Json()
{
var sourceDirs = new string[] {
Application.dataPath + "/LuaFramework/Lua",
Application.dataPath + "/LuaFramework/ToLua/Lua",
};
JsonData jsonData = new JsonData();
foreach (var sourceDir in sourceDirs)
{
List<string> fileList = new List<string>();
fileList = GetFiles(sourceDir, false);
foreach (var luaFile in fileList)
{
if (!luaFile.EndsWith(".lua")) continue;
var md5 = LuaFramework.Util.md5file(luaFile);
var key = luaFile.Substring(luaFile.IndexOf("Assets/"));
jsonData[key] = md5;
}
}
return jsonData;
}
/// <summary>
/// 尝试获取Lua代码版本
/// </summary>
/// <returns></returns>
public static string TryGetLuaFrameworkFilesVersion()
{
if (!Directory.Exists(BuildUtils.BIN_PATH))
return null;
var fs = Directory.GetFiles(BuildUtils.BIN_PATH);
foreach (var f in fs)
{
if (f.Contains("LuaFrameworkFiles_"));
{
var result = Regex.Match(f, ".*LuaFrameworkFiles_(.*).json");
if (null != result)
{
return result.Groups[1].Value;
}
}
}
return null;
}
/// <summary>
/// 创建临时目录
/// </summary>
/// <param name="dirName">目录名称</param>
/// <returns></returns>
public static string CreateTmpDir(string dirName)
{
var tmpDir = string.Format(Application.dataPath + "/{0}/", dirName);
if (Directory.Exists(tmpDir))
{
Directory.Delete(tmpDir, true);
}
Directory.CreateDirectory(tmpDir);
return tmpDir;
}
/// <summary>
/// 删除目录
/// </summary>
/// <param name="targetDir">目标目录</param>
public static void DeleteDir(string targetDir)
{
if (Directory.Exists(targetDir))
{
Directory.Delete(targetDir, true);
}
AssetDatabase.Refresh();
}
/// <summary>
/// 拷贝Lua到目标目录,并做加密处理
/// </summary>
/// <param name="luaFiles">源目录列表</param>
/// <param name="luaBundleDir">母包目录</param>
public static void CopyLuaToBuildDir(List<string> luaFiles, string luaBundleDir)
{
foreach (var luaFile in luaFiles)
{
if (luaFile.EndsWith(".meta")) continue;
var luaFileFullPath = Application.dataPath + "/../" + luaFile;
// 由于BuildAssetBundle不识别.lua文件,所以拷贝一份到临时目录,统一加上.bytes结尾
var targetFile = luaFile.Replace("Assets/LuaFramework/Lua", "");
targetFile = targetFile.Replace("Assets/LuaFramework/ToLua/Lua", "");
targetFile = luaBundleDir + targetFile + ".bytes";
var targetDir = Path.GetDirectoryName(targetFile);
if (!Directory.Exists(targetDir))
{
Directory.CreateDirectory(targetDir);
}
// 加密处理
byte[] bytes = File.ReadAllBytes(luaFileFullPath);
byte[] encrypBytes = AESEncrypt.Encrypt(bytes);
File.WriteAllBytes(targetFile, encrypBytes);
}
AssetDatabase.Refresh();
}
/// <summary>
/// 获取当前平台
/// </summary>
/// <returns></returns>
public static BuildTarget GetBuildTarget()
{
#if UNITY_STANDALONE
return BuildTarget.StandaloneWindows;
#elif UNITY_ANDROID
return BuildTarget.Android;
#else
return BuildTarget.iOS;
#endif
}
/// <summary>
/// 获取目标平台app后缀
/// </summary>
/// <param name="usAAB">是否使用aab打包</param>
/// <returns></returns>
public static string GetTargetPlatfromAppPostfix(bool usAAB = false)
{
#if UNITY_STANDALONE
return ".exe";
#elif UNITY_ANDROID
if (usAAB)
{
return ".aab";
}
else
{
return ".apk";
}
#else
return ".ipa";
#endif
}
public static string BIN_PATH
{
get { return Application.dataPath + "/../Bin/"; }
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 182d4abf410059640b6251f3c2e28488
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEditor;
using LitJson;
using System.IO;
public class VersionGUI
{
private string mAppVersion;
private string mResVersion;
public void Awake()
{
VersionMgr.instance.Init();
mAppVersion = VersionMgr.instance.appVersion;
mResVersion = VersionMgr.instance.resVersion;
}
public void DrawVersion()
{
GUILayout.BeginHorizontal();
mAppVersion = EditorGUILayout.TextField("app_version", mAppVersion);
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
mResVersion = EditorGUILayout.TextField("res_version", mResVersion);
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
JsonData jsonData = new JsonData();
jsonData["app_version"] = mAppVersion;
jsonData["res_version"] = mResVersion;
if (GUILayout.Button("Save Version"))
{
using (StreamWriter sw = new StreamWriter(Application.dataPath + "/Resources/version.bytes"))
{
sw.Write(jsonData.ToJson());
}
AssetDatabase.Refresh();
GameLogger.Log("Save version OK, app_version = " + mAppVersion + ", res_version = " + mResVersion);
VersionMgr.instance.DeleteCacheResVersion();
VersionMgr.instance.Init();
}
GUILayout.EndHorizontal();
}
}
\ No newline at end of file
fileFormatVersion: 2
guid: 40d6c1e22ba1b22489f8b862b302b1da
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 6ce69a05436d282419ee413ea9e516e1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
using UnityEngine;
using UnityEditor;
public class PlayerPrefsTools
{
[MenuItem("Tools/ClearCache")]
private static void ClearCache()
{
PlayerPrefs.DeleteAll();
}
}
fileFormatVersion: 2
guid: bf9845f3501f900418c8da6321898dcd
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 22ea9f662ddfb5044a7a5c45cf28bda1
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: b121129f3c49c74438d3500e29ed5356
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
此差异已折叠。
fileFormatVersion: 2
guid: dc7f7f0b14777ec4f87cbb5a40d644a7
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 4cf7bc58f25ad4d45984a7e39a57e3c0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
[
{ "id":1, "editor_path":"UIPrefabs/LoginPanel.prefab", "desc":"登录界面" },
{ "id":2, "editor_path":"UIPrefabs/PlazaPanel.prefab", "desc":"大厅界面" },
{ "id":3, "editor_path":"UIPrefabs/TipsFly.prefab", "desc":"提示语" }
]
\ No newline at end of file
fileFormatVersion: 2
guid: 905542cec90faf749af8720311a9a36b
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 98ed8ce323a50c8449efa82d29ca7007
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
此差异已折叠。
fileFormatVersion: 2
guid: a36dfe0665b06564c85d89874d8bdb0e
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
此差异已折叠。
fileFormatVersion: 2
guid: a76efc0193422e94a8c7ccd522fad8d5
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
此差异已折叠。
fileFormatVersion: 2
guid: 35d8e092974551b4e9625de602bb6531
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: bd6788b6e9fe60f4b96c7a05e67a0084
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: 6e0bd67d664a3c7418742db812cb3644
folderAsset: yes
timeCreated: 1453125768
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
fileFormatVersion: 2
guid: a57bd8213452ba24ab5b93cc9d62fb15
folderAsset: yes
timeCreated: 1453127194
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:
此差异已折叠。
fileFormatVersion: 2
guid: 86bf33513bdd8324985f8712180692d9
timeCreated: 1457265758
licenseType: Pro
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册