升级HybridCLR 1.1.20

升级HybridCLR 1.1.20
This commit is contained in:
ALEXTANG
2023-02-10 12:06:15 +08:00
parent f1bd8e4a5f
commit 1edbfcc086
75 changed files with 1683 additions and 404 deletions

5
.gitignore vendored
View File

@@ -88,3 +88,8 @@ TEngineHotUpdate/obj
[Aa]ssets/StreamingAssets/
[Aa]ssets/StreamingAssets.meta
Assets/HybridCLRBuildCache/AssetBundleOutput.meta
Assets/HybridCLRBuildCache/AssetBundleOutput/StandaloneWindows.meta
Assets/HybridCLRBuildCache.meta
Assets/HybridCLRBuildCache/AssetBundleSourceData.meta
Assets/HybridCLRBuildCache/AssetBundleSourceData/StandaloneWindows.meta

View File

@@ -1,15 +0,0 @@
namespace TEngine.Runtime
{
/// <summary>
/// 流程加载器 - 开始起点
/// </summary>
public class ProcedureLaunch : ProcedureBase
{
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
ChangeState<ProcedureSplash>(procedureOwner);
}
}
}

View File

@@ -1,6 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using TEngine.Runtime;
using UnityEngine;
namespace HotFix
{
@@ -8,10 +9,14 @@ namespace HotFix
{
public static void Start()
{
Log.Debug("HotFix.GameHotfixEntry");
Log.Fatal("HotFix.GameHotfixEntry");
Log.Fatal("=======看到此条日志代表你成功运行了示例项目的热更新代码=======");
MonoUtility.AddUpdateListener(Update);
TResources.Load<GameObject>("Test/Cube.prefab");
}
void Update()
private static void Update()
{
}

View File

@@ -1,7 +1,9 @@
{
"name": "HotFix",
"rootNamespace": "",
"references": [
"GUID:f4ecd6f7bd8993043b6cec60dd0cf2b2"
"GUID:f4ecd6f7bd8993043b6cec60dd0cf2b2",
"GUID:13ba8ce62aa80c74598530029cb2d649"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2e3556191f5868b45bdae236bf486400
guid: c9e0380f60537b945a1ccc67178ee9db
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 87b670c48f0b7184bbcdbab5636fecce
guid: cb299b00a09f18a41bdefef8358a1958
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@@ -43,7 +43,7 @@ RenderSettings:
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 11
serializedVersion: 12
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
@@ -98,7 +98,7 @@ LightmapSettings:
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 1
m_LightingSettings: {fileID: 791812208}
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
@@ -118,6 +118,8 @@ NavMeshSettings:
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
maxJobWorkers: 0
preserveTilesOutsideBounds: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
@@ -204,49 +206,67 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1510960682
GameObject:
--- !u!850595691 &791812208
LightingSettings:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1510960683}
- component: {fileID: 1510960684}
m_Layer: 0
m_Name: DemoMain
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1510960683
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1510960682}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1510960684
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1510960682}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c07e500655d56ee4eb74a247e284c1d6, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name: Settings.lighting
serializedVersion: 3
m_GIWorkflowMode: 1
m_EnableBakedLightmaps: 0
m_EnableRealtimeLightmaps: 0
m_RealtimeEnvironmentLighting: 1
m_BounceScale: 1
m_AlbedoBoost: 1
m_IndirectOutputScale: 1
m_UsingShadowmask: 1
m_BakeBackend: 0
m_LightmapMaxSize: 1024
m_BakeResolution: 40
m_Padding: 2
m_TextureCompression: 1
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAO: 0
m_MixedBakeMode: 2
m_LightmapsBakeMode: 1
m_FilterMode: 1
m_LightmapParameters: {fileID: 15204, guid: 0000000000000000f000000000000000, type: 0}
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_RealtimeResolution: 2
m_ForceWhiteAlbedo: 0
m_ForceUpdates: 0
m_FinalGather: 0
m_FinalGatherRayCount: 256
m_FinalGatherFiltering: 1
m_PVRCulling: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500
m_PVREnvironmentSampleCount: 500
m_PVREnvironmentReferencePointCount: 2048
m_LightProbeSampleCountMultiplier: 4
m_PVRBounces: 2
m_PVRMinBounces: 2
m_PVREnvironmentMIS: 0
m_PVRFilteringMode: 2
m_PVRDenoiserTypeDirect: 0
m_PVRDenoiserTypeIndirect: 0
m_PVRDenoiserTypeAO: 0
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
--- !u!1001 &1556424202
PrefabInstance:
m_ObjectHideFlags: 0
@@ -262,11 +282,21 @@ PrefabInstance:
propertyPath: m_EntityGroupHelperTypeName
value: TEngine.Runtime.Entity.DefaultEntityGroupHelper
objectReference: {fileID: 0}
- target: {fileID: 3463045026010536330, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: ResourceMode
value: 2
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535776, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_Name
value: TEngine
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535779, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_RootOrder
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535779, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_LocalPosition.x
@@ -282,6 +312,11 @@ PrefabInstance:
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535779, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535779, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_LocalRotation.x
@@ -297,16 +332,6 @@ PrefabInstance:
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535779, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535779, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_RootOrder
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3463045026180535779, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
@@ -322,5 +347,15 @@ PrefabInstance:
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 3463045026377943191, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_EntranceProcedureTypeName
value: TEngine.Runtime.ProcedureLaunch
objectReference: {fileID: 0}
- target: {fileID: 3463045026377943191, guid: 161ff7c8132079c4a95e2e4e70ddd41b,
type: 3}
propertyPath: m_AvailableProcedureTypeNames.Array.size
value: 8
objectReference: {fileID: 0}
m_RemovedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 161ff7c8132079c4a95e2e4e70ddd41b, type: 3}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 2cda990e2423bbf4892e6590ba056729
guid: 07f693cf49a00634fbc050b96052bebd
DefaultImporter:
externalObjects: {}
userData:

View File

@@ -72,7 +72,7 @@ namespace TEngineCore.Editor
/// <summary>
/// 文件过滤
/// </summary>
private string[] fileExcludeFilter = new[] { ".cs", ".meta", ".dll", ".DS_Store", ".unity" };
private string[] fileExcludeFilter = new[] { ".cs", ".meta", ".dll", ".DS_Store"/*, ".unity" */};
/// <summary>
/// 资源环信息初始化

View File

@@ -1,11 +1,13 @@
using System;
using System.IO;
using TEngine;
using TEngine.Editor;
using TEngine.Runtime;
using UnityEditor;
using UnityEngine;
using UnityEngine.Serialization;
using Object = UnityEngine.Object;
using Type = System.Type;
namespace TEngineCore.Editor
{
@@ -222,7 +224,7 @@ namespace TEngineCore.Editor
#endregion
#region
[BuilderEditor("Copy And Encrpt DLL", ContentType.Button, ",CB:CopyDLL,FlowA:disPlayType:1")]
[BuilderEditor("Generate DLL", ContentType.Button, ",CB:GenerateDLL,FlowA:disPlayType:1")]
private int copydll;
[BuilderEditor("Build AssetBundle", ContentType.Button, ",CB:BuildAssetBundle,FlowA:disPlayType:1")]
@@ -649,6 +651,24 @@ namespace TEngineCore.Editor
}
}
private void GenerateDLL(string args)
{
if (EditorApplication.isCompiling)
{
EditorUtility.DisplayDialog("Build AssetBundle", "请等待编译完成", "ok");
return;
}
ApplyArgs("");
BuildAssetsCommand.BuildAndCopyABAOTHotUpdateDlls();
TLogger.LogInfoSuccessd("1.生成DLL的bytes成功");
AssetDatabase.Refresh();
GUIUtility.ExitGUI();
}
private void CopyDLL(string args)
{

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 027adf2a5b5352a498cfa2ad92dda120
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,147 @@
using HybridCLR.Editor.Commands;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HybridCLR.Editor;
using TEngine.Runtime;
using UnityEditor;
using UnityEngine;
namespace TEngine.Editor
{
public static class BuildAssetsCommand
{
public static string HybridCLRBuildCacheDir => Application.dataPath + "/HybridCLRBuildCache";
public static string AssetBundleOutputDir => $"{HybridCLRBuildCacheDir}/AssetBundleOutput";
public static string AssetBundleSourceDataTempDir => $"{HybridCLRBuildCacheDir}/AssetBundleSourceData";
public static string GetAssetBundleOutputDirByTarget(BuildTarget target)
{
return $"{AssetBundleOutputDir}/{target}";
}
public static string GetAssetBundleTempDirByTarget(BuildTarget target)
{
return $"{AssetBundleSourceDataTempDir}/{target}";
}
public static string ToRelativeAssetPath(string s)
{
return s.Substring(s.IndexOf("Assets/"));
}
/// <summary>
/// 将HotFix.dll和HotUpdatePrefab.prefab打入common包.
/// 将HotUpdateScene.unity打入scene包.
/// </summary>
/// <param name="tempDir"></param>
/// <param name="outputDir"></param>
/// <param name="target"></param>
private static void BuildAssetBundles(string tempDir, string outputDir, BuildTarget target)
{
Directory.CreateDirectory(tempDir);
Directory.CreateDirectory(outputDir);
List<AssetBundleBuild> abs = new List<AssetBundleBuild>();
{
var prefabAssets = new List<string>();
string testPrefab = $"{Application.dataPath}/Prefabs/HotUpdatePrefab.prefab";
prefabAssets.Add(testPrefab);
AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
abs.Add(new AssetBundleBuild
{
assetBundleName = "prefabs",
assetNames = prefabAssets.Select(s => ToRelativeAssetPath(s)).ToArray(),
});
}
BuildPipeline.BuildAssetBundles(outputDir, abs.ToArray(), BuildAssetBundleOptions.None, target);
AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
}
public static void BuildAssetBundleByTarget(BuildTarget target)
{
BuildAssetBundles(GetAssetBundleTempDirByTarget(target), GetAssetBundleOutputDirByTarget(target), target);
}
[MenuItem("HybridCLR/Build/BuildAssetsAndCopyToStreamingAssets")]
public static void BuildAndCopyABAOTHotUpdateDlls()
{
BuildTarget target = EditorUserBuildSettings.activeBuildTarget;
BuildAssetBundleByTarget(target);
CompileDllCommand.CompileDll(target);
CopyABAOTHotUpdateDlls(target);
}
public static void CopyABAOTHotUpdateDlls(BuildTarget target)
{
CopyAssetBundlesToStreamingAssets(target);
CopyAOTAssembliesToStreamingAssets();
CopyHotUpdateAssembliesToStreamingAssets();
}
//[MenuItem("HybridCLR/Build/BuildAssetbundle")]
public static void BuildSceneAssetBundleActiveBuildTargetExcludeAOT()
{
BuildAssetBundleByTarget(EditorUserBuildSettings.activeBuildTarget);
}
public static void CopyAOTAssembliesToStreamingAssets()
{
var target = EditorUserBuildSettings.activeBuildTarget;
string aotAssembliesSrcDir = SettingsUtil.GetAssembliesPostIl2CppStripDir(target);
string aotAssembliesDstDir = Application.streamingAssetsPath+"/../TResources/DLL/";
foreach (var dll in ProcedureCodeInit.AOTMetaAssemblyNames)
{
string srcDllPath = $"{aotAssembliesSrcDir}/{dll}";
if (!File.Exists(srcDllPath))
{
Debug.LogError($"ab中添加AOT补充元数据dll:{srcDllPath} 时发生错误,文件不存在。裁剪后的AOT dll在BuildPlayer时才能生成因此需要你先构建一次游戏App后再打包。");
continue;
}
string dllBytesPath = $"{aotAssembliesDstDir}/{dll}.bytes";
File.Copy(srcDllPath, dllBytesPath, true);
Debug.Log($"[CopyAOTAssembliesToStreamingAssets] copy AOT dll {srcDllPath} -> {dllBytesPath}");
}
}
public static void CopyHotUpdateAssembliesToStreamingAssets()
{
var target = EditorUserBuildSettings.activeBuildTarget;
string hotfixDllSrcDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
string hotfixAssembliesDstDir = Application.streamingAssetsPath+"/../TResources/DLL/";
foreach (var dll in SettingsUtil.HotUpdateAssemblyFilesExcludePreserved)
{
string dllPath = $"{hotfixDllSrcDir}/{dll}";
string dllBytesPath = $"{hotfixAssembliesDstDir}/{dll}.bytes";
File.Copy(dllPath, dllBytesPath, true);
Debug.Log($"[CopyHotUpdateAssembliesToStreamingAssets] copy hotfix dll {dllPath} -> {dllBytesPath}");
}
}
public static void CopyAssetBundlesToStreamingAssets(BuildTarget target)
{
string streamingAssetPathDst = Application.streamingAssetsPath+"/../TResources/DLL/";
Directory.CreateDirectory(streamingAssetPathDst);
string outputDir = GetAssetBundleOutputDirByTarget(target);
var abs = new string[] { "prefabs" };
foreach (var ab in abs)
{
string srcAb = ToRelativeAssetPath($"{outputDir}/{ab}");
string dstAb = ToRelativeAssetPath($"{streamingAssetPathDst}/{ab}");
Debug.Log($"[CopyAssetBundlesToStreamingAssets] copy assetbundle {srcAb} -> {dstAb}");
AssetDatabase.CopyAsset( srcAb, dstAb);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1a8357532218e6f49a9bb9401382d6d4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,68 @@
using HybridCLR.Editor.Commands;
using HybridCLR.Editor.Installer;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using HybridCLR.Editor;
using UnityEditor;
using UnityEngine;
namespace TEngine.Editor
{
public class BuildPlayerCommand
{
public static void CopyAssets(string outputDir)
{
Directory.CreateDirectory(outputDir);
foreach(var srcFile in Directory.GetFiles(Application.streamingAssetsPath))
{
string dstFile = $"{outputDir}/{Path.GetFileName(srcFile)}";
File.Copy(srcFile, dstFile, true);
}
}
[MenuItem("HybridCLR/Build/Win64")]
public static void Build_Win64()
{
BuildTarget target = BuildTarget.StandaloneWindows64;
BuildTarget activeTarget = EditorUserBuildSettings.activeBuildTarget;
if (activeTarget != BuildTarget.StandaloneWindows64 && activeTarget != BuildTarget.StandaloneWindows)
{
Debug.LogError("请先切到Win平台再打包");
return;
}
// Get filename.
string outputPath = $"{SettingsUtil.ProjectDir}/Release-Win64";
var buildOptions = BuildOptions.CompressWithLz4;
string location = $"{outputPath}/HybridCLRTrial.exe";
PrebuildCommand.GenerateAll();
Debug.Log("====> Build App");
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions()
{
scenes = new string[] { "Assets/Scenes/main.unity" },
locationPathName = location,
options = buildOptions,
target = target,
targetGroup = BuildTargetGroup.Standalone,
};
var report = BuildPipeline.BuildPlayer(buildPlayerOptions);
if (report.summary.result != UnityEditor.Build.Reporting.BuildResult.Succeeded)
{
Debug.LogError("打包失败");
return;
}
Debug.Log("====> 复制热更新资源和代码");
BuildAssetsCommand.BuildAndCopyABAOTHotUpdateDlls();
BashUtil.CopyDir(Application.streamingAssetsPath, $"{outputPath}/HybridCLRTrial_Data/StreamingAssets", true);
#if UNITY_EDITOR
Application.OpenURL($"file:///{location}");
#endif
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7796c8df856ac4a4a9d644329c1f0958
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,7 +1,10 @@
{
"name": "TEngine.Editor",
"rootNamespace": "",
"references": [
"GUID:f4ecd6f7bd8993043b6cec60dd0cf2b2"
"GUID:f4ecd6f7bd8993043b6cec60dd0cf2b2",
"GUID:13ba8ce62aa80c74598530029cb2d649",
"GUID:2373f786d14518f44b0f475db77ba4de"
],
"includePlatforms": [
"Editor"

View File

@@ -13,6 +13,7 @@ namespace TEngine.Editor
{
"TEngine.Runtime",
"Assembly-CSharp",
"HotFix",
};
private static readonly string[] RuntimeOrEditorAssemblyNames =
@@ -21,6 +22,7 @@ namespace TEngine.Editor
"Assembly-CSharp",
"TEngine.Editor",
"Assembly-CSharp-Editor",
"HotFix",
};
/// <summary>

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 16c2d564e2614539ae1ce24761808e86
timeCreated: 1675252193

View File

@@ -0,0 +1,26 @@
namespace TEngine.Runtime
{
/// <summary>
/// 加载任务抽象基类。
/// </summary>
public abstract class LoadJob
{
protected bool _isDone;
/// <summary>
/// 任务是否完成LoadJobManager会根据该标志判断是否加载下一个任务。
/// </summary>
public bool IsDone => _isDone;
/// <summary>
/// 开始任务执行,一次性初始化工作可放在其中。
/// </summary>
public abstract void Start();
/// <summary>
/// 任务处理。
/// </summary>
/// <returns>执行进入0 - 1。</returns>
public abstract float Process();
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b6604789763448b7afa669c2cd352cfc
timeCreated: 1675252202

View File

@@ -0,0 +1,105 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
namespace TEngine.Runtime
{
/// <summary>
/// 加载器,处理场景加载、对象预生成等需要在加载期处理的事务.
/// </summary>
public class LoadJobManager : UnitySingleton<LoadJobManager>
{
System.Action<float> _progressCallback;
System.Action _onFinishCallback;
Queue<LoadJob> _jobQueue = new Queue<LoadJob>();
LoadJob _curJob = null;
int _doneJobCount;
int _jobCount;
float _progress;
/// <summary>
/// 添加任务.
/// </summary>
/// <param name="job"></param>
public void AddJob(LoadJob job)
{
_jobQueue.Enqueue(job);
}
/// <summary>
/// 启动执行任务队列.
/// </summary>
/// <param name="progressCallback">处理进度回调参数为0-1进度</param>
/// <param name="onFinishCallback">完成回调。</param>
public void Launch(System.Action<float> progressCallback, System.Action onFinishCallback)
{
_progress = 0f;
_doneJobCount = 0;
_jobCount = _jobQueue.Count;
_progressCallback = progressCallback;
_onFinishCallback = onFinishCallback;
_curJob = _jobQueue.Dequeue();
_curJob.Start();
}
void Update()
{
if (_curJob != null)
{
_progress = (_doneJobCount + _curJob.Process()) / _jobCount;
if (_curJob.IsDone)
{
if (_jobQueue.Count > 0)
{
_curJob = _jobQueue.Dequeue();
_curJob.Start();
}
else
_curJob = null;
++_doneJobCount;
}
if (_progressCallback != null)
_progressCallback(_progress);
}
else
{
SingletonMgr.Release(gameObject);
_progressCallback = null;
if (_onFinishCallback != null)
_onFinishCallback();
}
}
/// <summary>
/// 异步加载场景。
/// </summary>
/// <param name="sceneName">场景名称。</param>
/// <param name="progressCallback">加载函数回调。</param>
/// <param name="callback">加载完成回调。</param>
/// <param name="mode">场景加载模式。</param>
public void LoadSceneAsync(string sceneName, System.Action<float> progressCallback = null, System.Action callback = null, LoadSceneMode mode = LoadSceneMode.Single)
{
MonoUtility.StartCoroutine(LoadJobManager.Instance.LoadJobManagerLoadScene(sceneName, progressCallback, callback, mode));
}
private IEnumerator LoadJobManagerLoadScene(string sceneName, System.Action<float> progressCallback = null, System.Action callback = null,
LoadSceneMode mode = LoadSceneMode.Single)
{
bool isLoadEnd = false;
Instance.AddJob(new SceneLoadJob(sceneName, LoadSceneMode.Single));
Instance.Launch(progressCallback, () =>
{
callback?.Invoke();
isLoadEnd = true;
});
yield return null;
while (!isLoadEnd)
{
yield return null;
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b5bbbf8a8cdf4a1fb239ddbc8fd855f2
timeCreated: 1675252202

View File

@@ -0,0 +1,56 @@
using UnityEngine;
using UnityEngine.SceneManagement;
namespace TEngine.Runtime
{
/// <summary>
/// 场景加载任务
/// </summary>
public class SceneLoadJob : LoadJob
{
AsyncOperation _asyncOp;
string _sceneName;
LoadSceneMode _loadMode;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="sceneName">场景名</param>
public SceneLoadJob(string sceneName, LoadSceneMode mode = LoadSceneMode.Single)
{
_sceneName = sceneName;
_loadMode = mode;
}
/// <summary>
/// 开始执行加载任务强制卸载未引用的AB资源开始LoadScene
/// </summary>
public override void Start()
{
//经讨论对象池清理策略交由项目组控制更合理
ResMgr.Instance.UnloadUnusedAssetBundle();
_asyncOp = ResMgr.Instance.LoadScene(_sceneName, _loadMode);
}
/// <summary>
/// 处理加载任务
/// </summary>
/// <returns></returns>
public override float Process()
{
if (_asyncOp != null)
{
if (_asyncOp.isDone)
{
_isDone = true;
return 1f;
}
else
return _asyncOp.progress / 0.9f;
}
else
return 0f;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d14939b3184744598b90eebd67b4bf5f
timeCreated: 1675252346

View File

@@ -56,6 +56,7 @@ namespace TEngine.Runtime
{
assetPaths[j] = reader.ReadString();
_assetPath2BundleDatas.Add(assetPaths[j], bundleName);
Log.Error($"Init Ab {assetPaths[j]} bundleName {bundleName}");
}
depCount = reader.ReadInt32();
if (!_bundleDatas.TryGetValue(bundleName, out assetBundleData))

View File

@@ -1,15 +1,23 @@
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace TEngine.Runtime
{
internal class SceneAssetData
{
public AssetData _assetData;
public LoadSceneMode _loadSceneMode = LoadSceneMode.Single;
}
internal class ResMgr : TSingleton<ResMgr>
{
AssetConfig _assetConfig = new AssetConfig();
private Dictionary<ScriptableObject, AssetData> _scriptableObjects = new Dictionary<ScriptableObject, AssetData>();
public ResMgr()
{
MonoUtility.AddUpdateListener(Update);
_assetConfig.Load();
}
@@ -27,6 +35,15 @@ namespace TEngine.Runtime
_assetConfig.MaxUnloadNumPerFrame = value;
}
/// <summary>
/// 资源更新重载。
/// </summary>
public void ReLoad()
{
_assetConfig.Unload();
_assetConfig.Load();
}
/// <summary>
/// 卸载无用资源
/// </summary>
@@ -355,5 +372,131 @@ namespace TEngine.Runtime
return $"{Application.dataPath}/TResources/{rawPath}";
#endif
}
#region Scene
//已经加载好的场景
private List<SceneAssetData> _loadedScenes = new List<SceneAssetData>();
//加载中的场景
private List<SceneAssetData> _loadingScenes = new List<SceneAssetData>();
private List<SceneAssetData> _cachedDeleteFromLoadingScenes = new List<SceneAssetData>();
/// <summary>
/// 场景加载
/// </summary>
/// <param name="sceneName">场景名</param>
/// /// <param name="mode">加载模式</param>
/// <returns>异步操作对象</returns>
/// <seealso>SceneLoader</seealso>提供了加载进度展示,也可以自定义包装来加载场景
public AsyncOperation LoadScene(string sceneName, LoadSceneMode mode = LoadSceneMode.Single)
{
AssetData assetData = _assetConfig.GetSceneAsset(sceneName, mode);
SceneAssetData sData = new SceneAssetData();
sData._assetData = assetData;
sData._loadSceneMode = mode;
if(assetData != null)
{
_loadingScenes.Add(sData);
assetData.AddRef();
return assetData.AsyncOp;
}
else
return null;
}
/// <summary>
/// 场景是否已经加载过了
/// </summary>
/// <param name="sceneName"></param>
/// <returns></returns>
public bool IsSceneLoaded(string sceneName)
{
foreach (SceneAssetData loadedScene in _loadedScenes)
{
if (loadedScene != null
&& loadedScene._assetData != null
&& !string.IsNullOrEmpty(loadedScene._assetData.Name)
&& loadedScene._assetData.Name.Equals(sceneName))
{
return true;
}
}
return false;
}
/// <summary>
/// 场景是否在加载过程中
/// </summary>
/// <param name="sceneName"></param>
/// <returns></returns>
public bool IsSceneLoading(string sceneName)
{
foreach (SceneAssetData loadingScene in _loadingScenes)
{
if (loadingScene._assetData != null
&& !string.IsNullOrEmpty(loadingScene._assetData.Name)
&& loadingScene._assetData.Name.Equals(sceneName))
{
return true;
}
}
return false;
}
/// <summary>
/// 清理掉已经加载的场景
/// </summary>
void UnloadLoadedScenes()
{
foreach (SceneAssetData loadedScene in _loadedScenes)
{
if (loadedScene != null && loadedScene._assetData != null)
{
loadedScene._assetData.DecRef(true);
}
}
_loadedScenes.Clear();
Resources.UnloadUnusedAssets();
}
/// <summary>
/// 轮询资源。
/// </summary>
private void Update()
{
_assetConfig.Update(Time.deltaTime);
foreach (SceneAssetData loadingScene in _loadingScenes)
{
if (loadingScene._assetData != null &&loadingScene._assetData.AsyncOp != null)
{
if (!loadingScene._assetData.AsyncOp.isDone)
{
if (loadingScene._assetData.AsyncOp.progress >= 0.9f)
{
if (loadingScene._loadSceneMode == LoadSceneMode.Single)
{
UnloadLoadedScenes();
}
// 激活新场景
loadingScene._assetData.AsyncOp.allowSceneActivation = true;
_cachedDeleteFromLoadingScenes.Add(loadingScene);
_loadedScenes.Add(loadingScene);
}
}
}
}
//从Loading队列中删除掉加载完成的场景
foreach (SceneAssetData deleteScene in _cachedDeleteFromLoadingScenes)
{
_loadingScenes.Remove(deleteScene);
}
_cachedDeleteFromLoadingScenes.Clear();
}
#endregion
}
}

View File

@@ -64,9 +64,7 @@ namespace TEngine.Runtime
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
}
@@ -146,6 +144,10 @@ namespace TEngine.Runtime
{
get
{
if (string.IsNullOrEmpty(_versionConfig.ResVersion))
{
return "0";
}
return _versionConfig.ResVersion;
}
set

View File

@@ -29,6 +29,7 @@
{
if (s_VersionHelper == null)
{
Log.Fatal("s_VersionHelper is null GameVersion");
return string.Empty;
}
@@ -45,6 +46,7 @@
{
if (s_VersionHelper == null)
{
Log.Fatal("s_VersionHelper is null InternalGameVersion");
return 0;
}

View File

@@ -29,13 +29,13 @@ namespace TEngine.Runtime
UILoadMgr.Show(UIDefine.UILoadUpdate);
}
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
protected internal override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
m_CheckVersionComplete = false;
m_NeedUpdateVersion = false;
m_VersionInfo = null;
Log.Warning("On Enter ProcedureCheckVersion");
PreLoadHotUpdate();
RequestVersion();
@@ -46,6 +46,7 @@ namespace TEngine.Runtime
/// </summary>
private void RequestVersion()
{
Log.Warning("On RequestVersion");
_curTryCount++;
if (_curTryCount > MaxTryCount)
@@ -74,9 +75,9 @@ namespace TEngine.Runtime
Application.Quit);
return;
}
TLogger.LogInfo("LoadMgr.RequestVersion, proxy:" + checkVersionUrl);
Log.Warning("LoadMgr.RequestVersion, proxy:" + checkVersionUrl);
Log.Info($"Check Version Url=>{checkVersionUrl}");
Log.Warning($"Check Version Url=>{checkVersionUrl}");
m_UnityWebRequest = UnityWebRequest.Get(checkVersionUrl);
@@ -163,7 +164,7 @@ namespace TEngine.Runtime
return data;
}
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
protected internal override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
if (m_result == null || !m_result.isDone)
@@ -227,13 +228,17 @@ namespace TEngine.Runtime
byte[] versionInfoBytes = m_UnityWebRequest.downloadHandler.data;
string versionInfoString = Utility.Converter.GetString(versionInfoBytes);
m_VersionInfo = Utility.Json.ToObject<OnlineVersionInfo>(versionInfoString);
Log.Error("m_VersionInfo.ToString()" + m_VersionInfo.ToString());
if (m_VersionInfo == null)
{
Log.Fatal("Parse VersionInfo failure.");
return;
}
Log.Info("Latest game version is '{0} ({1})', local game version is '{2} ({3})'.",
Log.Error(" m_VersionInfo.GameVersion" + m_VersionInfo.GameVersion);
Log.Error(" m_VersionInfo.InternalResourceVersion" + m_VersionInfo.InternalResourceVersion);
Log.Error(" m_VersionInfo.GameVersion" + Version.GameVersion);
Log.Error(" m_VersionInfo.InternalGameVersion" + Version.InternalGameVersion);
Log.Error("Latest game version is '{0} ({1})', local game version is '{2} ({3})'.",
m_VersionInfo.GameVersion,
m_VersionInfo.InternalResourceVersion.ToString(),
Version.GameVersion,

View File

@@ -1,4 +1,5 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using HybridCLR;
@@ -17,8 +18,16 @@ namespace TEngine.Runtime
"mscorlib.dll",
"System.dll",
"System.Core.dll",
"HotFix.dll",
};
private static Dictionary<string, byte[]> _AssetDatas = new Dictionary<string, byte[]>();
public static byte[] GetAssetData(string dllName)
{
return _AssetDatas[dllName];
}
/// <summary>
/// 为aot assembly加载原始metadata 这个代码放aot或者热更新都行。
/// 一旦加载后如果AOT泛型函数对应native实现不存在则自动替换为解释模式执行
@@ -30,16 +39,25 @@ namespace TEngine.Runtime
// 注意补充元数据是给AOT dll补充元数据而不是给热更新dll补充元数据。
// 热更新dll不缺元数据不需要补充如果调用LoadMetadataForAOTAssembly会返回错误
HomologousImageMode mode = HomologousImageMode.SuperSet;
foreach (var aotDllName in AOTMetaAssemblyNames)
{
byte[] dllBytes = TResources.Load<TextAsset>(aotDllName)?.bytes;
var path = "DLL/" + aotDllName + ".bytes";
Log.Warning(path);
byte[] dllBytes = TResources.Load<TextAsset>(path)?.bytes;
if (dllBytes == null)
{
Log.Fatal($"{aotDllName} is null");
continue;
}
else
{
_AssetDatas[aotDllName+".bytes"] = dllBytes;
}
// 加载assembly对应的dll会自动为它hook。一旦aot泛型函数的native函数不存在用解释器版本代码
LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes);
LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes,mode);
Log.Info($"LoadMetadataForAOTAssembly:{aotDllName}. ret:{err}");
}
}
@@ -51,10 +69,12 @@ namespace TEngine.Runtime
private IFsm<IProcedureManager> m_procedureOwner;
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
protected internal override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
LoadJobManager.Instance.LoadSceneAsync("L2Scene");
m_procedureOwner = procedureOwner;
if (!NeedLoadDll)
@@ -66,28 +86,20 @@ namespace TEngine.Runtime
LoadMetadataForAOTAssemblies();
#if UNITY_EDITOR
Assembly hotfixAssembly = System.AppDomain.CurrentDomain.GetAssemblies().First(assembly => assembly.GetName().Name == "Assembly-CSharp");
StartHotfix(hotfixAssembly);
Assembly hotfixAssembly = System.AppDomain.CurrentDomain.GetAssemblies().First(assembly => assembly.GetName().Name == "HotFix");
StartHotfixEntry(hotfixAssembly);
#else
TResources.LoadAsync<TextAsset>("Dll/HotFix.dll.bytes", (data =>
try
{
if (data == null)
Assembly hotfixAssembly =System.Reflection.Assembly.Load(GetAssetData("HotFix.dll.bytes"));
StartHotfixEntry(hotfixAssembly);
}
catch (Exception e)
{
OnLoadAssetFail();
return;
Log.Error(e.Message);
throw;
}
var obj = data as TextAsset;
if (obj == null)
{
OnLoadAssetFail();
return;
}
else
{
OnLoadAssetSuccess(obj);
}
}));
#endif
}
@@ -96,7 +108,7 @@ namespace TEngine.Runtime
TextAsset dll = (TextAsset)asset;
Assembly hotfixAssembly = System.Reflection.Assembly.Load(dll.bytes);
Log.Info("Load hotfix dll OK.");
StartHotfix(hotfixAssembly);
StartHotfixEntry(hotfixAssembly);
}
private void OnLoadAssetFail()
@@ -104,7 +116,7 @@ namespace TEngine.Runtime
Log.Error("Load hotfix dll failed. ");
}
private void StartHotfix(Assembly hotfixAssembly)
private void StartHotfixEntry(Assembly hotfixAssembly)
{
var hotfixEntry = hotfixAssembly.GetType("HotFix.GameHotfixEntry");
var start = hotfixEntry.GetMethod("Start");

View File

@@ -0,0 +1,20 @@
namespace TEngine.Runtime
{
/// <summary>
/// 流程加载器 - 开始起点
/// </summary>
public class ProcedureLaunch : ProcedureBase
{
protected internal override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
ResMgr.Instance.Active();
}
protected internal override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
ChangeState<ProcedureSplash>(procedureOwner);
}
}
}

View File

@@ -11,7 +11,7 @@ namespace TEngine.Runtime
private bool m_initResourceComplete = false;
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
protected internal override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
@@ -23,7 +23,7 @@ namespace TEngine.Runtime
}),new WaitForSeconds(1f));
}
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
protected internal override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
@@ -34,7 +34,7 @@ namespace TEngine.Runtime
}
protected override void OnLeave(IFsm<IProcedureManager> procedureOwner, bool isShutdown)
protected internal override void OnLeave(IFsm<IProcedureManager> procedureOwner, bool isShutdown)
{
base.OnLeave(procedureOwner, isShutdown);
GameEvent.RemoveEventListener(OnInitResourceCompleteEvent, OnInitResourceComplete);

View File

@@ -1,6 +1,7 @@
using System;
using TEngine.Runtime.HotUpdate;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace TEngine.Runtime
{
@@ -14,7 +15,7 @@ namespace TEngine.Runtime
private IFsm<IProcedureManager> _procedureOwner;
private bool _dllLoad = false;
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
protected internal override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
@@ -85,7 +86,7 @@ namespace TEngine.Runtime
LoadMgr.Instance.StartUpdate(data.List);
}, () =>
{
StartGame();
ProcedureCodeInit();
});
}
//不提示
@@ -107,7 +108,7 @@ namespace TEngine.Runtime
LoadMgr.Instance.StartUpdate(data.List);
}, () =>
{
StartGame();
ProcedureCodeInit();
});
}
//不提示
@@ -124,9 +125,9 @@ namespace TEngine.Runtime
return false;
}
private void StartGame()
private void ProcedureCodeInit()
{
ChangeState<ProcedureStartGame>(_procedureOwner);
ChangeState<ProcedureCodeInit>(_procedureOwner);
}
/// <summary>
@@ -144,6 +145,7 @@ namespace TEngine.Runtime
_onlineVersionInfo.ResourceVersion = int.Parse(GameConfig.Instance.ResId);
}
GameConfig.Instance.WriteResVersion(_onlineVersionInfo.ResourceVersion.ToString());
ResMgr.Instance.ReLoad();
UILoadMgr.Show(UIDefine.UILoadUpdate, "所有资源下载完成,稍后进入游戏!");
LoaderUtilities.DelayFun((() =>
{
@@ -165,7 +167,7 @@ namespace TEngine.Runtime
if (_dllLoad == false)
{
StartGame();
ProcedureCodeInit();
}
else
{

View File

@@ -8,7 +8,7 @@ namespace TEngine.Runtime
{
private bool m_VerifyResourcesComplete = false;
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
protected internal override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

View File

@@ -11,17 +11,7 @@ namespace TEngine.Runtime
/// </summary>
public class ProcedureSplash : ProcedureBase
{
protected override void OnInit(IFsm<IProcedureManager> procedureOwner)
{
base.OnInit(procedureOwner);
}
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
}
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds,
protected internal override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds,
float realElapseSeconds)
{
base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

View File

@@ -10,7 +10,7 @@
/// </summary>
public class ProcedureStartGame : ProcedureBase
{
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
protected internal override void OnEnter(IFsm<IProcedureManager> procedureOwner)
{
base.OnEnter(procedureOwner);
GameEvent.Send(TEngineEvent.OnStartGame);

View File

@@ -1,6 +1,9 @@
{
"name": "TEngine.Runtime",
"references": [],
"rootNamespace": "",
"references": [
"GUID:13ba8ce62aa80c74598530029cb2d649"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": true,

8
Assets/TResources.meta Normal file
View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f680c7d1ec718384a8960405c3cf412c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c0ec9fb4455500c418e4543b03e6de32
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 31f0b82c8b629874a929f0415349de31
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 1c967e0a965235b44af7259c3e3ef168
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 30e2f0d687184a8448520c005e0c2209
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b303ee89f077b5547a60463cc75ac848
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 61f6fb6229a8dc146bb64994606d55d4
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 13675d0792312164b9f26d38cafb21a2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,523 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
m_LinearFogStart: 0
m_LinearFogEnd: 300
m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
m_AmbientIntensity: 1
m_AmbientMode: 0
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
m_HaloStrength: 0.5
m_FlareStrength: 1
m_FlareFadeSpeed: 3
m_HaloTexture: {fileID: 0}
m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
m_DefaultReflectionMode: 0
m_DefaultReflectionResolution: 128
m_ReflectionBounces: 1
m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0.44657898, g: 0.4964133, b: 0.5748178, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0
serializedVersion: 12
m_GIWorkflowMode: 1
m_GISettings:
serializedVersion: 2
m_BounceScale: 1
m_IndirectOutputScale: 1
m_AlbedoBoost: 1
m_EnvironmentLightingMode: 0
m_EnableBakedLightmaps: 1
m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings:
serializedVersion: 12
m_Resolution: 2
m_BakeResolution: 40
m_AtlasSize: 1024
m_AO: 0
m_AOMaxDistance: 1
m_CompAOExponent: 1
m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2
m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1
m_TextureCompression: 1
m_FinalGather: 0
m_FinalGatherFiltering: 1
m_FinalGatherRayCount: 256
m_ReflectionCompression: 2
m_MixedBakeMode: 2
m_BakeBackend: 1
m_PVRSampling: 1
m_PVRDirectSampleCount: 32
m_PVRSampleCount: 512
m_PVRBounces: 2
m_PVREnvironmentSampleCount: 256
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 1
m_PVRDenoiserTypeDirect: 1
m_PVRDenoiserTypeIndirect: 1
m_PVRDenoiserTypeAO: 1
m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0
m_PVREnvironmentMIS: 1
m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5
m_PVRFilteringGaussRadiusAO: 2
m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1
m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 0}
m_LightingSettings: {fileID: 0}
--- !u!196 &4
NavMeshSettings:
serializedVersion: 2
m_ObjectHideFlags: 0
m_BuildSettings:
serializedVersion: 2
agentTypeID: 0
agentRadius: 0.5
agentHeight: 2
agentSlope: 45
agentClimb: 0.4
ledgeDropHeight: 0
maxJumpAcrossDistance: 0
minRegionArea: 2
manualCellSize: 0
cellSize: 0.16666667
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
maxJobWorkers: 0
preserveTilesOutsideBounds: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1 &69435528
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 69435529}
m_Layer: 0
m_Name: L2SceneTag
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &69435529
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 69435528}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 2
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &525849947
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 525849949}
- component: {fileID: 525849948}
m_Layer: 0
m_Name: Directional Light
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!108 &525849948
Light:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 525849947}
m_Enabled: 1
serializedVersion: 10
m_Type: 1
m_Shape: 0
m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
m_Intensity: 1
m_Range: 10
m_SpotAngle: 30
m_InnerSpotAngle: 21.80208
m_CookieSize: 10
m_Shadows:
m_Type: 2
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_CullingMatrixOverride:
e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
m_UseBoundingSphereOverride: 0
m_UseViewFrustumForShadowCasterCull: 1
m_ShadowRadius: 0
m_ShadowAngle: 0
--- !u!4 &525849949
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 525849947}
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
m_LocalPosition: {x: 0, y: 3, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
--- !u!1 &914001103
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 914001107}
- component: {fileID: 914001106}
- component: {fileID: 914001105}
- component: {fileID: 914001104}
m_Layer: 0
m_Name: Plane
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!64 &914001104
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 914001103}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 4
m_Convex: 0
m_CookingOptions: 30
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &914001105
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 914001103}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &914001106
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 914001103}
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &914001107
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 914001103}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1067153380
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1067153384}
- component: {fileID: 1067153383}
- component: {fileID: 1067153382}
- component: {fileID: 1067153381}
m_Layer: 0
m_Name: Capsule
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!136 &1067153381
CapsuleCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1067153380}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
m_Radius: 0.5
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 0, z: 0}
--- !u!23 &1067153382
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1067153380}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1067153383
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1067153380}
m_Mesh: {fileID: 10208, guid: 0000000000000000e000000000000000, type: 0}
--- !u!4 &1067153384
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1067153380}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 2.04, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1697149901
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1697149904}
- component: {fileID: 1697149903}
- component: {fileID: 1697149902}
m_Layer: 0
m_Name: Main Camera
m_TagString: MainCamera
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!81 &1697149902
AudioListener:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1697149901}
m_Enabled: 1
--- !u!20 &1697149903
Camera:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1697149901}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
y: 0
width: 1
height: 1
near clip plane: 0.3
far clip plane: 1000
field of view: 60
orthographic: 0
orthographic size: 5
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
m_TargetEye: 3
m_HDR: 1
m_AllowMSAA: 1
m_AllowDynamicResolution: 0
m_ForceIntoRT: 0
m_OcclusionCulling: 1
m_StereoConvergence: 10
m_StereoSeparation: 0.022
--- !u!4 &1697149904
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1697149901}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: b874a93b1508f04489c3daedc7265500
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 99f344a2f6a21ef408cd2e02d81a4e12
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,97 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &5866157958383304021
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4968753014325038075}
- component: {fileID: 7799670979567356265}
- component: {fileID: 1614920880721590745}
- component: {fileID: 1765467406701699960}
m_Layer: 0
m_Name: Cube
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &4968753014325038075
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5866157958383304021}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &7799670979567356265
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5866157958383304021}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &1614920880721590745
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5866157958383304021}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10303, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!65 &1765467406701699960
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5866157958383304021}
m_Material: {fileID: 0}
m_IsTrigger: 0
m_Enabled: 1
serializedVersion: 2
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: fcabdfa8af84b004488065726a1cbea5
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,22 +0,0 @@
# 使用说明
这个目录主要包含
- huatuo相关仓库
- 本地il2cpp目录
- 其他生成的目录
## 安装huatuo
正常情况下安装huatuo需要替换Unity安装目录下libil2cpp目录为huatuo版本的实现但Unity允许使用环境变量UNITY_IL2CPP_PATH自定义%IL2CPP_PATH%的位置。
因此我们不修改原始的il2cpp目录直接在本地创建huatuo版本的il2cpp并让环境变量指向它
安装流程
- 酌情修改 init_local_il2cpp_data.bat(或.sh)文件中代码
- `set IL2CPP_BRANCH=2020.3.33` 改成你的版本目前只有2020.3.33或2021.3.1
- `set IL2CPP_PATH=<你的Unity editor的il2cpp目录的路径>` 改成你的Unity安装目录
- 运行 init_local_il2cpp_data.bat 或.sh 文件 创建本地il2cpp目录即 LocalIl2CppData 目录。
如果看到初始化成功,表示运行成功。否则请参照文档,对应 .bat或.sh文件自己查找错误原因。

