mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
Update GameConfig
This commit is contained in:
449
Assets/TEngine/Runtime/Core/GameConfig.cs
Normal file
449
Assets/TEngine/Runtime/Core/GameConfig.cs
Normal file
@@ -0,0 +1,449 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
|
||||||
|
namespace TEngine
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public struct VersonConfig
|
||||||
|
{
|
||||||
|
public string AppVersion; //底包版本号
|
||||||
|
public string BaseResVersion; //基于底包对应的资源版本号
|
||||||
|
public string ResVersion; //资源版本号
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GameConfig
|
||||||
|
{
|
||||||
|
private static GameConfig _instance;
|
||||||
|
public const string CONFIG = "version.json";
|
||||||
|
public const string RESTALLCONFIG = "restall.txt";
|
||||||
|
public const string SUFFIX = "_Version";
|
||||||
|
private VersonConfig _versionConfig;
|
||||||
|
private Dictionary<string, string> _fileFixList = new Dictionary<string, string>();
|
||||||
|
public static GameConfig Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_instance == null)
|
||||||
|
{
|
||||||
|
_instance = new GameConfig();
|
||||||
|
_instance.InitAppVersionInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化版本信息
|
||||||
|
/// </summary>
|
||||||
|
private bool InitAppVersionInfo()
|
||||||
|
{
|
||||||
|
string configContent = string.Empty;
|
||||||
|
var externalPath = Path.Combine(FileSystem.ResourceRoot, CONFIG);
|
||||||
|
//先找外部目录,找不到再找内部目录
|
||||||
|
if (File.Exists(externalPath))
|
||||||
|
{
|
||||||
|
configContent = File.ReadAllText(externalPath);
|
||||||
|
TLogger.LogInfo($"GameConfig,{externalPath} exit,info:{configContent}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
configContent = GetInnerVersion();
|
||||||
|
//内部目录的版本配置如果没读到,返回初始化配置失败
|
||||||
|
if (configContent == string.Empty)
|
||||||
|
{
|
||||||
|
#if !UNITY_EDITOR
|
||||||
|
#if RELEASE_BUILD || _DEVELOPMENT_BUILD_
|
||||||
|
TLogger.LogError($"version config not find in InnerPath,please check it");
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(configContent))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_instance._versionConfig = JsonUtility.FromJson<VersonConfig>(configContent);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError($"configContent Conver failed,content{configContent}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//设置一下版本
|
||||||
|
SetLoadFilePath(FileSystem.ResourceRoot, ResId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//防止编辑器没有版本配置文件的情况
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
_instance._versionConfig = new VersonConfig
|
||||||
|
{
|
||||||
|
AppVersion = Application.version,
|
||||||
|
BaseResVersion = "0",
|
||||||
|
ResVersion = "0",
|
||||||
|
};
|
||||||
|
UpdateConfig();
|
||||||
|
SetLoadFilePath(FileSystem.ResourceRoot, ResId);
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
TLogger.LogError("version vonfig miss,please check it");
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取内部version.json配置
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal string GetInnerVersion()
|
||||||
|
{
|
||||||
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||||
|
var innerPath = Path.Combine(FileSystem.ResourceRootInStreamAsset, CONFIG);
|
||||||
|
#else
|
||||||
|
var innerPath = $"file://{Path.Combine(FileSystem.ResourceRootInStreamAsset, CONFIG)}";
|
||||||
|
#endif
|
||||||
|
var www = UnityWebRequest.Get(innerPath);
|
||||||
|
var request = www.SendWebRequest();
|
||||||
|
while (!request.isDone)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
var configContent = www.downloadHandler.text;
|
||||||
|
|
||||||
|
TLogger.LogInfo($"GameConfig,{innerPath} exit,info:{configContent}");
|
||||||
|
return configContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 底包版本号,设置3位
|
||||||
|
/// </summary>
|
||||||
|
internal string AppId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _versionConfig.AppVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 资源版本号,设置1位
|
||||||
|
/// </summary>
|
||||||
|
internal string ResId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _versionConfig.ResVersion;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_versionConfig.ResVersion = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//基础母包资源版本号
|
||||||
|
internal string BaseResId()
|
||||||
|
{
|
||||||
|
return _versionConfig.BaseResVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 游戏版本号,提供给外面展示使用
|
||||||
|
/// </summary>
|
||||||
|
public string GameBundleVersion
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return $"{AppId}.{ResId}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 是否重新安装
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal bool IsReinstall()
|
||||||
|
{
|
||||||
|
return File.Exists($"{FileSystem.ResourceRoot}/{RESTALLCONFIG}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置重新安装了
|
||||||
|
/// </summary>
|
||||||
|
internal void SignReInstall()
|
||||||
|
{
|
||||||
|
ReInstallFinish();
|
||||||
|
File.Create($"{FileSystem.ResourceRoot}/{RESTALLCONFIG}");
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 去掉重新安装标志文件
|
||||||
|
/// </summary>
|
||||||
|
internal void ReInstallFinish()
|
||||||
|
{
|
||||||
|
DeleteFile($"{FileSystem.ResourceRoot}/{RESTALLCONFIG}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除文件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filePath">文件路径</param>
|
||||||
|
public static void DeleteFile(string filePath)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
File.Delete(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError(e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否是首次解压
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal bool IsFirst()
|
||||||
|
{
|
||||||
|
TLogger.LogInfo("ConfigInfo:" + _versionConfig.AppVersion + "|" + _versionConfig.ResVersion);
|
||||||
|
var innerVersion = GetInnerVersion();
|
||||||
|
VersonConfig innerVersionConfig;
|
||||||
|
|
||||||
|
if (innerVersion == string.Empty)
|
||||||
|
{
|
||||||
|
//配置都找不到,就直接返回解压流程了
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
innerVersionConfig = JsonUtility.FromJson<VersonConfig>(innerVersion);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
//如果反序列化失败了,就默认返回给业务逻辑需要解压了
|
||||||
|
TLogger.LogError($"GameConfig,JsonUtility.FromJson failed,{innerVersion}");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//版本号如果不一致,就表示要解压了
|
||||||
|
if (innerVersionConfig.AppVersion != _versionConfig.AppVersion)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//如果版本号一致,就看是否解压过
|
||||||
|
var extrnalPath = Path.Combine(FileSystem.ResourceRoot, CONFIG);
|
||||||
|
return !File.Exists(extrnalPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal bool ResetVersionConfig()
|
||||||
|
{
|
||||||
|
return InitAppVersionInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写入资源版本号
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="resId"></param>
|
||||||
|
internal void WriteVersion(string resId)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(resId))
|
||||||
|
{
|
||||||
|
TLogger.LogWarning("resversion is null or empty,please check!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_versionConfig.ResVersion = resId;
|
||||||
|
UpdateConfig();
|
||||||
|
SetLoadFilePath(FileSystem.ResourceRoot, ResId);
|
||||||
|
TLogger.LogInfo("GameConfig,WriteVersion to sdk:" + GameConfig.Instance.GameBundleVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateConfig()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string path = Path.Combine(FileSystem.ResourceRoot, CONFIG);
|
||||||
|
if (!File.Exists(path))
|
||||||
|
{
|
||||||
|
MakeAllDirectory(path);
|
||||||
|
FileStream file = File.Create(path);
|
||||||
|
file.Close();
|
||||||
|
}
|
||||||
|
File.WriteAllText(path, JsonUtility.ToJson(_versionConfig));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError(e.StackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly char[] DirectorySeperators =
|
||||||
|
{
|
||||||
|
Path.DirectorySeparatorChar,
|
||||||
|
Path.AltDirectorySeparatorChar,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建文件夹
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">目标目录地址</param>
|
||||||
|
/// <param name="is_last_file"></param>
|
||||||
|
public static void MakeAllDirectory(string path, bool is_last_file = true)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (is_last_file)
|
||||||
|
{
|
||||||
|
path = Path.GetDirectoryName(path);
|
||||||
|
}
|
||||||
|
if (path == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var pathFragments = path.Split(DirectorySeperators);
|
||||||
|
if (pathFragments.Length <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
path = pathFragments[0];
|
||||||
|
if (path != string.Empty && !Directory.Exists(path))
|
||||||
|
Directory.CreateDirectory(path);
|
||||||
|
|
||||||
|
for (var i = 1; i < pathFragments.Length; i++)
|
||||||
|
{
|
||||||
|
path += Path.DirectorySeparatorChar;
|
||||||
|
|
||||||
|
string pathFragment = pathFragments[i];
|
||||||
|
if (string.IsNullOrEmpty(pathFragment))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
path += pathFragment;
|
||||||
|
if (!Directory.Exists(path))
|
||||||
|
Directory.CreateDirectory(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError(e.ToString());
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取后缀为SUFFIX的目录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal List<string> GetExitVersions(string path)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(path))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(path);
|
||||||
|
}
|
||||||
|
var dir = new DirectoryInfo(path);
|
||||||
|
var fileinfo = dir.GetFileSystemInfos();
|
||||||
|
var tmp = new List<string>();
|
||||||
|
foreach (var file in fileinfo)
|
||||||
|
{
|
||||||
|
var subName = file.Name;
|
||||||
|
if (!(file is DirectoryInfo)) continue;
|
||||||
|
|
||||||
|
if (subName.IndexOf(SUFFIX) >= 0)
|
||||||
|
{
|
||||||
|
tmp.Add(subName.Split('_')[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 检测本地是否存在了该版本
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="resVersion"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal bool CheckLocalVersion(string resVersion)
|
||||||
|
{
|
||||||
|
var versionLocal = GetExitVersions(FileSystem.ResourceRoot);
|
||||||
|
foreach (var item in versionLocal)
|
||||||
|
{
|
||||||
|
TLogger.LogInfo(item + "|" + resVersion);
|
||||||
|
if (item == resVersion)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置最新的文件路径
|
||||||
|
/// </summary>
|
||||||
|
public void SetLoadFilePath(string path, string version, bool userDlc = false)
|
||||||
|
{
|
||||||
|
var dirs = GetExitVersions(path);
|
||||||
|
|
||||||
|
dirs.Sort((a, b) => VersionToLong(b) < VersionToLong(a) ? 1 : -1);
|
||||||
|
|
||||||
|
_fileFixList.Clear();
|
||||||
|
foreach (var item in dirs)
|
||||||
|
{
|
||||||
|
if (VersionToLong(item) > VersionToLong(version))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var subFolder = $"{item}{SUFFIX}/";
|
||||||
|
var dirPath = $"{path}/{subFolder}";
|
||||||
|
var dir = new DirectoryInfo(dirPath);
|
||||||
|
var tempFile = dir.GetFileSystemInfos("*", SearchOption.AllDirectories);
|
||||||
|
foreach (var file in tempFile)
|
||||||
|
{
|
||||||
|
var subFilename = file.FullName.FixPath().Replace(subFolder, "");
|
||||||
|
subFilename = subFilename.Replace("Assets/../", "");
|
||||||
|
if (_fileFixList.ContainsKey(subFilename))
|
||||||
|
{
|
||||||
|
_fileFixList[subFilename] = file.FullName.FixPath();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_fileFixList.Add(subFilename, file.FullName.FixPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 版本号转换成long
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">版本号</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private long VersionToLong(string str)
|
||||||
|
{
|
||||||
|
return long.Parse(str.Replace(".", ""));
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 返回资源所在的最新目录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal string FilePath(string path)
|
||||||
|
{
|
||||||
|
path = path.FixPath();
|
||||||
|
#if UNITY_EDITOR_WIN
|
||||||
|
path = path.Replace("Assets/../", "");
|
||||||
|
#endif
|
||||||
|
if (_fileFixList.ContainsKey(path))
|
||||||
|
{
|
||||||
|
return _fileFixList[path];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
Assets/TEngine/Runtime/Core/GameConfig.cs.meta
Normal file
11
Assets/TEngine/Runtime/Core/GameConfig.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 87729e741a5e98543a31159acec95e3b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Binary file not shown.
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project ToolsVersion="15.0"
|
||||||
|
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
@@ -65,6 +66,12 @@
|
|||||||
<Reference Include="UnityEditor">
|
<Reference Include="UnityEditor">
|
||||||
<HintPath>UnityLib\UnityEditor.dll</HintPath>
|
<HintPath>UnityLib\UnityEditor.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.JSONSerializeModule">
|
||||||
|
<HintPath>UnityLib\UnityEngine.JSONSerializeModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityWebRequestModule">
|
||||||
|
<HintPath>UnityLib\UnityEngine.UnityWebRequestModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="System.Data" />
|
<Reference Include="System.Data" />
|
||||||
<Reference Include="System.Net.Http" />
|
<Reference Include="System.Net.Http" />
|
||||||
|
BIN
TEngineHotUpdate/UnityLib/UnityEngine.JSONSerializeModule.dll
Normal file
BIN
TEngineHotUpdate/UnityLib/UnityEngine.JSONSerializeModule.dll
Normal file
Binary file not shown.
BIN
TEngineHotUpdate/UnityLib/UnityEngine.UnityWebRequestModule.dll
Normal file
BIN
TEngineHotUpdate/UnityLib/UnityEngine.UnityWebRequestModule.dll
Normal file
Binary file not shown.
449
TEngineHotUpdate/src/TEngineCore/Core/GameConfig.cs
Normal file
449
TEngineHotUpdate/src/TEngineCore/Core/GameConfig.cs
Normal file
@@ -0,0 +1,449 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
|
||||||
|
namespace TEngineCore
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public struct VersonConfig
|
||||||
|
{
|
||||||
|
public string AppVersion; //底包版本号
|
||||||
|
public string BaseResVersion; //基于底包对应的资源版本号
|
||||||
|
public string ResVersion; //资源版本号
|
||||||
|
}
|
||||||
|
|
||||||
|
public class GameConfig
|
||||||
|
{
|
||||||
|
private static GameConfig _instance;
|
||||||
|
public const string CONFIG = "version.json";
|
||||||
|
public const string RESTALLCONFIG = "restall.txt";
|
||||||
|
public const string SUFFIX = "_Version";
|
||||||
|
private VersonConfig _versionConfig;
|
||||||
|
private Dictionary<string, string> _fileFixList = new Dictionary<string, string>();
|
||||||
|
public static GameConfig Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_instance == null)
|
||||||
|
{
|
||||||
|
_instance = new GameConfig();
|
||||||
|
_instance.InitAppVersionInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化版本信息
|
||||||
|
/// </summary>
|
||||||
|
private bool InitAppVersionInfo()
|
||||||
|
{
|
||||||
|
string configContent = string.Empty;
|
||||||
|
var externalPath = Path.Combine(FileSystem.ResourceRoot, CONFIG);
|
||||||
|
//先找外部目录,找不到再找内部目录
|
||||||
|
if (File.Exists(externalPath))
|
||||||
|
{
|
||||||
|
configContent = File.ReadAllText(externalPath);
|
||||||
|
TLogger.LogInfo($"GameConfig,{externalPath} exit,info:{configContent}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
configContent = GetInnerVersion();
|
||||||
|
//内部目录的版本配置如果没读到,返回初始化配置失败
|
||||||
|
if (configContent == string.Empty)
|
||||||
|
{
|
||||||
|
#if !UNITY_EDITOR
|
||||||
|
#if RELEASE_BUILD || _DEVELOPMENT_BUILD_
|
||||||
|
TLogger.LogError($"version config not find in InnerPath,please check it");
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(configContent))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_instance._versionConfig = JsonUtility.FromJson<VersonConfig>(configContent);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError($"configContent Conver failed,content{configContent}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//设置一下版本
|
||||||
|
SetLoadFilePath(FileSystem.ResourceRoot, ResId);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//防止编辑器没有版本配置文件的情况
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
_instance._versionConfig = new VersonConfig
|
||||||
|
{
|
||||||
|
AppVersion = Application.version,
|
||||||
|
BaseResVersion = "0",
|
||||||
|
ResVersion = "0",
|
||||||
|
};
|
||||||
|
UpdateConfig();
|
||||||
|
SetLoadFilePath(FileSystem.ResourceRoot, ResId);
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
TLogger.LogError("version vonfig miss,please check it");
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取内部version.json配置
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal string GetInnerVersion()
|
||||||
|
{
|
||||||
|
#if UNITY_ANDROID && !UNITY_EDITOR
|
||||||
|
var innerPath = Path.Combine(FileSystem.ResourceRootInStreamAsset, CONFIG);
|
||||||
|
#else
|
||||||
|
var innerPath = $"file://{Path.Combine(FileSystem.ResourceRootInStreamAsset, CONFIG)}";
|
||||||
|
#endif
|
||||||
|
var www = UnityWebRequest.Get(innerPath);
|
||||||
|
var request = www.SendWebRequest();
|
||||||
|
while (!request.isDone)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
var configContent = www.downloadHandler.text;
|
||||||
|
|
||||||
|
TLogger.LogInfo($"GameConfig,{innerPath} exit,info:{configContent}");
|
||||||
|
return configContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 底包版本号,设置3位
|
||||||
|
/// </summary>
|
||||||
|
internal string AppId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _versionConfig.AppVersion;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 资源版本号,设置1位
|
||||||
|
/// </summary>
|
||||||
|
internal string ResId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _versionConfig.ResVersion;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_versionConfig.ResVersion = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//基础母包资源版本号
|
||||||
|
internal string BaseResId()
|
||||||
|
{
|
||||||
|
return _versionConfig.BaseResVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 游戏版本号,提供给外面展示使用
|
||||||
|
/// </summary>
|
||||||
|
public string GameBundleVersion
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return $"{AppId}.{ResId}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 是否重新安装
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal bool IsReinstall()
|
||||||
|
{
|
||||||
|
return File.Exists($"{FileSystem.ResourceRoot}/{RESTALLCONFIG}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置重新安装了
|
||||||
|
/// </summary>
|
||||||
|
internal void SignReInstall()
|
||||||
|
{
|
||||||
|
ReInstallFinish();
|
||||||
|
File.Create($"{FileSystem.ResourceRoot}/{RESTALLCONFIG}");
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 去掉重新安装标志文件
|
||||||
|
/// </summary>
|
||||||
|
internal void ReInstallFinish()
|
||||||
|
{
|
||||||
|
DeleteFile($"{FileSystem.ResourceRoot}/{RESTALLCONFIG}");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 删除文件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filePath">文件路径</param>
|
||||||
|
public static void DeleteFile(string filePath)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(filePath))
|
||||||
|
{
|
||||||
|
File.Delete(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError(e.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否是首次解压
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal bool IsFirst()
|
||||||
|
{
|
||||||
|
TLogger.LogInfo("ConfigInfo:" + _versionConfig.AppVersion + "|" + _versionConfig.ResVersion);
|
||||||
|
var innerVersion = GetInnerVersion();
|
||||||
|
VersonConfig innerVersionConfig;
|
||||||
|
|
||||||
|
if (innerVersion == string.Empty)
|
||||||
|
{
|
||||||
|
//配置都找不到,就直接返回解压流程了
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
innerVersionConfig = JsonUtility.FromJson<VersonConfig>(innerVersion);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
//如果反序列化失败了,就默认返回给业务逻辑需要解压了
|
||||||
|
TLogger.LogError($"GameConfig,JsonUtility.FromJson failed,{innerVersion}");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//版本号如果不一致,就表示要解压了
|
||||||
|
if (innerVersionConfig.AppVersion != _versionConfig.AppVersion)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//如果版本号一致,就看是否解压过
|
||||||
|
var extrnalPath = Path.Combine(FileSystem.ResourceRoot, CONFIG);
|
||||||
|
return !File.Exists(extrnalPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal bool ResetVersionConfig()
|
||||||
|
{
|
||||||
|
return InitAppVersionInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 写入资源版本号
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="resId"></param>
|
||||||
|
internal void WriteVersion(string resId)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(resId))
|
||||||
|
{
|
||||||
|
TLogger.LogWarning("resversion is null or empty,please check!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_versionConfig.ResVersion = resId;
|
||||||
|
UpdateConfig();
|
||||||
|
SetLoadFilePath(FileSystem.ResourceRoot, ResId);
|
||||||
|
TLogger.LogInfo("GameConfig,WriteVersion to sdk:" + GameConfig.Instance.GameBundleVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateConfig()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string path = Path.Combine(FileSystem.ResourceRoot, CONFIG);
|
||||||
|
if (!File.Exists(path))
|
||||||
|
{
|
||||||
|
MakeAllDirectory(path);
|
||||||
|
FileStream file = File.Create(path);
|
||||||
|
file.Close();
|
||||||
|
}
|
||||||
|
File.WriteAllText(path, JsonUtility.ToJson(_versionConfig));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError(e.StackTrace);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly char[] DirectorySeperators =
|
||||||
|
{
|
||||||
|
Path.DirectorySeparatorChar,
|
||||||
|
Path.AltDirectorySeparatorChar,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建文件夹
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">目标目录地址</param>
|
||||||
|
/// <param name="is_last_file"></param>
|
||||||
|
public static void MakeAllDirectory(string path, bool is_last_file = true)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (is_last_file)
|
||||||
|
{
|
||||||
|
path = Path.GetDirectoryName(path);
|
||||||
|
}
|
||||||
|
if (path == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var pathFragments = path.Split(DirectorySeperators);
|
||||||
|
if (pathFragments.Length <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
path = pathFragments[0];
|
||||||
|
if (path != string.Empty && !Directory.Exists(path))
|
||||||
|
Directory.CreateDirectory(path);
|
||||||
|
|
||||||
|
for (var i = 1; i < pathFragments.Length; i++)
|
||||||
|
{
|
||||||
|
path += Path.DirectorySeparatorChar;
|
||||||
|
|
||||||
|
string pathFragment = pathFragments[i];
|
||||||
|
if (string.IsNullOrEmpty(pathFragment))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
path += pathFragment;
|
||||||
|
if (!Directory.Exists(path))
|
||||||
|
Directory.CreateDirectory(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
TLogger.LogError(e.ToString());
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取后缀为SUFFIX的目录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal List<string> GetExitVersions(string path)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(path))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(path);
|
||||||
|
}
|
||||||
|
var dir = new DirectoryInfo(path);
|
||||||
|
var fileinfo = dir.GetFileSystemInfos();
|
||||||
|
var tmp = new List<string>();
|
||||||
|
foreach (var file in fileinfo)
|
||||||
|
{
|
||||||
|
var subName = file.Name;
|
||||||
|
if (!(file is DirectoryInfo)) continue;
|
||||||
|
|
||||||
|
if (subName.IndexOf(SUFFIX) >= 0)
|
||||||
|
{
|
||||||
|
tmp.Add(subName.Split('_')[0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 检测本地是否存在了该版本
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="resVersion"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal bool CheckLocalVersion(string resVersion)
|
||||||
|
{
|
||||||
|
var versionLocal = GetExitVersions(FileSystem.ResourceRoot);
|
||||||
|
foreach (var item in versionLocal)
|
||||||
|
{
|
||||||
|
TLogger.LogInfo(item + "|" + resVersion);
|
||||||
|
if (item == resVersion)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置最新的文件路径
|
||||||
|
/// </summary>
|
||||||
|
public void SetLoadFilePath(string path, string version, bool userDlc = false)
|
||||||
|
{
|
||||||
|
var dirs = GetExitVersions(path);
|
||||||
|
|
||||||
|
dirs.Sort((a, b) => VersionToLong(b) < VersionToLong(a) ? 1 : -1);
|
||||||
|
|
||||||
|
_fileFixList.Clear();
|
||||||
|
foreach (var item in dirs)
|
||||||
|
{
|
||||||
|
if (VersionToLong(item) > VersionToLong(version))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var subFolder = $"{item}{SUFFIX}/";
|
||||||
|
var dirPath = $"{path}/{subFolder}";
|
||||||
|
var dir = new DirectoryInfo(dirPath);
|
||||||
|
var tempFile = dir.GetFileSystemInfos("*", SearchOption.AllDirectories);
|
||||||
|
foreach (var file in tempFile)
|
||||||
|
{
|
||||||
|
var subFilename = file.FullName.FixPath().Replace(subFolder, "");
|
||||||
|
subFilename = subFilename.Replace("Assets/../", "");
|
||||||
|
if (_fileFixList.ContainsKey(subFilename))
|
||||||
|
{
|
||||||
|
_fileFixList[subFilename] = file.FullName.FixPath();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_fileFixList.Add(subFilename, file.FullName.FixPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 版本号转换成long
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str">版本号</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private long VersionToLong(string str)
|
||||||
|
{
|
||||||
|
return long.Parse(str.Replace(".", ""));
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 返回资源所在的最新目录
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
internal string FilePath(string path)
|
||||||
|
{
|
||||||
|
path = path.FixPath();
|
||||||
|
#if UNITY_EDITOR_WIN
|
||||||
|
path = path.Replace("Assets/../", "");
|
||||||
|
#endif
|
||||||
|
if (_fileFixList.ContainsKey(path))
|
||||||
|
{
|
||||||
|
return _fileFixList[path];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user