Browse Source

1.去掉AppType,改成用SceneName
2.Tools改成分发机制,使用SceneType分发,方便用户导入插件

tanghai 1 year ago
parent
commit
7de34f9d62

+ 1 - 1
DotNet/Loader/Init.cs

@@ -20,7 +20,7 @@ namespace ET
 						.WithNotParsed(error => throw new Exception($"命令行格式错误! {error}"))
 						.WithParsed((o)=>World.Instance.AddSingleton(o));
 				
-				World.Instance.AddSingleton<Logger>().Log = new NLogger(Options.Instance.AppType.ToString(), Options.Instance.Process, 0);
+				World.Instance.AddSingleton<Logger>().Log = new NLogger(Options.Instance.SceneName, Options.Instance.Process, 0);
 				
 				ETTask.ExceptionHandler += Log.Error;
 				World.Instance.AddSingleton<TimeInfo>();

+ 0 - 2
Share/Tool/ExcelExporter/ExcelExporter.cs

@@ -207,8 +207,6 @@ namespace ET
                     Directory.Delete(clientProtoDir, true);
                 }
                 FileHelper.CopyDirectory("../Config/Excel/c", clientProtoDir);
-                
-                Log.Console("Export Excel Sucess!");
             }
             catch (Exception e)
             {

+ 20 - 0
Share/Tool/ExcelExporter/ToolEvent_ExcelExporter.cs

@@ -0,0 +1,20 @@
+using System;
+
+namespace ET
+{
+    public static partial class SceneType
+    {
+        public const int ExcelExporter = 1;
+    }
+    
+    [Event(SceneType.ExcelExporter)]
+    public class ToolEvent_ExcelExporter: AEvent<ToolScene, ToolEvent>
+    {
+        protected override async ETTask Run(ToolScene scene, ToolEvent a)
+        {
+            Options.Instance.Console = 1;
+            ExcelExporter.Export();
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 34 - 20
Share/Tool/Init.cs

@@ -4,8 +4,32 @@ using System.Reflection;
 using System.Threading;
 using CommandLine;
 
-namespace ET.Server
+namespace ET
 {
+    public class ToolScene: IScene
+    {
+        public Fiber Fiber { get; set; }
+
+        public int SceneType
+        {
+            get;
+            set;
+        }
+
+        public ToolScene()
+        {
+        }
+
+        public ToolScene(int sceneType)
+        {
+            this.SceneType = sceneType;
+        }
+    }
+    
+    public struct ToolEvent
+    {
+    }
+    
     internal static class Init
     {
         private static int Main(string[] args)
@@ -22,33 +46,23 @@ namespace ET.Server
                     .WithNotParsed(error => throw new Exception($"命令行格式错误! {error}"))
                     .WithParsed((o)=>World.Instance.AddSingleton(o));
                 
-                World.Instance.AddSingleton<Logger>().Log = new NLogger(Options.Instance.AppType.ToString(), Options.Instance.Process, 0);
+                World.Instance.AddSingleton<Logger>().Log = new NLogger(Options.Instance.SceneName, Options.Instance.Process, 0);
                 
-                World.Instance.AddSingleton<CodeTypes, Assembly[]>(new[] { typeof (Init).Assembly });
+                World.Instance.AddSingleton<CodeTypes, Assembly[]>([typeof (Init).Assembly]);
                 World.Instance.AddSingleton<EventSystem>();
+                World.Instance.AddSingleton<SceneTypeSingleton, Type>(typeof(SceneType));
                 
                 // 强制调用一下mongo,避免mongo库被裁剪
                 MongoHelper.ToJson(1);
                 
                 ETTask.ExceptionHandler += Log.Error;
+
+                int sceneType = SceneTypeSingleton.Instance.GetSceneType(Options.Instance.SceneName);
+
+                ToolScene scene = new(sceneType);
+                EventSystem.Instance.Publish(scene, new ToolEvent());
                 
-                Log.Info($"server start........................ ");
-				
-                switch (Options.Instance.AppType)
-                {
-                    case AppType.ExcelExporter:
-                    {
-                        Options.Instance.Console = 1;
-                        ExcelExporter.Export();
-                        return 0;
-                    }
-                    case AppType.Proto2CS:
-                    {
-                        Options.Instance.Console = 1;
-                        Proto2CS.Export();
-                        return 0;
-                    }
-                }
+                Log.Console($"{Options.Instance.SceneName} run finish!");
             }
             catch (Exception e)
             {

+ 0 - 1
Share/Tool/Proto2CS/Proto2CS.cs

@@ -17,7 +17,6 @@ namespace ET
         public static void Export()
         {
             InnerProto2CS.Proto2CS();
-            Log.Console("proto2cs succeed!");
         }
     }
 

+ 20 - 0
Share/Tool/Proto2CS/ToolEvent_Proto2CS.cs

@@ -0,0 +1,20 @@
+using System;
+
+namespace ET
+{
+    public static partial class SceneType
+    {
+        public const int Proto2CS = 2;
+    }
+    
+    [Event(SceneType.Proto2CS)]
+    public class ToolEvent_Proto2CS: AEvent<ToolScene, ToolEvent>
+    {
+        protected override async ETTask Run(ToolScene scene, ToolEvent a)
+        {
+            Options.Instance.Console = 1;
+            Proto2CS.Export();
+            await ETTask.CompletedTask;
+        }
+    }
+}

+ 8 - 0
Share/Tool/SceneType.cs

@@ -0,0 +1,8 @@
+namespace ET
+{
+    [UniqueId]
+    public static partial class SceneType
+    {
+        public const int All = 0;
+    }
+}

+ 8 - 0
Share/Tool/Share.Tool.csproj

@@ -46,6 +46,14 @@
         <Compile Include="..\..\Unity\Assets\Scripts\Core\Network\OpcodeRangeDefine.cs">
             <Link>Module\Message\OpcodeRangeDefine.cs</Link>
         </Compile>
+
+        <Compile Update="Proto2CS\ToolEvent_Proto2CS.cs">
+          <Link>Share\ToolEvent_Proto2CS.cs</Link>
+        </Compile>
+
+        <Compile Update="ExcelExporter\ToolEvent_ExcelExporter.cs">
+          <Link>Share\FiberInit_Proto2CS.cs</Link>
+        </Compile>
     </ItemGroup>
     
     <ItemGroup>

+ 2 - 2
Unity/Assets/Resources/GlobalConfig.asset

@@ -14,6 +14,6 @@ MonoBehaviour:
   m_EditorClassIdentifier: 
   CodeMode: 3
   EnableDll: 1
-  BuildType: 1
-  AppType: 7
+  BuildType: 0
+  SceneName: StateSync
   EPlayMode: 0

+ 5 - 0
Unity/Assets/Scripts/Core/DoubleMap.cs

@@ -75,6 +75,11 @@ namespace ET
 			return default(K);
 		}
 
+		public Dictionary<K, V> GetAll()
+		{
+			return this.kv;
+		}
+
 		public void RemoveByKey(K key)
 		{
 			if (key == null)

+ 6 - 0
Unity/Assets/Scripts/Core/Entity/SceneTypeSingleton.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.Reflection;
 
 namespace ET
@@ -49,5 +50,10 @@ namespace ET
         {
             return this.sceneNames.GetKeyByValue(sceneName);
         }
+
+        public Dictionary<int, string> GetAll()
+        {
+            return this.sceneNames.GetAll();
+        }
     }
 }

+ 2 - 16
Unity/Assets/Scripts/Core/World/Module/Options/Options.cs

@@ -4,24 +4,10 @@ using System.Collections.Generic;
 
 namespace ET
 {
-    public enum AppType
-    {
-        Server,
-        Watcher, // 每台物理机一个守护进程,用来启动该物理机上的所有进程
-        GameTool,
-        ExcelExporter,
-        Proto2CS,
-        BenchmarkClient,
-        BenchmarkServer,
-        
-        StateSync,
-        LockStep,
-    }
-    
     public class Options: Singleton<Options>
     {
-        [Option("AppType", Required = false, Default = AppType.Server, HelpText = "AppType enum")]
-        public AppType AppType { get; set; }
+        [Option("SceneName", Required = false, Default = "Server", HelpText = "define in SceneType class")]
+        public string SceneName { get; set; }
 
         [Option("StartConfig", Required = false, Default = "StartConfig/Localhost")]
         public string StartConfig { get; set; }

+ 34 - 15
Unity/Assets/Scripts/Editor/GlobalConfigEditor/GlobalConfigEditor.cs

@@ -1,47 +1,66 @@
 using System;
+using System.Linq;
 using UnityEditor;
+using UnityEngine;
+using YooAsset;
 
 namespace ET
 {
     [CustomEditor(typeof(GlobalConfig))]
     public class GlobalConfigEditor : Editor
     {
-        private CodeMode codeMode;
-        private BuildType buildType;
-
         private void OnEnable()
         {
             GlobalConfig globalConfig = (GlobalConfig)this.target;
-            this.codeMode = globalConfig.CodeMode;
             globalConfig.BuildType = EditorUserBuildSettings.development ? BuildType.Debug : BuildType.Release;
-            this.buildType = globalConfig.BuildType;
+            EditorResHelper.SaveAssets(globalConfig);
         }
 
         public override void OnInspectorGUI()
         {
-            base.OnInspectorGUI();
-
             GlobalConfig globalConfig = (GlobalConfig)this.target;
-
-            if (this.codeMode != globalConfig.CodeMode)
+            CodeMode codeMode = (CodeMode)EditorGUILayout.EnumPopup("CodeMode", globalConfig.CodeMode);
+            if (codeMode != globalConfig.CodeMode)
             {
-                this.codeMode = globalConfig.CodeMode;
-                this.serializedObject.Update();
+                globalConfig.CodeMode = codeMode;
+                EditorResHelper.SaveAssets(globalConfig);
                 AssemblyTool.DoCompile();
             }
 
-            if (this.buildType != globalConfig.BuildType)
+            bool enableDll = EditorGUILayout.Toggle("EnableDll", globalConfig.EnableDll);
+            if (enableDll != globalConfig.EnableDll)
+            {
+                globalConfig.EnableDll = enableDll;
+                EditorResHelper.SaveAssets(globalConfig);
+            }
+            
+            BuildType buildType = (BuildType)EditorGUILayout.EnumPopup("BuildType", globalConfig.BuildType);
+            if (buildType != globalConfig.BuildType)
             {
-                this.buildType = globalConfig.BuildType;
-                EditorUserBuildSettings.development = this.buildType switch
+                globalConfig.BuildType = buildType;
+                EditorUserBuildSettings.development = globalConfig.BuildType switch
                 {
                     BuildType.Debug => true,
                     BuildType.Release => false,
                     _ => throw new ArgumentOutOfRangeException()
                 };
-                this.serializedObject.Update();
+                EditorResHelper.SaveAssets(globalConfig);
                 AssemblyTool.DoCompile();
             }
+            
+            EPlayMode ePlayMode = (EPlayMode)EditorGUILayout.EnumPopup("EPlayMode", globalConfig.EPlayMode);
+            if (ePlayMode != globalConfig.EPlayMode)
+            {
+                globalConfig.EPlayMode = ePlayMode;
+                EditorResHelper.SaveAssets(globalConfig);
+            }
+            
+            string sceneName = EditorGUILayout.TextField($"SceneName", globalConfig.SceneName);
+            if (sceneName != globalConfig.SceneName)
+            {
+                globalConfig.SceneName = sceneName;
+                EditorResHelper.SaveAssets(globalConfig);
+            }
         }
     }
 }

+ 8 - 0
Unity/Assets/Scripts/Editor/Helper/EditorResHelper.cs

@@ -1,10 +1,18 @@
 using System.Collections.Generic;
 using System.IO;
+using UnityEditor;
 
 namespace ET
 {
     public class EditorResHelper
     {
+        public static void SaveAssets(UnityEngine.Object asset)
+        {
+            EditorUtility.SetDirty(asset);
+            AssetDatabase.SaveAssets();
+            AssetDatabase.Refresh();
+        }
+        
         /// <summary>
         /// 获取文件夹内所有的预制跟场景路径
         /// </summary>

+ 1 - 1
Unity/Assets/Scripts/Editor/ServerCommandLineEditor/ServerCommandLineEditor.cs

@@ -51,7 +51,7 @@ namespace ET
 
             if (GUILayout.Button("Start Watcher"))
             {
-                string arguments = $"App.dll --AppType=Watcher --StartConfig=StartConfig/{this.startConfig} --Console=1";
+                string arguments = $"App.dll --SceneName=Watcher --StartConfig=StartConfig/{this.startConfig} --Console=1";
                 ProcessHelper.Run(dotnet, arguments, "../Bin/");
             }
 

+ 2 - 2
Unity/Assets/Scripts/Editor/ToolEditor/ToolsEditor.cs

@@ -9,7 +9,7 @@
 #else
             const string tools = ".\\Tool.exe";
 #endif
-            ShellHelper.Run($"{tools} --AppType=ExcelExporter --Console=1", "../Bin/");
+            ShellHelper.Run($"{tools} --SceneName=ExcelExporter --Console=1", "../Bin/");
         }
         
         public static void Proto2CS()
@@ -19,7 +19,7 @@
 #else
             const string tools = ".\\Tool.exe";
 #endif
-            ShellHelper.Run($"{tools} --AppType=Proto2CS --Console=1", "../Bin/");
+            ShellHelper.Run($"{tools} --SceneName=Proto2CS --Console=1", "../Bin/");
         }
     }
 }

+ 5 - 4
Unity/Assets/Scripts/Hotfix/Server/EntryEvent2_InitServer.cs

@@ -8,9 +8,10 @@ namespace ET.Server
     {
         protected override async ETTask Run(Scene root, EntryEvent2 args)
         {
-            switch (Options.Instance.AppType)
+            int sceneType = SceneTypeSingleton.Instance.GetSceneType(Options.Instance.SceneName);
+            switch (sceneType)
             {
-                case AppType.Server:
+                case SceneType.Server:
                 {
                     int process = root.Fiber.Process;
                     StartProcessConfig startProcessConfig = StartProcessConfigCategory.Instance.Get(process);
@@ -28,12 +29,12 @@ namespace ET.Server
 
                     break;
                 }
-                case AppType.Watcher:
+                case SceneType.Watcher:
                 {
                     root.AddComponent<WatcherComponent>();
                     break;
                 }
-                case AppType.GameTool:
+                case SceneType.GameTool:
                 {
                     break;
                 }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/Watcher/WatcherHelper.cs

@@ -43,7 +43,7 @@ namespace ET.Server
             const string exe = "dotnet";
             string arguments = $"App.dll" + 
                     $" --Process={startProcessConfig.Id}" +
-                    $" --AppType=Server" +  
+                    $" --SceneName=Server" +  
                     $" --StartConfig={Options.Instance.StartConfig}" +
                     $" --Develop={Options.Instance.Develop}" +
                     $" --LogLevel={Options.Instance.LogLevel}" +

+ 1 - 2
Unity/Assets/Scripts/HotfixView/Client/EntryEvent3_InitClient.cs

@@ -17,9 +17,8 @@ namespace ET.Client
             root.AddComponent<CurrentScenesComponent>();
             
             // 根据配置修改掉Main Fiber的SceneType
-            int sceneType = SceneTypeSingleton.Instance.GetSceneType(globalComponent.GlobalConfig.AppType.ToString());
+            int sceneType = SceneTypeSingleton.Instance.GetSceneType(globalComponent.GlobalConfig.SceneName);
             root.SceneType = sceneType;
-            
             await EventSystem.Instance.PublishAsync(root, new AppStartInitFinish());
         }
     }

+ 1 - 1
Unity/Assets/Scripts/Loader/MonoBehaviour/GlobalConfig.cs

@@ -25,7 +25,7 @@ namespace ET
 
         public BuildType BuildType;
 
-        public AppType AppType;
+        public string SceneName;
 
         public EPlayMode EPlayMode;
     }

+ 21 - 18
Unity/Assets/Scripts/Model/Share/Demo/StateSync/SceneType.cs

@@ -4,24 +4,27 @@
 	public static partial class SceneType
 	{
 		public const int All = 0;
-		public const int Main = 1; // 主纤程,一个进程一个, 初始化从这里开始
-		public const int NetInner = 2; // 负责进程间消息通信
-		public const int Realm = 3;
-		public const int Gate = 4;
-		public const int Http = 5;
-		public const int Location = 6;
-		public const int Map = 7;
-		public const int Router = 8;
-		public const int RouterManager = 9;
-		public const int Robot = 10;
-		public const int BenchmarkClient = 11;
-		public const int BenchmarkServer = 12;
-		public const int Match = 13;
-		public const int Room = 14;
-		public const int LockStepClient = 15;
-		public const int LockStepServer = 16;
-		public const int RoomRoot = 17;
-		public const int Watcher = 18;
+		public const int Server = 1;
+		public const int Main = 2; // 主纤程,一个进程一个, 初始化从这里开始
+		public const int NetInner = 3; // 负责进程间消息通信
+		public const int Realm = 4;
+		public const int Gate = 5;
+		public const int Http = 6;
+		public const int Location = 7;
+		public const int Map = 8;
+		public const int Router = 9;
+		public const int RouterManager = 10;
+		public const int Robot = 11;
+		public const int BenchmarkClient = 12;
+		public const int BenchmarkServer = 13;
+		public const int Match = 14;
+		public const int Room = 15;
+		public const int LockStepClient = 16;
+		public const int LockStepServer = 17;
+		public const int RoomRoot = 18;
+		public const int Watcher = 19;
+		public const int GameTool = 20;
+		
 
 		// 客户端
 		public const int StateSync = 50;

+ 92 - 17
Unity/ProjectSettings/QualitySettings.asset

@@ -6,7 +6,7 @@ QualitySettings:
   serializedVersion: 5
   m_CurrentQuality: 3
   m_QualitySettings:
-  - serializedVersion: 2
+  - serializedVersion: 3
     name: Fastest
     pixelLightCount: 0
     shadows: 0
@@ -19,16 +19,20 @@ QualitySettings:
     shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
     shadowmaskMode: 0
     skinWeights: 1
-    textureQuality: 1
+    globalTextureMipmapLimit: 1
+    textureMipmapLimitSettings: []
     anisotropicTextures: 0
     antiAliasing: 0
     softParticles: 0
     softVegetation: 0
     realtimeReflectionProbes: 0
     billboardsFaceCameraPosition: 0
+    useLegacyDetailDistribution: 1
     vSyncCount: 0
+    realtimeGICPUUsage: 25
     lodBias: 0.3
     maximumLODLevel: 0
+    enableLODCrossFade: 1
     streamingMipmapsActive: 0
     streamingMipmapsAddAllCameras: 1
     streamingMipmapsMemoryBudget: 512
@@ -41,8 +45,17 @@ QualitySettings:
     asyncUploadPersistentBuffer: 1
     resolutionScalingFixedDPIFactor: 1
     customRenderPipeline: {fileID: 0}
+    terrainQualityOverrides: 0
+    terrainPixelError: 1
+    terrainDetailDensityScale: 1
+    terrainBasemapDistance: 1000
+    terrainDetailDistance: 80
+    terrainTreeDistance: 5000
+    terrainBillboardStart: 50
+    terrainFadeLength: 5
+    terrainMaxTrees: 50
     excludedTargetPlatforms: []
-  - serializedVersion: 2
+  - serializedVersion: 3
     name: Fast
     pixelLightCount: 0
     shadows: 0
@@ -55,16 +68,20 @@ QualitySettings:
     shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
     shadowmaskMode: 0
     skinWeights: 2
-    textureQuality: 0
+    globalTextureMipmapLimit: 0
+    textureMipmapLimitSettings: []
     anisotropicTextures: 0
     antiAliasing: 0
     softParticles: 0
     softVegetation: 0
     realtimeReflectionProbes: 0
     billboardsFaceCameraPosition: 0
+    useLegacyDetailDistribution: 1
     vSyncCount: 0
+    realtimeGICPUUsage: 25
     lodBias: 0.4
     maximumLODLevel: 0
+    enableLODCrossFade: 1
     streamingMipmapsActive: 0
     streamingMipmapsAddAllCameras: 1
     streamingMipmapsMemoryBudget: 512
@@ -77,8 +94,17 @@ QualitySettings:
     asyncUploadPersistentBuffer: 1
     resolutionScalingFixedDPIFactor: 1
     customRenderPipeline: {fileID: 0}
+    terrainQualityOverrides: 0
+    terrainPixelError: 1
+    terrainDetailDensityScale: 1
+    terrainBasemapDistance: 1000
+    terrainDetailDistance: 80
+    terrainTreeDistance: 5000
+    terrainBillboardStart: 50
+    terrainFadeLength: 5
+    terrainMaxTrees: 50
     excludedTargetPlatforms: []
-  - serializedVersion: 2
+  - serializedVersion: 3
     name: Simple
     pixelLightCount: 1
     shadows: 1
@@ -91,16 +117,20 @@ QualitySettings:
     shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
     shadowmaskMode: 0
     skinWeights: 2
-    textureQuality: 0
+    globalTextureMipmapLimit: 0
+    textureMipmapLimitSettings: []
     anisotropicTextures: 1
     antiAliasing: 0
     softParticles: 0
     softVegetation: 0
     realtimeReflectionProbes: 0
     billboardsFaceCameraPosition: 0
+    useLegacyDetailDistribution: 1
     vSyncCount: 0
+    realtimeGICPUUsage: 25
     lodBias: 0.7
     maximumLODLevel: 0
+    enableLODCrossFade: 1
     streamingMipmapsActive: 0
     streamingMipmapsAddAllCameras: 1
     streamingMipmapsMemoryBudget: 512
@@ -113,8 +143,17 @@ QualitySettings:
     asyncUploadPersistentBuffer: 1
     resolutionScalingFixedDPIFactor: 1
     customRenderPipeline: {fileID: 0}
+    terrainQualityOverrides: 0
+    terrainPixelError: 1
+    terrainDetailDensityScale: 1
+    terrainBasemapDistance: 1000
+    terrainDetailDistance: 80
+    terrainTreeDistance: 5000
+    terrainBillboardStart: 50
+    terrainFadeLength: 5
+    terrainMaxTrees: 50
     excludedTargetPlatforms: []
-  - serializedVersion: 2
+  - serializedVersion: 3
     name: Good
     pixelLightCount: 2
     shadows: 2
@@ -127,16 +166,20 @@ QualitySettings:
     shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
     shadowmaskMode: 1
     skinWeights: 2
-    textureQuality: 0
+    globalTextureMipmapLimit: 0
+    textureMipmapLimitSettings: []
     anisotropicTextures: 1
     antiAliasing: 0
     softParticles: 0
     softVegetation: 1
     realtimeReflectionProbes: 1
     billboardsFaceCameraPosition: 1
+    useLegacyDetailDistribution: 1
     vSyncCount: 1
+    realtimeGICPUUsage: 50
     lodBias: 1
     maximumLODLevel: 0
+    enableLODCrossFade: 1
     streamingMipmapsActive: 0
     streamingMipmapsAddAllCameras: 1
     streamingMipmapsMemoryBudget: 512
@@ -150,8 +193,17 @@ QualitySettings:
     resolutionScalingFixedDPIFactor: 1
     customRenderPipeline: {fileID: 11400000, guid: 313955cd6271f5c4985cba4adc30fc8e,
       type: 2}
+    terrainQualityOverrides: 0
+    terrainPixelError: 1
+    terrainDetailDensityScale: 1
+    terrainBasemapDistance: 1000
+    terrainDetailDistance: 80
+    terrainTreeDistance: 5000
+    terrainBillboardStart: 50
+    terrainFadeLength: 5
+    terrainMaxTrees: 50
     excludedTargetPlatforms: []
-  - serializedVersion: 2
+  - serializedVersion: 3
     name: Beautiful
     pixelLightCount: 3
     shadows: 2
@@ -164,16 +216,20 @@ QualitySettings:
     shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
     shadowmaskMode: 1
     skinWeights: 4
-    textureQuality: 0
+    globalTextureMipmapLimit: 0
+    textureMipmapLimitSettings: []
     anisotropicTextures: 2
     antiAliasing: 2
     softParticles: 1
     softVegetation: 1
     realtimeReflectionProbes: 1
     billboardsFaceCameraPosition: 1
+    useLegacyDetailDistribution: 1
     vSyncCount: 1
+    realtimeGICPUUsage: 50
     lodBias: 1.5
     maximumLODLevel: 0
+    enableLODCrossFade: 1
     streamingMipmapsActive: 0
     streamingMipmapsAddAllCameras: 1
     streamingMipmapsMemoryBudget: 512
@@ -186,8 +242,17 @@ QualitySettings:
     asyncUploadPersistentBuffer: 1
     resolutionScalingFixedDPIFactor: 1
     customRenderPipeline: {fileID: 0}
+    terrainQualityOverrides: 0
+    terrainPixelError: 1
+    terrainDetailDensityScale: 1
+    terrainBasemapDistance: 1000
+    terrainDetailDistance: 80
+    terrainTreeDistance: 5000
+    terrainBillboardStart: 50
+    terrainFadeLength: 5
+    terrainMaxTrees: 50
     excludedTargetPlatforms: []
-  - serializedVersion: 2
+  - serializedVersion: 3
     name: Fantastic
     pixelLightCount: 4
     shadows: 2
@@ -200,16 +265,20 @@ QualitySettings:
     shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
     shadowmaskMode: 1
     skinWeights: 4
-    textureQuality: 0
+    globalTextureMipmapLimit: 0
+    textureMipmapLimitSettings: []
     anisotropicTextures: 2
     antiAliasing: 2
     softParticles: 1
     softVegetation: 1
     realtimeReflectionProbes: 1
     billboardsFaceCameraPosition: 1
+    useLegacyDetailDistribution: 1
     vSyncCount: 1
+    realtimeGICPUUsage: 100
     lodBias: 2
     maximumLODLevel: 0
+    enableLODCrossFade: 1
     streamingMipmapsActive: 0
     streamingMipmapsAddAllCameras: 1
     streamingMipmapsMemoryBudget: 512
@@ -222,9 +291,15 @@ QualitySettings:
     asyncUploadPersistentBuffer: 1
     resolutionScalingFixedDPIFactor: 1
     customRenderPipeline: {fileID: 0}
+    terrainQualityOverrides: 0
+    terrainPixelError: 1
+    terrainDetailDensityScale: 1
+    terrainBasemapDistance: 1000
+    terrainDetailDistance: 80
+    terrainTreeDistance: 5000
+    terrainBillboardStart: 50
+    terrainFadeLength: 5
+    terrainMaxTrees: 50
     excludedTargetPlatforms: []
-  m_PerPlatformDefaultQuality:
-    Android: 0
-    Server: 0
-    Standalone: 0
-    iPhone: 0
+  m_TextureMipmapLimitGroupNames: []
+  m_PerPlatformDefaultQuality: {}