View File

@@ -1,61 +0,0 @@
@echo off
rem set default branch
set IL2CPP_BRANCH=__VERSION__
if exist hybridclr_repo rd /s /q hybridclr_repo
rem git clone https://github.com/focus-creative-games/hybridclr
git clone --depth=1 https://gitee.com/focus-creative-games/hybridclr hybridclr_repo
if exist il2cpp_plus_repo rd /s /q il2cpp_plus_repo
rem git clone https://github.com/focus-creative-games/il2cpp_hybridclr
git clone --depth=1 -b %IL2CPP_BRANCH% https://gitee.com/focus-creative-games/il2cpp_plus il2cpp_plus_repo
rem replace with right Unity Editor Install path
set IL2CPP_PATH=__PATH__
if not exist "%IL2CPP_PATH%" (
echo "please set correct IL2CPP_PATH value"
goto EXIT
)
set LOCAL_IL2CPP_DATA=LocalIl2CppData
if not exist %LOCAL_IL2CPP_DATA% (
mkdir %LOCAL_IL2CPP_DATA%
)
rem need copdy MonoBleedingEdge
set MBE=%LOCAL_IL2CPP_DATA%\MonoBleedingEdge
if not exist %MBE% (
xcopy /q /i /e "%IL2CPP_PATH%\..\MonoBleedingEdge" %MBE%
)
rem copy il2cpp
set IL2CPP=%LOCAL_IL2CPP_DATA%\il2cpp
if not exist %IL2CPP% (
xcopy /q /i /e "%IL2CPP_PATH%" %IL2CPP%
)
set HYBRIDCLR_REPO_DIR=hybridclr_repo
set IL2CPP_PLUS_REPO_DIR=il2cpp_plus_repo
set LIBIL2CPP_PATH=%LOCAL_IL2CPP_DATA%\il2cpp\libil2cpp
rd /s /q %LIBIL2CPP_PATH%
xcopy /q /i /e %IL2CPP_PLUS_REPO_DIR%\libil2cpp %LIBIL2CPP_PATH%
xcopy /q /i /e %HYBRIDCLR_REPO_DIR%\hybridclr %LIBIL2CPP_PATH%\hybridclr
rem clean il2cpp build cache
set IL2CPP_CACHE=..\Library\Il2cppBuildCache
echo clean %IL2CPP_CACHE%
if exist "%IL2CPP_CACHE%" rd /s /q "%IL2CPP_CACHE%"
echo success
:EXIT
PAUSE

View File

@@ -1,69 +0,0 @@
#!/bin/bash
# 设置默认分支为2020.3.33,避免很多人忘了切分支
IL2CPP_BRANCH=__VERSION__
rm -rf hybridclr_repo
# clone huatuo仓库,国内推荐用 gitee
# git clone https://github.com/focus-creative-games/hybridclr
git clone --depth=1 https://gitee.com/focus-creative-games/hybridclr hybridclr_repo
rm -rf il2cpp_plus_repo
# git clone https://github.com/focus-creative-games/il2cpp_plus
git clone --depth=1 -b $IL2CPP_BRANCH https://gitee.com/focus-creative-games/il2cpp_plus il2cpp_plus_repo
# 请修改为你所用Unity的il2cpp目录
# 一般像这样
# C:\Program Files\Unity\Hub\Editor\2020.3.33f1c2\Editor\Data\il2cpp
# /Applications/Unity/Hub/Editor/2020.3.33f1/Unity.app/Contents/il2cpp
IL2CPP_PATH='__PATH__'
if [ ! -d "$IL2CPP_PATH" ] ; then
echo "你未指定正确的il2cpp路径"
exit 1
fi
LOCAL_IL2CPP_DATA=LocalIl2CppData
if [ ! -d "$LOCAL_IL2CPP_DATA" ]; then
mkdir $LOCAL_IL2CPP_DATA
fi
# Unity 打包时允许使用环境变量UNITY_IL2CPP_PATH自定义%IL2CPP_PATH%的位置
# 但同时又要求同级目录包含MonoBleedingEdge因此需要拷贝这两个目录
# 拷贝 MonoBleedingEdge 目录
MBE=$LOCAL_IL2CPP_DATA/MonoBleedingEdge
if [ ! -d "$MBE" ]; then
cp -r "$IL2CPP_PATH/../MonoBleedingEdge" $MBE
fi
# 拷贝il2cpp目录
IL2CPP=$LOCAL_IL2CPP_DATA/il2cpp
if [ ! -d "$IL2CPP" ]; then
cp -r "$IL2CPP_PATH" "$IL2CPP"
fi
# 接下来替换 il2cpp目录下的libil2cpp为 huatuo修改后的版本
# 需要使用 {https://gitee.com/focus-creative-games/il2cpp_plus}/libil2cpp 替换 il2cpp/libil2cpp目录
# 需要使用 {https://gitee.com/focus-creative-games/hybridclr}/huatuo 添加到 il2cpp/libil2cpp目录下即il2cpp/libil2cpp/huatuo
HYBRIDCLR_REPO_DIR=hybridclr_repo
IL2CPP_PLUS_REPO_DIR=il2cpp_plus_repo
LIBIL2CPP_PATH=$LOCAL_IL2CPP_DATA/il2cpp/libil2cpp
rm -rf "$LIBIL2CPP_PATH"
cp -r "$IL2CPP_PLUS_REPO_DIR/libil2cpp" "$LIBIL2CPP_PATH"
cp -r "$HYBRIDCLR_REPO_DIR/huatuo" "$LIBIL2CPP_PATH/huatuo"
# 务必清除缓存不然build仍然使用旧版本。
# 只影响直接build的情况不影响导出工程的情形。
echo 清除 Library/Il2cppBuildCache 缓存目录
rm -rf ../Library/Il2cppBuildCache
echo 初始化成功

View File

@@ -1,61 +0,0 @@
@echo off
rem set default branch
set IL2CPP_BRANCH=2020.3.33
if exist hybridclr_repo rd /s /q hybridclr_repo
rem git clone https://github.com/focus-creative-games/hybridclr
git clone --depth=1 https://gitee.com/focus-creative-games/hybridclr hybridclr_repo
if exist il2cpp_plus_repo rd /s /q il2cpp_plus_repo
rem git clone https://github.com/focus-creative-games/il2cpp_hybridclr
git clone --depth=1 -b %IL2CPP_BRANCH% https://gitee.com/focus-creative-games/il2cpp_plus il2cpp_plus_repo
rem replace with right Unity Editor Install path
set IL2CPP_PATH=C:/Software/UnityEditor/Unity 2020.3.33f1c2/Editor/Data/il2cpp
if not exist "%IL2CPP_PATH%" (
echo "please set correct IL2CPP_PATH value"
goto EXIT
)
set LOCAL_IL2CPP_DATA=LocalIl2CppData
if not exist %LOCAL_IL2CPP_DATA% (
mkdir %LOCAL_IL2CPP_DATA%
)
rem need copdy MonoBleedingEdge
set MBE=%LOCAL_IL2CPP_DATA%\MonoBleedingEdge
if not exist %MBE% (
xcopy /q /i /e "%IL2CPP_PATH%\..\MonoBleedingEdge" %MBE%
)
rem copy il2cpp
set IL2CPP=%LOCAL_IL2CPP_DATA%\il2cpp
if not exist %IL2CPP% (
xcopy /q /i /e "%IL2CPP_PATH%" %IL2CPP%
)
set HYBRIDCLR_REPO_DIR=hybridclr_repo
set IL2CPP_PLUS_REPO_DIR=il2cpp_plus_repo
set LIBIL2CPP_PATH=%LOCAL_IL2CPP_DATA%\il2cpp\libil2cpp
rd /s /q %LIBIL2CPP_PATH%
xcopy /q /i /e %IL2CPP_PLUS_REPO_DIR%\libil2cpp %LIBIL2CPP_PATH%
xcopy /q /i /e %HYBRIDCLR_REPO_DIR%\hybridclr %LIBIL2CPP_PATH%\hybridclr
rem clean il2cpp build cache
set IL2CPP_CACHE=..\Library\Il2cppBuildCache
echo clean %IL2CPP_CACHE%
if exist "%IL2CPP_CACHE%" rd /s /q "%IL2CPP_CACHE%"
echo success
:EXIT
PAUSE

View File

@@ -1,6 +1,6 @@
{
"dependencies": {
"com.focus-creative-games.hybridclr_unity": "0.8.0",
"com.focus-creative-games.hybridclr_unity": "https://gitee.com/focus-creative-games/hybridclr_unity.git",
"com.unity.collab-proxy": "1.15.15",
"com.unity.ide.rider": "2.0.7",
"com.unity.ide.visualstudio": "2.0.14",

View File

@@ -1,11 +1,11 @@
{
"dependencies": {
"com.focus-creative-games.hybridclr_unity": {
"version": "0.8.0",
"version": "https://gitee.com/focus-creative-games/hybridclr_unity.git",
"depth": 0,
"source": "registry",
"source": "git",
"dependencies": {},
"url": "https://package.openupm.cn"
"hash": "bf6ae99dadfbc64e3a6f2dc7f63509a5b6b12621"
},
"com.unity.collab-proxy": {
"version": "1.15.15",

View File

@@ -5,10 +5,7 @@ EditorBuildSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Scenes:
- enabled: 0
path: Assets/TEngine.Demo/Demo/TEngine.EntityDemo/EntityDemo.unity
guid: 0abe20efc865c3e42b6b80e541d03354
- enabled: 1
path: Assets/Scenes/DemoScene.unity
guid: 2cda990e2423bbf4892e6590ba056729
path: Assets/Scenes/main.unity
guid: 07f693cf49a00634fbc050b96052bebd
m_configObjects: {}

View File

@@ -0,0 +1,32 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &1
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e189374413a3f00468e49d51d8b27a09, type: 3}
m_Name:
m_EditorClassIdentifier:
enable: 1
useGlobalIl2cpp: 0
hybridclrRepoURL: https://gitee.com/focus-creative-games/hybridclr
il2cppPlusRepoURL: https://gitee.com/focus-creative-games/il2cpp_plus
hotUpdateAssemblyDefinitions:
- {fileID: 5897886265953266890, guid: 7604e54d5e2c0f940b892d038911fd6a, type: 3}
hotUpdateAssemblies:
- Assembly-CSharp
preserveHotUpdateAssemblies: []
hotUpdateDllCompileOutputRootDir: HybridCLRData/HotUpdateDlls
externalHotUpdateAssembliyDirs: []
strippedAOTDllOutputRootDir: HybridCLRData/AssembliesPostIl2CppStrip
patchAOTAssemblies: []
collectAssetReferenceTypes: 0
outputLinkFile: HybridCLRData/Generated/link.xml
outputAOTGenericReferenceFile: HybridCLRData/Generated/AOTGenericReferences.cs
maxGenericReferenceIteration: 10
maxMethodBridgeGenericIteration: 10

View File

@@ -3,7 +3,7 @@
--- !u!129 &1
PlayerSettings:
m_ObjectHideFlags: 0
serializedVersion: 20
serializedVersion: 22
productGUID: bb189644a16ef5749b99696b959dbbe0
AndroidProfiler: 0
AndroidFilterTouchesWhenObscured: 0
@@ -55,6 +55,8 @@ PlayerSettings:
m_StereoRenderingPath: 0
m_ActiveColorSpace: 0
m_MTRendering: 1
mipStripping: 0
numberOfMipsStripped: 0
m_StackTraceTypes: 010000000100000001000000010000000100000001000000
iosShowActivityIndicatorOnLoading: -1
androidShowActivityIndicatorOnLoading: -1
@@ -72,6 +74,12 @@ PlayerSettings:
androidRenderOutsideSafeArea: 1
androidUseSwappy: 0
androidBlitType: 0
androidResizableWindow: 0
androidDefaultWindowWidth: 1920
androidDefaultWindowHeight: 1080
androidMinimumWindowWidth: 400
androidMinimumWindowHeight: 300
androidFullscreenMode: 1
defaultIsNativeResolution: 1
macRetinaSupport: 1
runInBackground: 0
@@ -83,6 +91,11 @@ PlayerSettings:
hideHomeButton: 0
submitAnalytics: 1
usePlayerLog: 1
autoStreaming: 0
useAnimationStreaming: 0
useFontStreaming: 0
autoStreamingId:
instantGameAppId:
bakeCollisionMeshes: 0
forceSingleInstance: 0
useFlipModelSwapchain: 1
@@ -123,15 +136,16 @@ PlayerSettings:
stadiaTargetFramerate: 0
vulkanNumSwapchainBuffers: 3
vulkanEnableSetSRGBWrite: 0
vulkanEnablePreTransform: 0
vulkanEnableLateAcquireNextImage: 0
useSecurityBuild: 0
vulkanEnableCommandBufferRecycling: 1
m_SupportedAspectRatios:
4:3: 1
5:4: 1
16:10: 1
16:9: 1
Others: 1
bundleVersion: 1.0
bundleVersion: 1.1
preloadedAssets: []
metroInputSource: 0
wsaTransparentSwapchain: 0
@@ -139,31 +153,6 @@ PlayerSettings:
xboxOneDisableKinectGpuReservation: 1
xboxOneEnable7thCore: 1
vrSettings:
cardboard:
depthFormat: 0
enableTransitionView: 0
daydream:
depthFormat: 0
useSustainedPerformanceMode: 0
enableVideoLayer: 0
useProtectedVideoMemory: 0
minimumSupportedHeadTracking: 0
maximumSupportedHeadTracking: 1
hololens:
depthFormat: 1
depthBufferSharingEnabled: 1
lumin:
depthFormat: 0
frameTiming: 2
enableGLCache: 0
glCacheMaxBlobSize: 524288
glCacheMaxFileSize: 8388608
oculus:
sharedDepthBuffer: 1
dashSupport: 1
lowOverheadMode: 0
protectedContext: 0
v2Signing: 1
enable360StereoCapture: 0
isWsaHolographicRemotingEnabled: 0
enableFrameTimingStats: 0
@@ -176,7 +165,11 @@ PlayerSettings:
androidMaxAspectRatio: 2.1
applicationIdentifier:
Standalone: com.TEngine.TEngineDemo
buildNumber: {}
buildNumber:
Standalone: 0
iPhone: 0
tvOS: 0
overrideDefaultApplicationIdentifier: 1
AndroidBundleVersionCode: 1
AndroidMinSdkVersion: 19
AndroidTargetSdkVersion: 0
@@ -193,10 +186,10 @@ PlayerSettings:
StripUnusedMeshComponents: 0
VertexChannelCompressionMask: 4054
iPhoneSdkVersion: 988
iOSTargetOSVersionString: 10.0
iOSTargetOSVersionString: 11.0
tvOSSdkVersion: 0
tvOSRequireExtendedGameController: 0
tvOSTargetOSVersionString: 10.0
tvOSTargetOSVersionString: 11.0
uIPrerenderedIcon: 0
uIRequiresPersistentWiFi: 0
uIRequiresFullScreen: 1
@@ -230,8 +223,8 @@ PlayerSettings:
iOSLaunchScreeniPadFillPct: 100
iOSLaunchScreeniPadSize: 100
iOSLaunchScreeniPadCustomXibPath:
iOSUseLaunchScreenStoryboard: 0
iOSLaunchScreenCustomStoryboardPath:
iOSLaunchScreeniPadCustomStoryboardPath:
iOSDeviceRequirements: []
iOSURLSchemes: []
iOSBackgroundModes: 0
@@ -239,6 +232,7 @@ PlayerSettings:
metalEditorSupport: 1
metalAPIValidation: 1
iOSRenderExtraFrameOnPause: 0
iosCopyPluginsCodeInsteadOfSymlink: 0
appleDeveloperTeamID:
iOSManualSigningProvisioningProfileID:
tvOSManualSigningProvisioningProfileID:
@@ -248,10 +242,19 @@ PlayerSettings:
iOSRequireARKit: 0
iOSAutomaticallyDetectAndAddCapabilities: 1
appleEnableProMotion: 0
shaderPrecisionModel: 0
clonedFromGUID: 00000000000000000000000000000000
templatePackageId:
templateDefaultScene:
useCustomMainManifest: 0
useCustomLauncherManifest: 0
useCustomMainGradleTemplate: 0
useCustomLauncherGradleManifest: 0
useCustomBaseGradleTemplate: 0
useCustomGradlePropertiesTemplate: 0
useCustomProguardFile: 0
AndroidTargetArchitectures: 1
AndroidTargetDevices: 0
AndroidSplashScreenScale: 0
androidSplashScreen: {fileID: 0}
AndroidKeystoreName:
@@ -268,15 +271,22 @@ PlayerSettings:
height: 180
banner: {fileID: 0}
androidGamepadSupportLevel: 0
chromeosInputEmulation: 1
AndroidMinifyWithR8: 0
AndroidMinifyRelease: 0
AndroidMinifyDebug: 0
AndroidValidateAppBundleSize: 1
AndroidAppBundleSizeToValidate: 150
m_BuildTargetIcons: []
m_BuildTargetPlatformIcons: []
m_BuildTargetBatching: []
m_BuildTargetEncrypting: []
m_BuildTargetSecurityBuild: []
m_BuildTargetGraphicsJobs: []
m_BuildTargetGraphicsJobMode: []
m_BuildTargetGraphicsAPIs: []
m_BuildTargetGraphicsAPIs:
- m_BuildTarget: iOSSupport
m_APIs: 10000000
m_Automatic: 1
m_BuildTargetVRSettings: []
openGLRequireES31: 0
openGLRequireES31AEP: 0
@@ -288,6 +298,7 @@ PlayerSettings:
tvOS: 1
m_BuildTargetGroupLightmapEncodingQuality: []
m_BuildTargetGroupLightmapSettings: []
m_BuildTargetNormalMapEncoding: []
playModeTestRunnerEnabled: 0
runPlayModeTestAsEditModeTest: 0
actionOnDotNetUnhandledException: 1
@@ -297,12 +308,15 @@ PlayerSettings:
cameraUsageDescription:
locationUsageDescription:
microphoneUsageDescription:
bluetoothUsageDescription:
switchNMETAOverride:
switchNetLibKey:
switchSocketMemoryPoolSize: 6144
switchSocketAllocatorPoolSize: 128
switchSocketConcurrencyLimit: 14
switchScreenResolutionBehavior: 2
switchUseCPUProfiler: 0
switchUseGOLDLinker: 0
switchApplicationID: 0x01004b9000490000
switchNSODependencies:
switchTitleNames_0:
@@ -320,6 +334,7 @@ PlayerSettings:
switchTitleNames_12:
switchTitleNames_13:
switchTitleNames_14:
switchTitleNames_15:
switchPublisherNames_0:
switchPublisherNames_1:
switchPublisherNames_2:
@@ -335,6 +350,7 @@ PlayerSettings:
switchPublisherNames_12:
switchPublisherNames_13:
switchPublisherNames_14:
switchPublisherNames_15:
switchIcons_0: {fileID: 0}
switchIcons_1: {fileID: 0}
switchIcons_2: {fileID: 0}
@@ -350,6 +366,7 @@ PlayerSettings:
switchIcons_12: {fileID: 0}
switchIcons_13: {fileID: 0}
switchIcons_14: {fileID: 0}
switchIcons_15: {fileID: 0}
switchSmallIcons_0: {fileID: 0}
switchSmallIcons_1: {fileID: 0}
switchSmallIcons_2: {fileID: 0}
@@ -365,6 +382,7 @@ PlayerSettings:
switchSmallIcons_12: {fileID: 0}
switchSmallIcons_13: {fileID: 0}
switchSmallIcons_14: {fileID: 0}
switchSmallIcons_15: {fileID: 0}
switchManualHTML:
switchAccessibleURLs:
switchLegalInformation:
@@ -427,6 +445,11 @@ PlayerSettings:
switchSocketInitializeEnabled: 1
switchNetworkInterfaceManagerInitializeEnabled: 1
switchPlayerConnectionEnabled: 1
switchUseNewStyleFilepaths: 0
switchUseMicroSleepForYield: 1
switchEnableRamDiskSupport: 0
switchMicroSleepForYieldTime: 25
switchRamDiskSpaceSize: 12
ps4NPAgeRating: 12
ps4NPTitleSecret:
ps4NPTrophyPackPath:
@@ -497,6 +520,7 @@ PlayerSettings:
ps4videoRecordingFeaturesUsed: 0
ps4contentSearchFeaturesUsed: 0
ps4CompatibilityPS5: 0
ps4AllowPS5Detection: 0
ps4GPU800MHz: 1
ps4attribEyeToEyeDistanceSettingVR: 0
ps4IncludedModules: []
@@ -517,23 +541,35 @@ PlayerSettings:
webGLAnalyzeBuildSize: 0
webGLUseEmbeddedResources: 0
webGLCompressionFormat: 0
webGLWasmArithmeticExceptions: 0
webGLLinkerTarget: 1
webGLThreadsSupport: 0
webGLWasmStreaming: 0
webGLDecompressionFallback: 0
scriptingDefineSymbols:
1: ENABLE_LOG_WARNING;ENABLE_LOG_ERROR;ENABLE_LOG_EXCEPTION
1: ENABLE_LOG;ENABLE_LOG_WARNING;ENABLE_LOG_ERROR;ENABLE_LOG_EXCEPTION;ENABLE_MONO;HOT_FIX;RELEASE_BUILD;ASSETBUNDLE_ENABLE
4: ENABLE_LOG
7: ENABLE_LOG
13: ENABLE_LOG
14: ENABLE_LOG
additionalCompilerArguments: {}
platformArchitecture: {}
scriptingBackend: {}
scriptingBackend:
Standalone: 1
il2cppCompilerConfiguration: {}
managedStrippingLevel: {}
incrementalIl2cppBuild: {}
suppressCommonWarnings: 1
allowUnsafeCode: 0
useDeterministicCompilation: 1
useReferenceAssemblies: 1
enableRoslynAnalyzers: 1
additionalIl2CppArgs:
scriptingRuntimeVersion: 1
gcIncremental: 0
assemblyVersionValidation: 1
gcWBarrierValidation: 0
apiCompatibilityLevelPerPlatform:
Standalone: 6
Standalone: 3
m_RenderingPath: 1
m_MobileRenderingPath: 1
metroPackageName: TEngine
@@ -563,6 +599,7 @@ PlayerSettings:
metroFTAName:
metroFTAFileTypes: []
metroProtocolName:
vcxProjDefaultLanguage:
XboxOneProductId:
XboxOneUpdateKey:
XboxOneSandboxId:
@@ -581,6 +618,7 @@ PlayerSettings:
XboxOneCapability: []
XboxOneGameRating: {}
XboxOneIsContentPackage: 0
XboxOneEnhancedXboxCompatibilityMode: 0
XboxOneEnableGPUVariability: 1
XboxOneSockets: {}
XboxOneSplashScreen: {fileID: 0}
@@ -589,10 +627,7 @@ PlayerSettings:
XboxOneXTitleMemory: 8
XboxOneOverrideIdentityName:
XboxOneOverrideIdentityPublisher:
vrEditorSettings:
daydream:
daydreamIconForeground: {fileID: 0}
daydreamIconBackground: {fileID: 0}
vrEditorSettings: {}
cloudServicesEnabled: {}
luminIcon:
m_Name:
@@ -606,11 +641,18 @@ PlayerSettings:
m_VersionCode: 1
m_VersionName:
apiCompatibilityLevel: 6
activeInputHandler: 0
cloudProjectId:
framebufferDepthMemorylessMode: 0
qualitySettingsNames:
- Very Low
- Low
- Medium
- High
- Very High
- Ultra
projectName:
organizationId:
cloudEnabled: 0
enableNativePlatformBackendsForNewInputSystem: 0
disableOldInputManagerSupport: 0
legacyClampBlendShapeWeights: 0
virtualTexturingSupportEnabled: 0

View File

@@ -4,7 +4,7 @@
QualitySettings:
m_ObjectHideFlags: 0
serializedVersion: 5
m_CurrentQuality: 5
m_CurrentQuality: 0
m_QualitySettings:
- serializedVersion: 2
name: Very Low

View File

@@ -0,0 +1,39 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!162 &1
EditorUserSettings:
m_ObjectHideFlags: 0
serializedVersion: 4
m_ConfigSettings:
RecentlyUsedScenePath-0:
value: 224247031146467a2c3a0931046c70121c121b3e182d352462061f39e7e3200ce7f422a7f234362820
flags: 0
RecentlyUsedScenePath-1:
value: 224247031146466f28000b2b1e261134131a1765082d2b3f621d383de5e93a3dacd21fcde23730730c2bcb3909314f2afc031d12
flags: 0
RecentlyUsedScenePath-2:
value: 22424703114646680e0b0227036c7b151b182b292926237e38271427fb
flags: 0
RecentlyUsedScenePath-3:
value: 224247031146466f3f0b1f2d05315c1505582b2929670a621e2a183de7ae2136ebf32f
flags: 0
RecentlyUsedScenePath-4:
value: 224247031146466f3f0b1f2d05315c1505582b292926232362054f00e1e53a3dacf238e0f323
flags: 0
RecentlyUsedScenePath-5:
value: 22424703114646680e0b0227036c52111f19563f22213229
flags: 0
vcSharedLogLevel:
value: 0d5e400f0650
flags: 0
m_VCAutomaticAdd: 1
m_VCDebugCom: 0
m_VCDebugCmd: 0
m_VCDebugOut: 0
m_SemanticMergeMode: 2
m_VCShowFailedCheckout: 1
m_VCOverwriteFailedCheckoutAssets: 1
m_VCProjectOverlayIcons: 1
m_VCHierarchyOverlayIcons: 1
m_VCOtherOverlayIcons: 1
m_VCAllowAsyncUpdate: 1