refactor
This commit is contained in:
		
							
								
								
									
										3
									
								
								Editor/Build.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/Build.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 4d9f862e28154a8686fbce5a3ace4f9d | ||||
| timeCreated: 1744231598 | ||||
							
								
								
									
										72
									
								
								Editor/Build/BuildVersionBumper.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								Editor/Build/BuildVersionBumper.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| using UnityEngine; | ||||
| using UnityEditor; | ||||
| using UnityEditor.Build; | ||||
| using UnityEditor.Build.Reporting; | ||||
|  | ||||
| namespace RebootKitEditor.Build { | ||||
|     class BuildVersionBumper : IPostprocessBuildWithReport { | ||||
|         public int callbackOrder => 0; | ||||
|  | ||||
|         public void OnPostprocessBuild(BuildReport report) { | ||||
|             VersionUpdater.IncrementPatch(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static class VersionUpdater { | ||||
|         public static bool IncrementVersion(int incrementMajor = 0, int incrementMinor = 0, int incrementPatch = 0) { | ||||
|             if (TryParseVersion(PlayerSettings.bundleVersion, out int major, out int minor, out int patch)) { | ||||
|                 major += incrementMajor; | ||||
|                 minor += incrementMinor; | ||||
|                 patch += incrementPatch; | ||||
|                 string newVersion = $"{major}.{minor}.{patch}"; | ||||
|  | ||||
|                 if (SetVersion(newVersion)) { | ||||
|                     Debug.Log($"Updated version to: {newVersion}"); | ||||
|                 } else { | ||||
|                     Debug.LogError($"Failed to update version to: {newVersion}"); | ||||
|                     return false; | ||||
|                 } | ||||
|             } else { | ||||
|                 Debug.LogError($"Failed to parse current version: {PlayerSettings.bundleVersion}"); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         public static bool IncrementMajor() => IncrementVersion(incrementMajor: 1); | ||||
|         public static bool IncrementMinor() => IncrementVersion(incrementMinor: 1); | ||||
|         public static bool IncrementPatch() => IncrementVersion(incrementPatch: 1); | ||||
|  | ||||
|         static bool SetVersion(string newVersion) { | ||||
|             if (!IsValidVersionFormat(newVersion)) { | ||||
|                 Debug.LogError($"Invalid version format: {newVersion}. Expected format: maj.min.ver"); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             PlayerSettings.bundleVersion = newVersion; | ||||
|             Debug.Log($"Application version updated to: {newVersion}"); | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         static bool IsValidVersionFormat(string version) { | ||||
|             string[] parts = version.Split('.'); | ||||
|             return parts.Length == 3 && int.TryParse(parts[0], out _) && int.TryParse(parts[1], out _) && int.TryParse(parts[2], out _); | ||||
|         } | ||||
|  | ||||
|         static bool TryParseVersion(string version, out int major, out int minor, out int patch) { | ||||
|             major = 0; | ||||
|             minor = 0; | ||||
|             patch = 0; | ||||
|  | ||||
|             string[] parts = version.Split('.'); | ||||
|             if (parts.Length != 3) { | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             return int.TryParse(parts[0], out major) && | ||||
|                    int.TryParse(parts[1], out minor) && | ||||
|                    int.TryParse(parts[2], out patch); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/Build/BuildVersionBumper.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/Build/BuildVersionBumper.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 75ae1e3647224db7beaab84c858cb20b | ||||
| timeCreated: 1744231606 | ||||
							
								
								
									
										38
									
								
								Editor/CommonEditorActions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Editor/CommonEditorActions.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| using System.IO; | ||||
| using RebootKitEditor.Build; | ||||
| using UnityEditor; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKitEditor { | ||||
|     static class CommonEditorActions { | ||||
|         [MenuItem(REditorConsts.k_EditorMenu + "Bump minor version", false, 0)] | ||||
|         static void BumpMinorVersion() { | ||||
|             if (VersionUpdater.IncrementMinor()) { | ||||
|                 Debug.Log("Bumped minor version."); | ||||
|             } else { | ||||
|                 Debug.LogError("Failed to bump minor version."); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [MenuItem(REditorConsts.k_EditorMenu + "Open Persistent Data Folder", false, 100)] | ||||
|         static void OpenPersistentDataFolder() { | ||||
|             string path = Application.persistentDataPath; | ||||
|             if (Directory.Exists(path)) { | ||||
|                 EditorUtility.RevealInFinder(path); | ||||
|             } else { | ||||
|                 Debug.LogError($"Persistent data folder does not exist: {path}"); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         [MenuItem(REditorConsts.k_EditorMenu + "Remove Persistent Data Folder", false, 1000)] | ||||
|         static void RemovePersistentDataFolder() { | ||||
|             string path = Application.persistentDataPath; | ||||
|             if (Directory.Exists(path)) { | ||||
|                 Directory.Delete(path, true); | ||||
|                 Debug.Log($"Removed persistent data folder: {path}"); | ||||
|             } else { | ||||
|                 Debug.LogError($"Persistent data folder does not exist: {path}"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/CommonEditorActions.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/CommonEditorActions.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 81870cc212f846b0a15b9b4334aa5261 | ||||
| timeCreated: 1744230412 | ||||
| @@ -1,3 +0,0 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: ea037ce7419341d8a7961be6343fd957 | ||||
| timeCreated: 1741641033 | ||||
| @@ -4,7 +4,7 @@ using UnityEditor; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKitEditor.PropertyDrawers { | ||||
|     [CustomPropertyDrawer(typeof(CVar))] | ||||
|     [CustomPropertyDrawer(typeof(ConfigVar))] | ||||
|     public class CVarDrawer : PropertyDrawer { | ||||
|         bool m_Expand; | ||||
|  | ||||
|   | ||||
							
								
								
									
										38
									
								
								Editor/PropertyDrawers/ConstsPropertyDrawer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								Editor/PropertyDrawers/ConstsPropertyDrawer.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEditor; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKitEditor.PropertyDrawers { | ||||
|     [CustomPropertyDrawer(typeof(ConstsProperty<>))] | ||||
|     public class ConstsPropertyDrawer : PropertyDrawer { | ||||
|         const string k_InlineValue = "m_InlineValue"; | ||||
|         const string k_Asset = "m_Asset"; | ||||
|         const string k_UseInlineValue = "m_UseInlineValue"; | ||||
|          | ||||
|         public override void OnGUI(Rect position, SerializedProperty property, GUIContent label) { | ||||
|             SerializedProperty useInlineValue = property.FindPropertyRelative(k_UseInlineValue); | ||||
|             SerializedProperty inlineValue = property.FindPropertyRelative(k_InlineValue); | ||||
|             SerializedProperty asset = property.FindPropertyRelative(k_Asset); | ||||
|  | ||||
|             EditorGUI.BeginProperty(position, label, property); | ||||
|  | ||||
|             GUILayout.BeginHorizontal(); | ||||
|              | ||||
|             EditorGUILayout.LabelField(label, EditorStyles.miniBoldLabel); | ||||
|  | ||||
|             if (useInlineValue.boolValue) { | ||||
|                 EditorGUILayout.PropertyField(inlineValue, GUIContent.none); | ||||
|             } else { | ||||
|                 EditorGUILayout.PropertyField(asset, GUIContent.none); | ||||
|             } | ||||
|              | ||||
|             if (GUILayout.Button(useInlineValue.boolValue ? "Inline" : "Asset", GUILayout.MaxWidth(100))) { | ||||
|                 useInlineValue.boolValue = !useInlineValue.boolValue; | ||||
|             } | ||||
|              | ||||
|             GUILayout.EndHorizontal(); | ||||
|  | ||||
|             EditorGUI.EndProperty(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/PropertyDrawers/ConstsPropertyDrawer.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/PropertyDrawers/ConstsPropertyDrawer.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d7ed7ab023f349a4a4b50ee7a4029178 | ||||
| timeCreated: 1743848631 | ||||
							
								
								
									
										5
									
								
								Editor/REditorConsts.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Editor/REditorConsts.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| namespace RebootKitEditor { | ||||
|     static class REditorConsts { | ||||
|         internal const string k_EditorMenu = "Reboot Reality/"; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/REditorConsts.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/REditorConsts.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c12d260ac43a4a95a0cb5bf7e3260886 | ||||
| timeCreated: 1744230534 | ||||
| @@ -2,7 +2,9 @@ | ||||
|     "name": "SzafaKitEditor", | ||||
|     "rootNamespace": "RebootKitEditor", | ||||
|     "references": [ | ||||
|     "GUID:284059c7949783646b281a1b815580e6" | ||||
|         "GUID:284059c7949783646b281a1b815580e6", | ||||
|         "GUID:9e24947de15b9834991c9d8411ea37cf", | ||||
|         "GUID:69448af7b92c7f342b298e06a37122aa" | ||||
|     ], | ||||
|     "includePlatforms": [ | ||||
|         "Editor" | ||||
|   | ||||
							
								
								
									
										3
									
								
								Editor/RebootWindow.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/RebootWindow.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: af51a267b80341a7a06264976e356e49 | ||||
| timeCreated: 1744413473 | ||||
							
								
								
									
										105
									
								
								Editor/RebootWindow/ConfigVarsView.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								Editor/RebootWindow/ConfigVarsView.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| using RebootKit.Engine.Foundation; | ||||
| using RebootKit.Engine.Services.Console; | ||||
| using RebootKit.Engine.UI; | ||||
| using UnityEngine; | ||||
| using UnityEngine.UIElements; | ||||
|  | ||||
| namespace RebootKitEditor.RebootWindow { | ||||
|     public class ConfigVarsView : IView { | ||||
|         public void Dispose() { | ||||
|         } | ||||
|  | ||||
|         public VisualElement Build() { | ||||
|             ScrollView scrollView = new() { | ||||
|                 style = { | ||||
|                     flexGrow = 1 | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             ConfigVarsContainer.Init(); | ||||
|  | ||||
|             foreach (ConfigVar cvar in ConfigVarsContainer.All()) { | ||||
|                 VisualElement varContainer = new() { | ||||
|                     style = { | ||||
|                         marginBottom = 8, | ||||
|                         paddingBottom = 8, | ||||
|                         borderBottomWidth = 1, | ||||
|                         borderBottomColor = new Color(0.3f, 0.3f, 0.3f), | ||||
|                     } | ||||
|                 }; | ||||
|  | ||||
|                 VisualElement valueContainer = new() { | ||||
|                     style = { | ||||
|                         flexDirection = FlexDirection.Row | ||||
|                     } | ||||
|                 }; | ||||
|                 varContainer.Add(valueContainer); | ||||
|  | ||||
|                 Label nameLabel = new(cvar.name) { | ||||
|                     style = { | ||||
|                         color = new Color(0.7f, 0.9f, 0.9f), | ||||
|                         unityFontStyleAndWeight = FontStyle.Bold | ||||
|                     } | ||||
|                 }; | ||||
|                 valueContainer.Add(nameLabel); | ||||
|  | ||||
|                 Label valueLabel = new(cvar.ToString()) { | ||||
|                     style = { | ||||
|                         color = RTheme.s_FirstColor | ||||
|                     } | ||||
|                 }; | ||||
|                 valueContainer.Add(valueLabel); | ||||
|  | ||||
|                 if (cvar.flags.HasFlag(CVarFlags.User)) { | ||||
|                     valueContainer.Add(CreateFlagLabel("User", new Color(0.36f, 0.41f, 0.42f))); | ||||
|                 } | ||||
|  | ||||
|                 if (cvar.flags.HasFlag(CVarFlags.Client)) { | ||||
|                     valueContainer.Add(CreateFlagLabel("Client", new Color(0.81f, 0.29f, 0.15f))); | ||||
|                 } | ||||
|                  | ||||
|                 if (cvar.flags.HasFlag(CVarFlags.Server)) { | ||||
|                     valueContainer.Add(CreateFlagLabel("Server", new Color(0.18f, 0.64f, 0.18f))); | ||||
|                 } | ||||
|                  | ||||
|                 if (cvar.flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                     valueContainer.Add(CreateFlagLabel("ReadOnly", new Color(0.13f, 0.07f, 0.47f))); | ||||
|                 } | ||||
|  | ||||
|                 Label descLabel = new(cvar.description) { | ||||
|                     style = { | ||||
|                         fontSize = 10, | ||||
|                         color = new Color(0.7f, 0.7f, 0.7f) | ||||
|                     } | ||||
|                 }; | ||||
|                 varContainer.Add(descLabel); | ||||
|  | ||||
|                 scrollView.Add(varContainer); | ||||
|             } | ||||
|  | ||||
|             return scrollView; | ||||
|         } | ||||
|  | ||||
|         VisualElement CreateFlagLabel(string text, Color color) { | ||||
|             Label label = new(text) { | ||||
|                 style = { | ||||
|                     fontSize = 12, | ||||
|                     color = new Color(0.7f, 0.7f, 0.7f), | ||||
|                     backgroundColor = color, | ||||
|                     paddingLeft = 4, | ||||
|                     paddingRight = 4, | ||||
|                     paddingTop = 4, | ||||
|                     paddingBottom = 4, | ||||
|                     marginLeft = 4, | ||||
|                     marginRight = 4, | ||||
|                     borderTopLeftRadius = 8, | ||||
|                     borderTopRightRadius = 8, | ||||
|                     borderBottomLeftRadius = 8, | ||||
|                     borderBottomRightRadius = 8, | ||||
|                     unityFontStyleAndWeight = FontStyle.Bold, | ||||
|                 } | ||||
|             }; | ||||
|             return label; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/RebootWindow/ConfigVarsView.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/RebootWindow/ConfigVarsView.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 7572c4418faf4e74930030a016e3dfc6 | ||||
| timeCreated: 1744461313 | ||||
							
								
								
									
										103
									
								
								Editor/RebootWindow/GameServicesView.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								Editor/RebootWindow/GameServicesView.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| using System.Collections.Generic; | ||||
| using RebootKit.Engine; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using RebootKit.Engine.UI; | ||||
| using UnityEditor; | ||||
| using UnityEditor.UIElements; | ||||
| using UnityEngine; | ||||
| using UnityEngine.UIElements; | ||||
|  | ||||
| namespace RebootKitEditor.RebootWindow { | ||||
|     public class GameServicesView : IView { | ||||
|         VisualElement m_RootElement; | ||||
|  | ||||
|         readonly List<Editor> m_ServiceEditors = new(); | ||||
|          | ||||
|         [Inject] EngineConfigAsset m_EngineConfigAsset; | ||||
|  | ||||
|         public void Dispose() { | ||||
|             foreach (Editor editor in m_ServiceEditors) { | ||||
|                 if (editor != null) { | ||||
|                     Object.DestroyImmediate(editor); | ||||
|                 } | ||||
|             } | ||||
|             m_ServiceEditors.Clear(); | ||||
|         } | ||||
|  | ||||
|         public VisualElement Build() { | ||||
|             m_RootElement = new ScrollView(); | ||||
|  | ||||
|             Label servicesAmountLabel = new($"Game services: {m_EngineConfigAsset.services.Length}") { | ||||
|                 style = { | ||||
|                     color = new Color(0.7f, 0.9f, 0.9f), | ||||
|                     unityFontStyleAndWeight = FontStyle.Bold | ||||
|                 } | ||||
|             }; | ||||
|             m_RootElement.Add(servicesAmountLabel); | ||||
|  | ||||
|             for (int i = 0; i < m_EngineConfigAsset.services.Length; i++) { | ||||
|                 ServiceAsset serviceAsset = m_EngineConfigAsset.services[i]; | ||||
|  | ||||
|                 VisualElement serviceView = CreateServicesView(serviceAsset); | ||||
|                 serviceView.style.backgroundColor = i % 2 == 0 ? new Color(0.1f, 0.1f, 0.1f) : new Color(0.2f, 0.2f, 0.2f); | ||||
|                 m_RootElement.Add(serviceView); | ||||
|             } | ||||
|  | ||||
|             return m_RootElement; | ||||
|         } | ||||
|  | ||||
|         VisualElement CreateServicesView<T>(ServiceAsset<T> serviceAsset) where T : class, IService { | ||||
|             VisualElement root = new() { | ||||
|                 style = { | ||||
|                     paddingBottom = 4, | ||||
|                     paddingTop = 4, | ||||
|                     paddingLeft = 4, | ||||
|                     paddingRight = 4, | ||||
|                     borderBottomLeftRadius = 4, | ||||
|                     borderBottomRightRadius = 4  | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             VisualElement header = new() { | ||||
|                 style = { | ||||
|                     backgroundColor = new Color(0.2f, 0.2f, 0.2f), | ||||
|                     paddingLeft = 8, | ||||
|                     paddingRight = 8, | ||||
|                     paddingTop = 4, | ||||
|                     paddingBottom = 4, | ||||
|                     borderTopLeftRadius = 4, | ||||
|                     borderTopRightRadius = 4, | ||||
|                 } | ||||
|             }; | ||||
|             root.Add(header); | ||||
|  | ||||
|             Label nameLabel = new(serviceAsset.name) { | ||||
|                 style = { | ||||
|                     color = new Color(0.7f, 0.9f, 0.9f), | ||||
|                     unityFontStyleAndWeight = FontStyle.Bold | ||||
|                 } | ||||
|             }; | ||||
|             header.Add(nameLabel); | ||||
|  | ||||
|             VisualElement editorView = new() { | ||||
|                 style = { | ||||
|                     backgroundColor = new Color(0.3f, 0.3f, 0.3f), | ||||
|                     paddingLeft = 10, | ||||
|                     paddingRight = 10, | ||||
|                     paddingTop = 5, | ||||
|                     paddingBottom = 5, | ||||
|                     minHeight = 50 | ||||
|                 } | ||||
|             }; | ||||
|             root.Add(editorView); | ||||
|              | ||||
|             Editor editor = Editor.CreateEditor(serviceAsset); | ||||
|             m_ServiceEditors.Add(editor); | ||||
|  | ||||
|             InspectorElement inspectorElement = new(editor); | ||||
|             editorView.Add(inspectorElement); | ||||
|              | ||||
|             return root; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/RebootWindow/GameServicesView.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/RebootWindow/GameServicesView.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 08e99ca3a4a641069f1f7a1b30388754 | ||||
| timeCreated: 1744552856 | ||||
							
								
								
									
										62
									
								
								Editor/RebootWindow/HomeView.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								Editor/RebootWindow/HomeView.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,62 @@ | ||||
| using RebootKit.Engine.UI; | ||||
| using UnityEngine; | ||||
| using UnityEngine.UIElements; | ||||
|  | ||||
| namespace RebootKitEditor.RebootWindow { | ||||
|     public class HomeView : IView { | ||||
|         public void Dispose() { | ||||
|         } | ||||
|  | ||||
|         public VisualElement Build() { | ||||
|             VisualElement rootContainer = new() { | ||||
|                 style = { | ||||
|                     flexGrow = 1, | ||||
|                     fontSize = 14 | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             Label label = new($"{Application.productName} {Application.version}") { | ||||
|                 style = { | ||||
|                     fontSize = 18, | ||||
|                     unityFontStyleAndWeight = FontStyle.Bold | ||||
|                 } | ||||
|             }; | ||||
|             rootContainer.Add(label); | ||||
|  | ||||
|             VisualElement persistentPathContainer = new() { | ||||
|                 style = { | ||||
|                     marginTop = 8, | ||||
|                     marginBottom = 8, | ||||
|                     paddingLeft = 4, | ||||
|                     paddingRight = 4, | ||||
|                     paddingTop = 4, | ||||
|                     paddingBottom = 4, | ||||
|                     borderLeftWidth = 1, | ||||
|                     borderLeftColor = new Color(0.3f, 0.3f, 0.3f), | ||||
|                     flexDirection = FlexDirection.Row, | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             Label persistentPathLabel = new($"Persistent Path: {Application.persistentDataPath}") { | ||||
|                 style = { | ||||
|                     fontSize = 12, | ||||
|                     color = new Color(0.7f, 0.9f, 0.9f) | ||||
|                 } | ||||
|             }; | ||||
|             persistentPathContainer.Add(persistentPathLabel); | ||||
|  | ||||
|             Button openPersistentPathButton = new(() => { Application.OpenURL(Application.persistentDataPath); }) { | ||||
|                 style = { | ||||
|                     fontSize = 12, | ||||
|                     width = 48 | ||||
|                 }, | ||||
|                 text = "Open" | ||||
|             }; | ||||
|             persistentPathContainer.Add(openPersistentPathButton); | ||||
|  | ||||
|             rootContainer.Add(persistentPathContainer); | ||||
|  | ||||
|             return rootContainer; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/RebootWindow/HomeView.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/RebootWindow/HomeView.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 1e5060e00fe74a0aa4013a814a91137c | ||||
| timeCreated: 1744462818 | ||||
							
								
								
									
										76
									
								
								Editor/RebootWindow/RebootEditorWindow.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								Editor/RebootWindow/RebootEditorWindow.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,76 @@ | ||||
| using RebootKit.Engine; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEditor; | ||||
| using UnityEngine; | ||||
| using UnityEngine.UIElements; | ||||
| using Logger = RebootKit.Engine.Foundation.Logger; | ||||
|  | ||||
| namespace RebootKitEditor.RebootWindow { | ||||
|     static class RTheme { | ||||
|         public static readonly Color s_FirstColor = ColorFromHex("#B9B8B9"); | ||||
|         public static readonly Color s_SecondColor = ColorFromHex("#6B6B6B"); | ||||
|         public static readonly Color s_BackgroundPrimaryColor = EditorGUIUtility.isProSkin ? ColorFromHex("#1E1E1E") : ColorFromHex("#F0F0F0"); | ||||
|         public static readonly Color s_BackgroundSecondaryColor = ColorFromHex("#242126"); | ||||
|         public static readonly Color s_TextColor = ColorFromHex("#696969"); | ||||
|  | ||||
|         static Color ColorFromHex(string hex) { | ||||
|             if (ColorUtility.TryParseHtmlString(hex, out Color color)) { | ||||
|                 return color; | ||||
|             } else { | ||||
|                 Debug.LogError($"Failed to parse color from hex: {hex}"); | ||||
|                 return Color.white; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public class RebootEditorWindow : EditorWindow { | ||||
|         static readonly Logger s_logger = new(nameof(RebootEditorWindow)); | ||||
|  | ||||
|         EngineConfigAsset m_EngineConfigAsset; | ||||
|         DIContext m_DIContext; | ||||
|  | ||||
|         VisualElement m_RootElement; | ||||
|         TabView m_TabView; | ||||
|  | ||||
|         [MenuItem(REditorConsts.k_EditorMenu + "RebootKit")] | ||||
|         public static void ShowWindow() { | ||||
|             RebootEditorWindow window = GetWindow<RebootEditorWindow>($"RebootKit - {Application.productName}"); | ||||
|             window.Show(); | ||||
|         } | ||||
|  | ||||
|         void OnEnable() { | ||||
|             m_EngineConfigAsset = Resources.Load<EngineConfigAsset>(RConsts.k_EngineConfigResourcesPath); | ||||
|             if (m_EngineConfigAsset == null) { | ||||
|                 EngineConfigAsset newConfig = CreateInstance<EngineConfigAsset>(); | ||||
|                 newConfig.name = RConsts.k_EngineConfigAssetName; | ||||
|                 AssetDatabase.CreateAsset(newConfig, RConsts.k_EngineConfigAssetPath); | ||||
|                 AssetDatabase.SaveAssets(); | ||||
|                 AssetDatabase.Refresh(); | ||||
|                 s_logger.Info($"Created new engine config asset at: {RConsts.k_EngineConfigAssetPath}"); | ||||
|                  | ||||
|                 m_EngineConfigAsset = Resources.Load<EngineConfigAsset>(RConsts.k_EngineConfigResourcesPath); | ||||
|                 if (m_EngineConfigAsset == null) { | ||||
|                     s_logger.Error($"Couldn't load engine config from resources: {RConsts.k_EngineConfigResourcesPath}"); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             m_DIContext = new DIContext(); | ||||
|             m_DIContext.Bind(this); | ||||
|             m_DIContext.Bind(m_EngineConfigAsset); | ||||
|  | ||||
|             m_TabView = m_DIContext.Create<TabView>(); | ||||
|             m_TabView.AddTab("Home", m_DIContext.Create<HomeView>()); | ||||
|             m_TabView.AddTab("Config Vars", m_DIContext.Create<ConfigVarsView>()); | ||||
|             m_TabView.AddTab("Game Services", m_DIContext.Create<GameServicesView>()); | ||||
|             m_TabView.AddTab("Worlds", m_DIContext.Create<WorldsView>()); | ||||
|         } | ||||
|  | ||||
|         void CreateGUI() { | ||||
|             m_RootElement = rootVisualElement; | ||||
|             m_RootElement.Clear(); | ||||
|  | ||||
|             m_RootElement.Add(m_TabView.Build()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/RebootWindow/RebootEditorWindow.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/RebootWindow/RebootEditorWindow.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 25dcbb2930b3453cacf147ab342a7bc6 | ||||
| timeCreated: 1744413484 | ||||
							
								
								
									
										127
									
								
								Editor/RebootWindow/TabView.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								Editor/RebootWindow/TabView.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,127 @@ | ||||
| using System.Collections.Generic; | ||||
| using RebootKit.Engine.UI; | ||||
| using UnityEngine; | ||||
| using UnityEngine.Assertions; | ||||
| using UnityEngine.UIElements; | ||||
|  | ||||
| namespace RebootKitEditor.RebootWindow { | ||||
|     public class TabView : IView { | ||||
|         struct Tab { | ||||
|             public string name; | ||||
|             public IView view; | ||||
|             public VisualElement container; | ||||
|         } | ||||
|  | ||||
|         readonly List<Tab> m_Tabs = new(); | ||||
|         readonly List<VisualElement> m_TabContents = new(); | ||||
|         readonly List<Button> m_TabButtons = new(); | ||||
|         int m_CurrentTabIndex = -1; | ||||
|  | ||||
|         public void Dispose() { | ||||
|         } | ||||
|  | ||||
|         public VisualElement Build() { | ||||
|             VisualElement rootContainer = new() { | ||||
|                 style = { | ||||
|                     flexDirection = FlexDirection.Row, | ||||
|                     flexGrow = 1, | ||||
|                     width = new StyleLength(new Length(100, LengthUnit.Percent)), | ||||
|                     height = new StyleLength(new Length(100, LengthUnit.Percent)), | ||||
|                     backgroundColor = RTheme.s_BackgroundPrimaryColor | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             VisualElement tabContainer = new() { | ||||
|                 style = { | ||||
|                     flexDirection = FlexDirection.Row, | ||||
|                     width = new StyleLength(new Length(100, LengthUnit.Percent)), | ||||
|                 } | ||||
|             }; | ||||
|             rootContainer.Add(tabContainer); | ||||
|  | ||||
|             VisualElement tabButtonsContainer = new() { | ||||
|                 style = { | ||||
|                     flexDirection = FlexDirection.Column, | ||||
|                     borderRightWidth = 1, | ||||
|                     borderRightColor = new Color(0.1f, 0.1f, 0.1f), | ||||
|                     width = 100, | ||||
|                     fontSize = 24, | ||||
|                     backgroundColor = RTheme.s_BackgroundSecondaryColor | ||||
|                 } | ||||
|             }; | ||||
|             tabContainer.Add(tabButtonsContainer); | ||||
|  | ||||
|             VisualElement contentContainer = new() { | ||||
|                 style = { | ||||
|                     flexGrow = 1, | ||||
|                     paddingLeft = 4, | ||||
|                     paddingRight = 4, | ||||
|                     paddingTop = 4, | ||||
|                     paddingBottom = 4, | ||||
|                 } | ||||
|             }; | ||||
|             tabContainer.Add(contentContainer); | ||||
|  | ||||
|             for (int i = 0; i < m_Tabs.Count; i++) { | ||||
|                 Tab tab = m_Tabs[i]; | ||||
|                 int index = i; | ||||
|  | ||||
|                 Button button = new(() => SetActiveTab(index)) { | ||||
|                     text = tab.name, | ||||
|                     style = { | ||||
|                         paddingLeft = 8, | ||||
|                         paddingRight = 8, | ||||
|                         paddingTop = 4, | ||||
|                         paddingBottom = 4, | ||||
|                         borderTopLeftRadius = 0, | ||||
|                         borderTopRightRadius = 0, | ||||
|                         borderBottomLeftRadius = 0, | ||||
|                         borderBottomRightRadius = 0, | ||||
|                         backgroundColor = new Color(0.2f, 0.2f, 0.2f) | ||||
|                     } | ||||
|                 }; | ||||
|                 tabButtonsContainer.Add(button); | ||||
|                 m_TabButtons.Add(button); | ||||
|                  | ||||
|                 VisualElement tabContent = tab.container; | ||||
|                 tabContent.style.display = DisplayStyle.None; | ||||
|                 contentContainer.Add(tabContent); | ||||
|                 m_TabContents.Add(tabContent); | ||||
|             } | ||||
|  | ||||
|             SetActiveTab(0); | ||||
|             return rootContainer; | ||||
|         } | ||||
|  | ||||
|         public void AddTab(string name, IView view) { | ||||
|             VisualElement tabContainer = new() { | ||||
|                 name = "rr_tab__container", | ||||
|                 style = { | ||||
|                     flexGrow = 1 | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             VisualElement viewVisualElement = view.Build(); | ||||
|             Assert.IsNotNull(viewVisualElement); | ||||
|  | ||||
|             tabContainer.Add(viewVisualElement); | ||||
|  | ||||
|             m_Tabs.Add(new Tab { | ||||
|                 name = name, | ||||
|                 view = view, | ||||
|                 container = tabContainer | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         void SetActiveTab(int index) { | ||||
|             if (m_CurrentTabIndex >= 0) { | ||||
|                 m_TabContents[m_CurrentTabIndex].style.display = DisplayStyle.None; | ||||
|                 m_TabButtons[m_CurrentTabIndex].style.backgroundColor = new Color(0.2f, 0.2f, 0.2f); | ||||
|             } | ||||
|  | ||||
|             m_CurrentTabIndex = index; | ||||
|             m_TabContents[index].style.display = DisplayStyle.Flex; | ||||
|             m_TabButtons[index].style.backgroundColor = new Color(0.3f, 0.3f, 0.3f); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/RebootWindow/TabView.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/RebootWindow/TabView.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 1d942fb2f5d9473fb7f002225208a5ea | ||||
| timeCreated: 1744461699 | ||||
							
								
								
									
										95
									
								
								Editor/RebootWindow/WorldsView.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								Editor/RebootWindow/WorldsView.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | ||||
| using RebootKit.Engine; | ||||
| using RebootKit.Engine.Services.Simulation; | ||||
| using RebootKit.Engine.UI; | ||||
| using RebootKitEditor.Utils; | ||||
| using UnityEditor; | ||||
| using UnityEditor.SceneManagement; | ||||
| using UnityEngine; | ||||
| using UnityEngine.SceneManagement; | ||||
| using UnityEngine.UIElements; | ||||
|  | ||||
| namespace RebootKitEditor.RebootWindow { | ||||
|     public class WorldsView : IView { | ||||
|         public void Dispose() { | ||||
|         } | ||||
|  | ||||
|         public VisualElement Build() { | ||||
|             VisualElement root = new() { | ||||
|                 style = { | ||||
|                     paddingBottom = 4, | ||||
|                     paddingTop = 4, | ||||
|                     paddingLeft = 4, | ||||
|                     paddingRight = 4, | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             WorldConfigAsset[] worlds = AssetDatabaseEx.LoadAllAssets<WorldConfigAsset>(); | ||||
|             foreach (WorldConfigAsset worldConfigAsset in worlds) { | ||||
|                 VisualElement worldView = CreateWorldView(worldConfigAsset); | ||||
|                 root.Add(worldView); | ||||
|             } | ||||
|  | ||||
|             return root; | ||||
|         } | ||||
|  | ||||
|         VisualElement CreateWorldView(WorldConfigAsset worldConfigAsset) { | ||||
|             VisualElement root = new() { | ||||
|                 style = { | ||||
|                     backgroundColor = new Color(0.1f, 0.1f, 0.1f), | ||||
|                     paddingBottom = 4, | ||||
|                     paddingTop = 4, | ||||
|                     paddingLeft = 4, | ||||
|                     paddingRight = 4, | ||||
|                     borderBottomLeftRadius = 4, | ||||
|                     borderBottomRightRadius = 4 | ||||
|                 } | ||||
|             }; | ||||
|  | ||||
|             Label label = new(worldConfigAsset.name) { | ||||
|                 style = { | ||||
|                     color = new Color(0.7f, 0.9f, 0.9f), | ||||
|                     unityFontStyleAndWeight = FontStyle.Bold | ||||
|                 } | ||||
|             }; | ||||
|             root.Add(label); | ||||
|              | ||||
|             Button openButton = new(() => OpenWorldScenes(worldConfigAsset)) { | ||||
|                 text = "Open", | ||||
|                 style = { | ||||
|                     backgroundColor = new Color(0.2f, 0.2f, 0.2f), | ||||
|                     paddingBottom = 4, | ||||
|                     paddingTop = 4, | ||||
|                     paddingLeft = 4, | ||||
|                     paddingRight = 4, | ||||
|                     borderBottomLeftRadius = 4, | ||||
|                     borderBottomRightRadius = 4 | ||||
|                 } | ||||
|             }; | ||||
|             root.Add(openButton); | ||||
|  | ||||
|             return root; | ||||
|         } | ||||
|  | ||||
|         static void OpenWorldScenes(WorldConfigAsset worldConfigAsset) { | ||||
|             if (worldConfigAsset == null) { | ||||
|                 Debug.LogError("WorldConfigAsset is null"); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             EditorSceneManager.SaveOpenScenes(); | ||||
|              | ||||
|             // Load first scene from build settings | ||||
|             string mainScenePath = SceneManager.GetSceneByBuildIndex(RConsts.k_MainSceneBuildIndex).path; | ||||
|             EditorSceneManager.OpenScene(mainScenePath, OpenSceneMode.Single); | ||||
|  | ||||
|             // Load world scene | ||||
|             string worldScenePath = AssetDatabase.GetAssetPath(worldConfigAsset.Config.mainScene.editorAsset); | ||||
|             if (string.IsNullOrEmpty(worldScenePath)) { | ||||
|                 Debug.LogError($"WorldConfigAsset {worldConfigAsset.name} has invalid main scene path"); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             SceneManager.SetActiveScene(EditorSceneManager.OpenScene(worldScenePath, OpenSceneMode.Additive)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/RebootWindow/WorldsView.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/RebootWindow/WorldsView.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: b094308e934942518d766f7fd5178549 | ||||
| timeCreated: 1744660361 | ||||
							
								
								
									
										17
									
								
								Editor/Utils/AssetDatabaseEx.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Editor/Utils/AssetDatabaseEx.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| using UnityEditor; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKitEditor.Utils { | ||||
|     public static class AssetDatabaseEx { | ||||
|         public static T[] LoadAllAssets<T>() where T : Object { | ||||
|             string[] guids = AssetDatabase.FindAssets($"t:{typeof(T).Name}"); | ||||
|             T[] assets = new T[guids.Length]; | ||||
|             for (int i = 0; i < guids.Length; i++) { | ||||
|                 string path = AssetDatabase.GUIDToAssetPath(guids[i]); | ||||
|                 assets[i] = AssetDatabase.LoadAssetAtPath<T>(path); | ||||
|             } | ||||
|  | ||||
|             return assets; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Editor/Utils/AssetDatabaseEx.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Editor/Utils/AssetDatabaseEx.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 59e4d03719034eccb354318815416f1c | ||||
| timeCreated: 1744660576 | ||||
							
								
								
									
										14
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								README.md
									
									
									
									
									
								
							| @@ -1,8 +1,13 @@ | ||||
| # RebootKit | ||||
|  | ||||
| # Dependencies | ||||
| # Installation | ||||
|  | ||||
| Before using RebootKit, ensure you have the following dependencies installed in your Unity project: | ||||
| ### nuget | ||||
|  | ||||
| Install nuget package manager for unity from the unity package manager. | ||||
| And install the following packages: | ||||
| - **R3** by Cysharp | ||||
| - **ZLinq** by Cysharp | ||||
|  | ||||
| ### manifest.json | ||||
| Ensure you have the following dependencies in your `Packages/manifest.json` file: | ||||
| @@ -10,7 +15,10 @@ Ensure you have the following dependencies in your `Packages/manifest.json` file | ||||
| ```json | ||||
| { | ||||
|   "dependencies": { | ||||
|     "com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask" | ||||
|     "com.cysharp.r3": "https://github.com/Cysharp/R3.git?path=src/R3.Unity/Assets/R3.Unity", | ||||
|     "com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask", | ||||
|     "com.cysharp.zlinq": "https://github.com/Cysharp/ZLinq.git?path=src/ZLinq.Unity/Assets/ZLinq.Unity", | ||||
|     "com.github-glitchenzo.nugetforunity": "https://github.com/GlitchEnzo/NuGetForUnity.git?path=/src/NuGetForUnity", | ||||
|   } | ||||
| } | ||||
| ``` | ||||
|   | ||||
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 58 KiB | 
| @@ -1,4 +1,5 @@ | ||||
| using UnityEngine; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine { | ||||
|     [CreateAssetMenu(menuName = RConsts.k_AddComponentMenu + RConsts.k_EngineConfigAssetName, fileName = RConsts.k_EngineConfigAssetName)] | ||||
| @@ -6,6 +7,8 @@ namespace RebootKit.Engine { | ||||
|         public bool initializeOnLoad = true; | ||||
|  | ||||
|         public EngineCoreServicesAsset coreServices; | ||||
|         public ServiceAsset[] services; | ||||
|          | ||||
|         public AppConfig appConfig; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -5,7 +5,11 @@ using Object = UnityEngine.Object; | ||||
| namespace RebootKit.Engine.Extensions { | ||||
|     public static class TransformEx { | ||||
|         public static void DestroyChildren(this Transform transform) { | ||||
|             foreach (Transform child in transform) Object.Destroy(child); | ||||
|             foreach (Transform child in transform) { | ||||
|                 if (child.OrNull() != null) { | ||||
|                     Object.Destroy(child.gameObject); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public static void ForEachChild(this Transform transform, Action<Transform> action) { | ||||
|   | ||||
| @@ -45,7 +45,7 @@ namespace RebootKit.Engine.Services.Console { | ||||
|         public override string ToString() { | ||||
|             return kind switch { | ||||
|                 CVarValueKind.Number => numberValue.ToString(), | ||||
|                 CVarValueKind.String => $"\"{stringValue}\"", | ||||
|                 CVarValueKind.String => $"{stringValue}", | ||||
|                 _ => throw new ArgumentOutOfRangeException() | ||||
|             }; | ||||
|         } | ||||
| @@ -53,17 +53,21 @@ namespace RebootKit.Engine.Services.Console { | ||||
| 
 | ||||
|     [Flags] | ||||
|     public enum CVarFlags { | ||||
|         None, Persistent, ReadOnly | ||||
|         None = 0, | ||||
|         Client = 1 << 0, | ||||
|         Server = 1 << 1, | ||||
|         ReadOnly = 1 << 2, | ||||
|         User = 1 << 3, | ||||
|     } | ||||
| 
 | ||||
|     [Serializable] | ||||
|     public class CVar { | ||||
|     public class ConfigVar { | ||||
|         public CVarFlags flags; | ||||
|         public string name; | ||||
|         public string description; | ||||
|         public CVarValue defaultValue; | ||||
| 
 | ||||
|         public CVar(CVar other) { | ||||
|         public ConfigVar(ConfigVar other) { | ||||
|             flags = other.flags; | ||||
|             name = other.name; | ||||
|             description = other.description; | ||||
| @@ -71,35 +75,35 @@ namespace RebootKit.Engine.Services.Console { | ||||
|             Value = other.Value; | ||||
|         } | ||||
| 
 | ||||
|         public CVar(string name, CVarValue value, string description = "") { | ||||
|         public ConfigVar(string name, CVarValue value, string description = "") { | ||||
|             this.name = name; | ||||
|             this.description = description; | ||||
|             defaultValue = value; | ||||
|             Value = defaultValue; | ||||
|         } | ||||
| 
 | ||||
|         public CVar(string name, int value, string description = "") { | ||||
|         public ConfigVar(string name, int value, string description = "") { | ||||
|             this.name = name; | ||||
|             this.description = description; | ||||
|             defaultValue = new CVarValue(value); | ||||
|             Value = defaultValue; | ||||
|         } | ||||
| 
 | ||||
|         public CVar(string name, float value, string description = "") { | ||||
|         public ConfigVar(string name, float value, string description = "") { | ||||
|             this.name = name; | ||||
|             this.description = description; | ||||
|             defaultValue = new CVarValue(value); | ||||
|             Value = defaultValue; | ||||
|         } | ||||
| 
 | ||||
|         public CVar(string name, double value, string description = "") { | ||||
|         public ConfigVar(string name, double value, string description = "") { | ||||
|             this.name = name; | ||||
|             this.description = description; | ||||
|             defaultValue = new CVarValue(value); | ||||
|             Value = defaultValue; | ||||
|         } | ||||
| 
 | ||||
|         public CVar(string name, string value, string description = "") { | ||||
|         public ConfigVar(string name, string value, string description = "") { | ||||
|             this.name = name; | ||||
|             this.description = description; | ||||
|             defaultValue = new CVarValue(value); | ||||
| @@ -113,43 +117,54 @@ namespace RebootKit.Engine.Services.Console { | ||||
|         public double NumberValue => Value.numberValue; | ||||
|         public string StringValue => Value.stringValue; | ||||
| 
 | ||||
|         public event Action StateChanged = delegate { }; | ||||
|         public static event Action<ConfigVar> StateChanged = delegate { }; | ||||
| 
 | ||||
|         public void Set(int value) { | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             Value = new CVarValue(value); | ||||
|             StateChanged?.Invoke(); | ||||
|             StateChanged?.Invoke(this); | ||||
|         } | ||||
| 
 | ||||
|         public void Set(float value) { | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             Value = new CVarValue(value); | ||||
|             StateChanged?.Invoke(); | ||||
|             StateChanged?.Invoke(this); | ||||
|         } | ||||
| 
 | ||||
|         public void Set(string value) { | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             Value = new CVarValue(value); | ||||
|             StateChanged?.Invoke(); | ||||
|             StateChanged?.Invoke(this); | ||||
|         } | ||||
| 
 | ||||
|         public void ParseFromString(string str) { | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (float.TryParse(str, out float f)) | ||||
|             if (float.TryParse(str, out float f)) { | ||||
|                 Set(f); | ||||
|             else | ||||
|             } else { | ||||
|                 Set(str); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void Reset() { | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; | ||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             Value = defaultValue; | ||||
|             StateChanged?.Invoke(); | ||||
|             StateChanged?.Invoke(this); | ||||
|         } | ||||
| 
 | ||||
|         public override string ToString() { | ||||
							
								
								
									
										153
									
								
								Runtime/Engine/Code/Foundation/ConfigVarsContainer.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								Runtime/Engine/Code/Foundation/ConfigVarsContainer.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,153 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Reflection; | ||||
| using System.Text; | ||||
| using RebootKit.Engine.Services.Console; | ||||
| using UnityEngine; | ||||
| using ZLinq; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     [AttributeUsage(AttributeTargets.Field)] | ||||
|     public class ConfigVarAttribute : Attribute { | ||||
|         public ConfigVarAttribute(string name, float defaultValue, string description = "", CVarFlags flags = CVarFlags.Client) { | ||||
|             Name = name; | ||||
|             Description = description; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|             Flags = flags; | ||||
|         } | ||||
|  | ||||
|         public ConfigVarAttribute(string name, double defaultValue, string description = "", CVarFlags flags = CVarFlags.Client) { | ||||
|             Name = name; | ||||
|             Description = description; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|             Flags = flags; | ||||
|         } | ||||
|  | ||||
|         public ConfigVarAttribute(string name, string defaultValue, string description = "",  CVarFlags flags = CVarFlags.Client) { | ||||
|             Name = name; | ||||
|             Description = description; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|             Flags = flags; | ||||
|         } | ||||
|  | ||||
|         public ConfigVarAttribute(string name, int defaultValue, string description = "", CVarFlags flags = CVarFlags.Client) { | ||||
|             Name = name; | ||||
|             Description = description; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|             Flags = flags; | ||||
|         } | ||||
|  | ||||
|         internal string Name { get; } | ||||
|         internal string Description { get; } | ||||
|         internal CVarValue Value { get; } | ||||
|         internal CVarFlags Flags { get; } | ||||
|     } | ||||
|  | ||||
|     public static class ConfigVarsContainer { | ||||
|         static readonly Logger s_logger = new(nameof(ConfigVarsContainer)); | ||||
|  | ||||
|         static readonly List<ConfigVar> s_configVars = new(); | ||||
|  | ||||
|         public static void Register(ConfigVar cvar) { | ||||
|             if (s_configVars.AsValueEnumerable().Any(c => c.name.Equals(cvar.name, StringComparison.Ordinal))) { | ||||
|                 throw new Exception($"CVar with name '{cvar.name}' already exists"); | ||||
|             } | ||||
|  | ||||
|             s_configVars.Add(cvar); | ||||
|             s_logger.Info($"Registered CVar: {cvar.name}"); | ||||
|         } | ||||
|  | ||||
|         public static void Clear() { | ||||
|             s_configVars.Clear(); | ||||
|             s_logger.Info("Cleared all CVars"); | ||||
|         } | ||||
|  | ||||
|         public static ConfigVar Get(string name) { | ||||
|             return s_configVars.AsValueEnumerable().FirstOrDefault(c => c.name.Equals(name, StringComparison.Ordinal)); | ||||
|         } | ||||
|  | ||||
|         public static IEnumerable<ConfigVar> All() => s_configVars; | ||||
|  | ||||
|         public static void Init() { | ||||
|             Clear(); | ||||
|  | ||||
|             Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); | ||||
|  | ||||
|             foreach (Assembly assembly in assemblies) { | ||||
|                 Type[] types = assembly.GetTypes(); | ||||
|  | ||||
|                 foreach (Type type in types) { | ||||
|                     FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); | ||||
|  | ||||
|                     foreach (FieldInfo field in fields) { | ||||
|                         if (Attribute.IsDefined(field, typeof(ConfigVarAttribute))) { | ||||
|                             ConfigVarAttribute cvarAttribute = field.GetCustomAttribute<ConfigVarAttribute>(); | ||||
|  | ||||
|                             ConfigVar cvar = Get(cvarAttribute.Name); | ||||
|                             if (cvar == null) { | ||||
|                                 cvar = new ConfigVar(cvarAttribute.Name, cvarAttribute.Value, cvarAttribute.Description) { | ||||
|                                     flags = cvarAttribute.Flags | ||||
|                                 }; | ||||
|                                 Register(cvar); | ||||
|                             } | ||||
|                              | ||||
|                             field.SetValue(null, cvar); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             Load(); | ||||
|         } | ||||
|  | ||||
|         public static void Save() { | ||||
|             string path = Application.persistentDataPath + "/" + RConsts.k_CVarsFilename; | ||||
|              | ||||
|             s_logger.Info("Saving cvars to file: " + path); | ||||
|  | ||||
|             StringBuilder sb = new(); | ||||
|  | ||||
|             foreach (ConfigVar cvar in All()) { | ||||
|                 if (!cvar.flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                     sb.AppendFormat("{0} {1}\n", cvar.name, cvar); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             File.WriteAllText(path, sb.ToString()); | ||||
|         } | ||||
|  | ||||
|         public static void Load() { | ||||
|             string path = Application.persistentDataPath + "/" + RConsts.k_CVarsFilename; | ||||
|             if (!File.Exists(path)) { | ||||
|                 s_logger.Info("CVar file not found, skipping load"); | ||||
|                 return; | ||||
|             } | ||||
|              | ||||
|             s_logger.Info("Loading cvars from file: " + path); | ||||
|             string[] lines = File.ReadAllLines(path); | ||||
|             foreach (string line in lines) { | ||||
|                 string[] parts = line.Split(' '); | ||||
|                 if (parts.Length < 2) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 string name = parts[0]; | ||||
|                 string value = parts[1]; | ||||
|  | ||||
|                 ConfigVar cvar = Get(name); | ||||
|                 if (cvar != null) { | ||||
|                     cvar.Value.CopyFrom(new CVarValue(value)); | ||||
|                     s_logger.Info($"Loaded CVar: {name} = {value}"); | ||||
|                 } else { | ||||
|                     cvar = new ConfigVar(name, value) { | ||||
|                         flags = CVarFlags.User | ||||
|                     }; | ||||
|                     cvar.ParseFromString(value); | ||||
|  | ||||
|                     Register(cvar); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										9
									
								
								Runtime/Engine/Code/Foundation/ConstantsAsset.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Runtime/Engine/Code/Foundation/ConstantsAsset.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     public class ConstantsAsset<T> : RAsset { | ||||
|         [SerializeField] T m_Value; | ||||
|  | ||||
|         public T Value => m_Value; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstantsAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstantsAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 602c79db950d497ea9800a6538aa7ab6 | ||||
| timeCreated: 1743848110 | ||||
							
								
								
									
										7
									
								
								Runtime/Engine/Code/Foundation/ConstsColorAsset.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/Code/Foundation/ConstsColorAsset.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     [CreateAssetMenu(menuName = RConsts.k_CreateAssetMenu + "Constants/Consts Color")] | ||||
|     public class ConstsColorAsset : ConstantsAsset<Color> { | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsColorAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsColorAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 5055a0315a6942988576e3dc5fa72368 | ||||
| timeCreated: 1743848378 | ||||
							
								
								
									
										7
									
								
								Runtime/Engine/Code/Foundation/ConstsFloatAsset.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/Code/Foundation/ConstsFloatAsset.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     [CreateAssetMenu(menuName = RConsts.k_CreateAssetMenu + "Constants/Consts Float")] | ||||
|     public class ConstsFloatAsset : ConstantsAsset<float> { | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsFloatAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsFloatAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 82df0e4f31ac4722ae6ec18f66815179 | ||||
| timeCreated: 1743848335 | ||||
							
								
								
									
										7
									
								
								Runtime/Engine/Code/Foundation/ConstsIntAsset.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/Code/Foundation/ConstsIntAsset.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     [CreateAssetMenu(menuName = RConsts.k_CreateAssetMenu + "Constants/Consts Int")] | ||||
|     public class ConstsIntAsset : ConfigAsset<int> { | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsIntAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsIntAsset.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 064ad4ee1c584489b0c65417e8b500ea | ||||
| timeCreated: 1743848190 | ||||
							
								
								
									
										37
									
								
								Runtime/Engine/Code/Foundation/ConstsProperty.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								Runtime/Engine/Code/Foundation/ConstsProperty.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| using System; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     [Serializable] | ||||
|     public struct ConstsProperty<T> { | ||||
|         [SerializeField] T m_InlineValue; | ||||
|         [SerializeField] ConstantsAsset<T> m_Asset; | ||||
|         [SerializeField] bool m_UseInlineValue; | ||||
|          | ||||
|         public ConstsProperty(T value) { | ||||
|             m_InlineValue = value; | ||||
|             m_Asset = null; | ||||
|             m_UseInlineValue = true; | ||||
|         } | ||||
|          | ||||
|         public ConstsProperty(ConstantsAsset<T> asset) { | ||||
|             m_InlineValue = default; | ||||
|             m_Asset = asset; | ||||
|             m_UseInlineValue = false; | ||||
|         } | ||||
|  | ||||
|         public T Value { | ||||
|             get { | ||||
|                 if (m_UseInlineValue) { | ||||
|                     return m_InlineValue; | ||||
|                 } | ||||
|                  | ||||
|                 if (m_Asset != null) { | ||||
|                     return m_Asset.Value; | ||||
|                 } | ||||
|  | ||||
|                 return default; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsProperty.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/Foundation/ConstsProperty.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 426c2ae5506c4629bf757f51c5b94249 | ||||
| timeCreated: 1743848423 | ||||
| @@ -2,6 +2,7 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Reflection; | ||||
| using ZLinq; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method)] | ||||
| @@ -28,7 +29,9 @@ namespace RebootKit.Engine.Foundation { | ||||
|         } | ||||
|  | ||||
|         public void Bind(Type type, object obj) { | ||||
|             if (!m_BindingsMaps.TryAdd(type, obj)) s_logger.Error($"Cannot bind to '{type}', slot is already occupied"); | ||||
|             if (!m_BindingsMaps.TryAdd(type, obj)) { | ||||
|                 s_logger.Error($"Cannot bind to '{type}', slot is already occupied"); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public void Bind<TBind>(TBind obj) { | ||||
| @@ -60,15 +63,20 @@ namespace RebootKit.Engine.Foundation { | ||||
|             return instance; | ||||
|         } | ||||
|  | ||||
|         public void Inject<T>(T target) { | ||||
|             Type type = typeof(T); | ||||
|         public void Inject(object target) { | ||||
|             Type type = target.GetType(); | ||||
|              | ||||
|             foreach (FieldInfo field in type.GetFields(k_fieldsBindingFlags)) InjectField(field, target); | ||||
|             foreach (FieldInfo field in type.GetFields(k_fieldsBindingFlags)) { | ||||
|                 InjectField(field, target); | ||||
|             } | ||||
|  | ||||
|             foreach (MethodInfo method in type.GetMethods(k_methodsBindingFlags)) { | ||||
|                 if (!Attribute.IsDefined(method, typeof(InjectAttribute))) continue; | ||||
|                 if (!Attribute.IsDefined(method, typeof(InjectAttribute))) { | ||||
|                     continue; | ||||
|                 } | ||||
|  | ||||
|                 Type[] paramsTypes = method.GetParameters() | ||||
|                                            .AsValueEnumerable() | ||||
|                                            .Select(t => t.ParameterType) | ||||
|                                            .ToArray(); | ||||
|  | ||||
| @@ -77,7 +85,9 @@ namespace RebootKit.Engine.Foundation { | ||||
|                 for (int i = 0; i < paramsTypes.Length; ++i) { | ||||
|                     instances[i] = Resolve(paramsTypes[i]); | ||||
|  | ||||
|                     if (instances[i] == null) s_logger.Error($"Failed to resolve method parameter of type `{paramsTypes[i]}`"); | ||||
|                     if (instances[i] == null) { | ||||
|                         s_logger.Error($"Failed to resolve method parameter of type `{paramsTypes[i]}`"); | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 method.Invoke(target, instances); | ||||
| @@ -85,9 +95,11 @@ namespace RebootKit.Engine.Foundation { | ||||
|         } | ||||
|  | ||||
|         bool InjectField(FieldInfo field, object target) { | ||||
|             for (int i = m_FieldInjectors.Count - 1; i >= 0; i--) | ||||
|                 if (m_FieldInjectors[i].Inject(field, target, this)) | ||||
|             for (int i = m_FieldInjectors.Count - 1; i >= 0; i--) { | ||||
|                 if (m_FieldInjectors[i].Inject(field, target, this)) { | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return false; | ||||
|         } | ||||
|   | ||||
| @@ -18,12 +18,16 @@ namespace RebootKit.Engine.Foundation { | ||||
|  | ||||
|             RR.s_Shared = null; | ||||
|  | ||||
|             // unload all scenes | ||||
|  | ||||
|             s_cancellationTokenSource = new CancellationTokenSource(); | ||||
|             RunAsync(s_cancellationTokenSource.Token).Forget(); | ||||
|  | ||||
| #if UNITY_EDITOR | ||||
|             static void OnPlayerModeState(PlayModeStateChange state) { | ||||
|                 if (state == PlayModeStateChange.ExitingPlayMode) s_cancellationTokenSource.Cancel(); | ||||
|                 if (state == PlayModeStateChange.ExitingPlayMode) { | ||||
|                     s_cancellationTokenSource.Cancel(); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             EditorApplication.playModeStateChanged -= OnPlayerModeState; | ||||
| @@ -32,6 +36,9 @@ namespace RebootKit.Engine.Foundation { | ||||
|         } | ||||
|  | ||||
|         static async UniTask RunAsync(CancellationToken cancellationToken) { | ||||
|             s_logger.Info("Loading boot scene"); | ||||
|             SceneManager.LoadScene(RConsts.k_BootSceneBuildIndex, LoadSceneMode.Single); | ||||
|              | ||||
|             s_logger.Info("Loading engine config"); | ||||
|             EngineConfigAsset configAsset = Resources.Load<EngineConfigAsset>(RConsts.k_EngineConfigResourcesPath); | ||||
|             if (configAsset == null) { | ||||
| @@ -54,6 +61,8 @@ namespace RebootKit.Engine.Foundation { | ||||
|  | ||||
|             s_logger.Info("Starting RR"); | ||||
|             instance.Run(); | ||||
|  | ||||
|             await UniTask.WaitUntilCanceled(Application.exitCancellationToken); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -2,6 +2,7 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using JetBrains.Annotations; | ||||
|  | ||||
| namespace RebootKit.Engine.Foundation { | ||||
|     public interface IController : IDisposable { | ||||
| @@ -25,6 +26,16 @@ namespace RebootKit.Engine.Foundation { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public T Get<T>() where T : class, IController { | ||||
|             foreach (TController controller in _controllers) { | ||||
|                 if (controller is T res) { | ||||
|                     return res; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         public bool TryFind<T>(out T outController) where T : IController { | ||||
|             foreach (TController controller in _controllers) { | ||||
|                 if (controller is T res) { | ||||
|   | ||||
| @@ -74,7 +74,7 @@ namespace RebootKit.Engine.Foundation { | ||||
|                 case LogLevel.Warning: | ||||
|                     return $"[W][<b>{name}</b>] <color=#ffffff>{message}</color>"; | ||||
|                 case LogLevel.Error: | ||||
|                     return $"[<b><color=#ff0000>ERROR</color></b>][<b>{name}</b>] <color=#ffffff>{message}</color>"; | ||||
|                     return $"[<b><color=#e83f25>ERROR</color></b>][<b>{name}</b>] <color=#ffffff>{message}</color>"; | ||||
|                 default: | ||||
|                     throw new ArgumentOutOfRangeException(nameof(level), level, null); | ||||
|             } | ||||
|   | ||||
| @@ -11,19 +11,22 @@ namespace RebootKit.Engine.Foundation { | ||||
|     } | ||||
| 
 | ||||
|     [DefaultExecutionOrder(-1000)] | ||||
|     public class SceneDI : MonoBehaviour, IDependencyInstaller { | ||||
|         static readonly Logger s_logger = new(nameof(SceneDI)); | ||||
|     public class SceneContext : MonoBehaviour, IDependencyInstaller { | ||||
|         static readonly Logger s_logger = new(nameof(SceneContext)); | ||||
| 
 | ||||
|         [SerializeField] SceneDependencyInstaller[] m_Installers; | ||||
| 
 | ||||
|         void Awake() { | ||||
|             DIContext context = RR.DIContext; | ||||
|              | ||||
|             foreach (GameObject root in gameObject.scene.GetRootGameObjects()) { | ||||
|                 s_logger.Info("Injecting root game object: " + root.name); | ||||
|                 context.InjectGameObject(root); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public void Install(DIContext context) { | ||||
|             s_logger.Info("Installing scene dependency installers"); | ||||
|             foreach (SceneDependencyInstaller installer in m_Installers) { | ||||
|                 installer.Install(context); | ||||
|             } | ||||
| @@ -1,17 +1,15 @@ | ||||
| using RebootKit.Engine.Foundation; | ||||
| using RebootKit.Engine.Graphics; | ||||
| using RebootKit.Engine.Services.ConsoleUI; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine { | ||||
|     public class MainSceneInstaller : SceneDependencyInstaller { | ||||
|         [SerializeField] MainCameraService _mainCameraService; | ||||
|  | ||||
|         [SerializeField] ConsoleUIService _consoleUIService; | ||||
|  | ||||
|         public override void Install(DIContext context) { | ||||
|             context.Bind(_mainCameraService); | ||||
|             context.Bind(_consoleUIService); | ||||
|             foreach (GameObject rootGameObject in gameObject.scene.GetRootGameObjects()) { | ||||
|                 IService[] services = rootGameObject.GetComponentsInParent<IService>(); | ||||
|                 foreach (IService service in services) { | ||||
|                     context.Bind(service.GetType(), service); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,13 +1,20 @@ | ||||
| namespace RebootKit.Engine { | ||||
|     public static class RConsts { | ||||
|         public const int k_MainSceneBuildIndex = 0; | ||||
|         public const int k_BootSceneBuildIndex = 0; | ||||
|         public const int k_MainSceneBuildIndex = 1; | ||||
|         public const string k_FilenamePrefix = "rr_"; | ||||
|  | ||||
|         public const string k_EngineConfigAssetName = "RealityRebootKit"; | ||||
|         public const string k_EngineConfigResourcesPath = "TheGame/" + k_EngineConfigAssetName; | ||||
|         public const string k_EngineConfigAssetPath = "Assets/TheGame/" + k_EngineConfigAssetName + ".asset"; | ||||
|  | ||||
|         internal const string k_AddComponentMenu = "Reboot Reality/"; | ||||
|         internal const string k_ServiceAssetMenu = k_AddComponentMenu + "Services/"; | ||||
|         internal const string k_WorldAssetMenu = k_AddComponentMenu + "World/"; | ||||
|          | ||||
|         internal const string k_CreateAssetMenu = "Reboot Reality/"; | ||||
|         internal const string k_ServiceAssetMenu = k_CreateAssetMenu + "Services/"; | ||||
|         internal const string k_WorldAssetMenu = k_CreateAssetMenu + "World/"; | ||||
|          | ||||
|         internal const string k_CVarsFilename = k_FilenamePrefix + "cvars.txt"; | ||||
|  | ||||
|         internal const string k_BuildFlagDebug = "RR_DEBUG"; | ||||
|     } | ||||
|   | ||||
| @@ -13,38 +13,36 @@ namespace RebootKit.Engine { | ||||
|         public static GameService Game => s_Shared.m_GameService; | ||||
|         public static DIContext DIContext => s_Shared.m_DIContext; | ||||
|          | ||||
|         public static UnityEvent<string, CVarValue> CVarChanged => s_Shared.m_CVarChanged; | ||||
|          | ||||
|         public static CVar CVarIndex(string name, int defaultValue = -1) { | ||||
|             CVar cvar = Console.GetCVar(name); | ||||
|         public static ConfigVar CVarIndex(string name, int defaultValue = -1) { | ||||
|             ConfigVar cvar = ConfigVarsContainer.Get(name); | ||||
|             if (cvar != null) { | ||||
|                 return cvar; | ||||
|             } | ||||
|  | ||||
|             cvar = new CVar(name, defaultValue); | ||||
|             Console.Replace(cvar); | ||||
|             cvar = new ConfigVar(name, defaultValue); | ||||
|             ConfigVarsContainer.Register(cvar); | ||||
|             return cvar; | ||||
|         } | ||||
|  | ||||
|         public static CVar CVarNumber(string name, double defaultValue = 0) { | ||||
|             CVar cvar = Console.GetCVar(name); | ||||
|         public static ConfigVar CVarNumber(string name, double defaultValue = 0) { | ||||
|             ConfigVar cvar = ConfigVarsContainer.Get(name); | ||||
|             if (cvar != null) { | ||||
|                 return cvar; | ||||
|             } | ||||
|  | ||||
|             cvar = new CVar(name, defaultValue); | ||||
|             Console.Replace(cvar); | ||||
|             cvar = new ConfigVar(name, defaultValue); | ||||
|             ConfigVarsContainer.Register(cvar); | ||||
|             return cvar; | ||||
|         } | ||||
|  | ||||
|         public static CVar CVarString(string name, string defaultValue = "") { | ||||
|             CVar cvar = Console.GetCVar(name); | ||||
|         public static ConfigVar CVarString(string name, string defaultValue = "") { | ||||
|             ConfigVar cvar = ConfigVarsContainer.Get(name); | ||||
|             if (cvar != null) { | ||||
|                 return cvar; | ||||
|             } | ||||
|  | ||||
|             cvar = new CVar(name, defaultValue); | ||||
|             Console.Replace(cvar); | ||||
|             cvar = new ConfigVar(name, defaultValue); | ||||
|             ConfigVarsContainer.Register(cvar); | ||||
|             return cvar; | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,52 +0,0 @@ | ||||
| using RebootKit.Engine.Foundation; | ||||
|  | ||||
| namespace RebootKit.Engine { | ||||
|     class MainMenuState : IState { | ||||
|         readonly MainMenuConfig m_Config; | ||||
|          | ||||
|         public MainMenuState(MainMenuConfig config) { | ||||
|             m_Config = config; | ||||
|         } | ||||
|          | ||||
|         public void Enter() { | ||||
|         } | ||||
|          | ||||
|         public void Exit() { | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     class PlayState : IState { | ||||
|         readonly GameConfig m_Config; | ||||
|          | ||||
|         public PlayState(GameConfig config) { | ||||
|             m_Config = config; | ||||
|         } | ||||
|          | ||||
|         public void Enter() { | ||||
|         } | ||||
|          | ||||
|         public void Exit() { | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     public partial class RR { | ||||
|         StateMachine<IState> m_AppStateMachine; | ||||
|          | ||||
|         void InitializeAppStateMachine() { | ||||
|             m_AppStateMachine = new StateMachine<IState>(); | ||||
|             m_AppStateMachine.AddState(m_DIContext.Create<MainMenuState>(m_EngineConfigAsset.appConfig.mainMenuConfig)); | ||||
|             m_AppStateMachine.AddState(m_DIContext.Create<PlayState>(m_EngineConfigAsset.appConfig.gameConfig)); | ||||
|         } | ||||
|          | ||||
|         void OpenMainMenu() { | ||||
|             m_AppStateMachine.TransitionTo<MainMenuState>(); | ||||
|         } | ||||
|          | ||||
|         void StartGame() { | ||||
|             m_AppStateMachine.TransitionTo<PlayState>(); | ||||
|         } | ||||
|       | ||||
|         bool IsMainMenuOpen() => m_AppStateMachine.IsStateActive<MainMenuState>(); | ||||
|         bool IsPlaying() => m_AppStateMachine.IsStateActive<PlayState>(); | ||||
|     } | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d7b1b5cbd7e04f38ba5f61a04709336b | ||||
| timeCreated: 1743213081 | ||||
							
								
								
									
										14
									
								
								Runtime/Engine/Code/RR.Game.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								Runtime/Engine/Code/RR.Game.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| using System; | ||||
| using RebootKit.Engine.Services.Game; | ||||
|  | ||||
| namespace RebootKit.Engine { | ||||
|     public partial class RR { | ||||
|         public static void StartGameMode(GameModeAsset gameMode) { | ||||
|             if (gameMode == null) { | ||||
|                 throw new ArgumentNullException(nameof(gameMode)); | ||||
|             } | ||||
|   | ||||
|             s_Shared.m_GameService.Start(gameMode); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/RR.Game.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/RR.Game.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: c614fae80bc84ae8b7f3ee034a42f074 | ||||
| timeCreated: 1743437396 | ||||
| @@ -1,14 +1,13 @@ | ||||
| using System; | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using R3; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using RebootKit.Engine.Services.Console; | ||||
| using RebootKit.Engine.Services.Game; | ||||
| using RebootKit.Engine.Services.Input; | ||||
| using RebootKit.Engine.Services.Simulation; | ||||
| using UnityEngine; | ||||
| using UnityEngine.Assertions; | ||||
| using UnityEngine.Events; | ||||
| using Logger = RebootKit.Engine.Foundation.Logger; | ||||
|  | ||||
| namespace RebootKit.Engine { | ||||
| @@ -17,42 +16,49 @@ namespace RebootKit.Engine { | ||||
|  | ||||
|         static readonly Logger s_logger = new("RR"); | ||||
|  | ||||
|         ConsoleService m_ConsoleService; | ||||
|         DIContext m_DIContext; | ||||
|  | ||||
|         ConsoleService m_ConsoleService; | ||||
|  | ||||
|         EngineConfigAsset m_EngineConfigAsset; | ||||
|         GameService m_GameService; | ||||
|         InputService m_InputService; | ||||
|         WorldService m_WorldService; | ||||
|  | ||||
|         readonly UnityEvent<string, CVarValue> m_CVarChanged = new(); | ||||
|         DisposableBag m_DisposableBag; | ||||
|          | ||||
|         public RR() { | ||||
|             m_DisposableBag = new DisposableBag(); | ||||
|  | ||||
|             m_DIContext = new DIContext(); | ||||
|             // m_DIContext.AddInjector(new CVarFieldInjector()); | ||||
|         } | ||||
|  | ||||
|         public void Dispose() { | ||||
|             m_CVarChanged.RemoveAllListeners(); | ||||
|             s_logger.Info("Shutting down"); | ||||
|             m_DisposableBag.Dispose(); | ||||
|         } | ||||
|  | ||||
|         public async UniTask Init(EngineConfigAsset configAsset, CancellationToken cancellationToken) { | ||||
|             Assert.IsNotNull(configAsset, "Config asset is required"); | ||||
|  | ||||
|             s_logger.Info("Waking up"); | ||||
|             s_logger.Info("Initializing"); | ||||
|             m_EngineConfigAsset = configAsset; | ||||
|  | ||||
|             m_DIContext = new DIContext(); | ||||
|             m_DIContext.AddInjector(new CVarFieldInjector()); | ||||
|  | ||||
|             CreateCoreServices(); | ||||
|             InitializeAppStateMachine(); | ||||
|             CreateServices(); | ||||
|  | ||||
|             await UniTask.Yield(cancellationToken); | ||||
|         } | ||||
|  | ||||
|         public void Run() { | ||||
|             OpenMainMenu(); | ||||
|             StartGameMode(m_EngineConfigAsset.appConfig.gameConfig.defaultGameMode); | ||||
|         } | ||||
|  | ||||
|         TService CreateService<TService>(ServiceAsset<TService> asset) where TService : class, IService { | ||||
|             TService service = asset.Create(m_DIContext); | ||||
|             m_DIContext.Bind(service); | ||||
|             m_DisposableBag.Add(service); | ||||
|             return service; | ||||
|         } | ||||
|  | ||||
| @@ -64,5 +70,11 @@ namespace RebootKit.Engine { | ||||
|             m_WorldService = CreateService(m_EngineConfigAsset.coreServices.worldService); | ||||
|             m_GameService = CreateService(m_EngineConfigAsset.coreServices.gameService); | ||||
|         } | ||||
|          | ||||
|         void CreateServices() { | ||||
|             foreach (ServiceAsset serviceAsset in m_EngineConfigAsset.services) { | ||||
|                 CreateService(serviceAsset); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,16 +0,0 @@ | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Console { | ||||
|     [CreateAssetMenu(menuName = RConsts.k_AddComponentMenu + "cvar", fileName = "cvar")] | ||||
|     public class CVarAsset : ScriptableObject { | ||||
|         [SerializeField] CVar m_CVar; | ||||
|  | ||||
|         public CVar Create(string cvarName = null) { | ||||
|             CVar cvar = new(m_CVar); | ||||
|  | ||||
|             if (cvarName != null) cvar.name = cvarName; | ||||
|  | ||||
|             return cvar; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,3 +0,0 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 443a66c3a441450d96d222872a567df0 | ||||
| timeCreated: 1741639598 | ||||
| @@ -1,57 +0,0 @@ | ||||
| using System; | ||||
| using System.Reflection; | ||||
| using RebootKit.Engine.Foundation; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Console { | ||||
|     [AttributeUsage(AttributeTargets.Field)] | ||||
|     public class CVarAttribute : Attribute { | ||||
|         public CVarAttribute(string name, float defaultValue) { | ||||
|             Name = name; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|         } | ||||
|  | ||||
|         public CVarAttribute(string name, double defaultValue) { | ||||
|             Name = name; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|         } | ||||
|  | ||||
|         public CVarAttribute(string name, string defaultValue) { | ||||
|             Name = name; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|         } | ||||
|  | ||||
|         public CVarAttribute(string name, int defaultValue) { | ||||
|             Name = name; | ||||
|             Value = new CVarValue(defaultValue); | ||||
|         } | ||||
|  | ||||
|         public string Name { get; } | ||||
|         public CVarValue Value { get; } | ||||
|     } | ||||
|  | ||||
|     public class CVarFieldInjector : DIContext.IFieldInjector { | ||||
|         static readonly Logger s_logger = new(nameof(CVarFieldInjector)); | ||||
|  | ||||
|         public bool Inject(FieldInfo field, object target, DIContext context) { | ||||
|             if (!Attribute.IsDefined(field, typeof(CVarAttribute))) return false; | ||||
|  | ||||
|             ConsoleService console = context.Resolve<ConsoleService>(); | ||||
|             if (console == null) { | ||||
|                 s_logger.Error($"Cannot inject field because cannot resolve `{nameof(ConsoleService)}`"); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             CVarAttribute cvarAttribute = field.GetCustomAttribute<CVarAttribute>(); | ||||
|             CVar cvar = console.GetCVar(cvarAttribute.Name); | ||||
|  | ||||
|             if (cvar == null) { | ||||
|                 cvar = new CVar(cvarAttribute.Name, cvarAttribute.Value); | ||||
|                 console.Replace(cvar); | ||||
|             } | ||||
|  | ||||
|             field.SetValue(target, cvar); | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,8 +1,10 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEngine; | ||||
| using Logger = RebootKit.Engine.Foundation.Logger; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Console { | ||||
| @@ -21,104 +23,136 @@ namespace RebootKit.Engine.Services.Console { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public class ConsoleService : IService { | ||||
|         static readonly Logger _logger = new(nameof(ConsoleService)); | ||||
|     public class PrintCVarsCommand : IConsoleCommand { | ||||
|         public string Name { get; } = "print_cvars"; | ||||
|         public string Description { get; } = "Prints all cvars and their values."; | ||||
|  | ||||
|         readonly List<IConsoleCommand> _commands = new(); | ||||
|         readonly List<CVar> _cvars = new(); | ||||
|         public void Execute(string[] args) { | ||||
|             RR.Console.PrintCVars(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public class ConsoleService : IService { | ||||
|         static readonly Logger s_logger = new(nameof(ConsoleService)); | ||||
|  | ||||
|         readonly List<IConsoleCommand> m_ConsoleCommands = new(); | ||||
|  | ||||
|         FileStream m_LogFileStream; | ||||
|         TextWriter m_LogFileWriter; | ||||
|  | ||||
|         bool m_IsLoading; | ||||
|  | ||||
|         public ConsoleService() { | ||||
|             _logger.Info("Waking up"); | ||||
|             ConfigVar.StateChanged += OnCVarStateChanged; | ||||
|              | ||||
|             m_LogFileStream = new FileStream(Application.persistentDataPath + "/rr_logs.txt", FileMode.Append, FileAccess.Write); | ||||
|             m_LogFileWriter = new StreamWriter(m_LogFileStream); | ||||
|              | ||||
|             m_LogFileWriter.WriteLine("============================"); | ||||
|             m_LogFileWriter.WriteLine("Starting new log"); | ||||
|             m_LogFileWriter.WriteLine($" > Game: {Application.productName}"); | ||||
|             m_LogFileWriter.WriteLine($" > Version: {Application.version}"); | ||||
|             m_LogFileWriter.WriteLine($" > Date: {DateTime.Now}"); | ||||
|             m_LogFileWriter.WriteLine("============================"); | ||||
|             m_LogFileWriter.Flush(); | ||||
|  | ||||
|             s_logger.Info("Waking up"); | ||||
|              | ||||
|             Load(); | ||||
|  | ||||
|             RegisterCommand(new PrintCVarsCommand()); | ||||
|             RegisterCommand(new HelpCommand()); | ||||
|         } | ||||
|  | ||||
|         public void Dispose() { | ||||
|             s_logger.Info("Shutting down"); | ||||
|  | ||||
|             ConfigVar.StateChanged -= OnCVarStateChanged; | ||||
|  | ||||
|             m_LogFileWriter.Dispose(); | ||||
|             m_LogFileStream.Dispose(); | ||||
|  | ||||
|             m_LogFileStream = null; | ||||
|             m_LogFileWriter = null; | ||||
|         } | ||||
|  | ||||
|         void OnCVarStateChanged(ConfigVar cvar) { | ||||
|             if (m_IsLoading) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             if (!cvar.flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                 Save(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public event Action<string> OnOutputMessage = _ => { }; | ||||
|  | ||||
|         public void WriteToOutput(string message) { | ||||
|             if (m_LogFileWriter != null) { | ||||
|                 m_LogFileWriter.WriteLine(message); | ||||
|                 m_LogFileWriter.Flush(); | ||||
|             } | ||||
|  | ||||
|             OnOutputMessage?.Invoke(message); | ||||
|         } | ||||
|  | ||||
|         public bool CVarExists(string name) { | ||||
|             foreach (CVar cvar in _cvars) | ||||
|                 if (cvar.name.Equals(name)) | ||||
|                     return true; | ||||
|  | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         public CVar GetCVar(string name) { | ||||
|             foreach (CVar cvar in _cvars) | ||||
|                 if (cvar.name.Equals(name)) | ||||
|                     return cvar; | ||||
|  | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         public CVar ReplaceOrDefault(CVar cvar) { | ||||
|             CVar foundCVar = GetCVar(cvar.name); | ||||
|             if (foundCVar != null) return foundCVar; | ||||
|  | ||||
|             _cvars.Add(cvar); | ||||
|             return cvar; | ||||
|         } | ||||
|  | ||||
|         public void Replace(CVar cvar) { | ||||
|             CVar foundCVar = GetCVar(cvar.name); | ||||
|             if (foundCVar != null) _cvars.Remove(foundCVar); | ||||
|  | ||||
|             _cvars.Add(cvar); | ||||
|         } | ||||
|  | ||||
|         string[] ParseCommandInputArguments(string text) { | ||||
|             if (text.Length == 0) return Array.Empty<string>(); | ||||
|             if (text.Length == 0) { | ||||
|                 return Array.Empty<string>(); | ||||
|             } | ||||
|  | ||||
|             return new[] {text}; | ||||
|         } | ||||
|  | ||||
|         public void Execute(string input) { | ||||
|             if (input.Length == 0) return; | ||||
|             if (input.Length == 0) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             string commandName = input; | ||||
|             if (input.IndexOf(' ') != -1) commandName = input.Substring(0, input.IndexOf(' ')); | ||||
|             if (input.IndexOf(' ') != -1) { | ||||
|                 commandName = input.Substring(0, input.IndexOf(' ')); | ||||
|             } | ||||
|  | ||||
|             string[] arguments = ParseCommandInputArguments(input.Substring(commandName.Length)); | ||||
|  | ||||
|             foreach (IConsoleCommand command in _commands) | ||||
|             foreach (IConsoleCommand command in m_ConsoleCommands) { | ||||
|                 if (command.Name.Equals(commandName)) { | ||||
|                     command.Execute(arguments); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             foreach (CVar cvar in _cvars) | ||||
|             foreach (ConfigVar cvar in ConfigVarsContainer.All()) { | ||||
|                 if (cvar.name.Equals(commandName)) { | ||||
|                     if (arguments.Length == 1) cvar.ParseFromString(arguments[0]); | ||||
|                     if (arguments.Length == 1) { | ||||
|                         cvar.ParseFromString(arguments[0]); | ||||
|                     } | ||||
|  | ||||
|                     WriteToOutput($"<b>{cvar.name}</b> - {cvar}\n"); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             WriteToOutput($"ERROR: Command/CVar `{commandName}` not found."); | ||||
|         } | ||||
|  | ||||
|         public void RegisterCommand(IConsoleCommand command) { | ||||
|             if (_commands.Any(t => t.Name.Equals(command.Name))) { | ||||
|                 _logger.Error($"`{command.Name}` command is already registered"); | ||||
|             if (m_ConsoleCommands.Any(t => t.Name.Equals(command.Name))) { | ||||
|                 s_logger.Error($"`{command.Name}` command is already registered"); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             _commands.Add(command); | ||||
|             _logger.Info($"Registered command: {command.Name}"); | ||||
|             m_ConsoleCommands.Add(command); | ||||
|             s_logger.Info($"Registered command: {command.Name}"); | ||||
|         } | ||||
|  | ||||
|         public void PrintHelp() { | ||||
|             StringBuilder message = new(); | ||||
|  | ||||
|             message.AppendLine("Available commands:"); | ||||
|             foreach (IConsoleCommand command in _commands) { | ||||
|             foreach (IConsoleCommand command in m_ConsoleCommands) { | ||||
|                 message.Append("    "); | ||||
|                 message.Append(command.Name); | ||||
|                 message.Append(" - "); | ||||
| @@ -127,7 +161,7 @@ namespace RebootKit.Engine.Services.Console { | ||||
|             } | ||||
|  | ||||
|             message.AppendLine("Available cvars:"); | ||||
|             foreach (CVar cvar in _cvars) { | ||||
|             foreach (ConfigVar cvar in ConfigVarsContainer.All()) { | ||||
|                 message.Append("    "); | ||||
|                 message.Append(cvar.name); | ||||
|                 message.Append(" - "); | ||||
| @@ -137,5 +171,60 @@ namespace RebootKit.Engine.Services.Console { | ||||
|  | ||||
|             WriteToOutput(message.ToString()); | ||||
|         } | ||||
|          | ||||
|         public void PrintCVars() { | ||||
|             StringBuilder message = new(); | ||||
|  | ||||
|             foreach (ConfigVar cvar in ConfigVarsContainer.All()) { | ||||
|                 message.AppendLine($"{cvar.name} - {cvar}"); | ||||
|             } | ||||
|  | ||||
|             WriteToOutput(message.ToString()); | ||||
|         } | ||||
|  | ||||
|         void Save() { | ||||
|             string path = Application.persistentDataPath + "/" + RConsts.k_CVarsFilename; | ||||
|              | ||||
|             s_logger.Info("Saving cvars to file: " + path); | ||||
|  | ||||
|             StringBuilder sb = new(); | ||||
|  | ||||
|             foreach (ConfigVar cvar in ConfigVarsContainer.All()) { | ||||
|                 if (!cvar.flags.HasFlag(CVarFlags.ReadOnly)) { | ||||
|                     sb.AppendFormat("{0} {1}\n", cvar.name, cvar); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             File.WriteAllText(path, sb.ToString()); | ||||
|         } | ||||
|  | ||||
|         void Load() { | ||||
|             string path = Application.persistentDataPath + "/" + RConsts.k_CVarsFilename; | ||||
|             if (!File.Exists(path)) { | ||||
|                 s_logger.Info("CVar file not found, skipping load"); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             m_IsLoading = true; | ||||
|             ExecuteFile(path); | ||||
|             m_IsLoading = false; | ||||
|         } | ||||
|  | ||||
|         bool ExecuteFile(string path) { | ||||
|             if (!File.Exists(path)) { | ||||
|                 s_logger.Error($"Cannot load file '{path}', file not found"); | ||||
|                 return false; | ||||
|             } | ||||
|  | ||||
|             s_logger.Info($"Executing file '{path}'"); | ||||
|  | ||||
|             string[] lines = File.ReadAllLines(path); | ||||
|             foreach (string line in lines) { | ||||
|                 WriteToOutput(path + " > " + line); | ||||
|                 Execute(line); | ||||
|             } | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,30 +1,15 @@ | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEngine; | ||||
| using Logger = RebootKit.Engine.Foundation.Logger; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Console { | ||||
|     [CreateAssetMenu(menuName = RConsts.k_ServiceAssetMenu + "Console")] | ||||
|     public class ConsoleServiceAsset : ServiceAsset<ConsoleService> { | ||||
|         [SerializeField] CVar[] _initialCVars; | ||||
|  | ||||
|         [SerializeField] bool _loadCVarsFromResources = true; | ||||
|         static readonly Logger s_logger = new(nameof(ConsoleServiceAsset)); | ||||
|  | ||||
|         public override ConsoleService Create(DIContext context) { | ||||
|             ConsoleService service = new(); | ||||
|             context.Inject(service); | ||||
|  | ||||
|             foreach (CVar cvar in _initialCVars) { | ||||
|                 service.Replace(cvar); | ||||
|                 cvar.Reset(); | ||||
|             } | ||||
|  | ||||
|             if (_loadCVarsFromResources) { | ||||
|                 CVarAsset[] cvarsAssets = Resources.LoadAll<CVarAsset>("cvar"); | ||||
|                 foreach (CVarAsset cvarAsset in cvarsAssets) { | ||||
|                     CVar cvar = cvarAsset.Create(); | ||||
|                     service.Replace(cvar); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             return service; | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -57,6 +57,7 @@ namespace RebootKit.Engine.Services.ConsoleUI { | ||||
|         } | ||||
|  | ||||
|         void OnUserInput(string input) { | ||||
|             RR.Console.WriteToOutput("> " + input); | ||||
|             RR.Console.Execute(input); | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -1,28 +1,39 @@ | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using System; | ||||
| using RebootKit.Engine.UI; | ||||
| using UnityEngine; | ||||
| using UnityEngine.UIElements; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Development { | ||||
|     public class DebugOverlayView : MonoBehaviour, IView { | ||||
|         [SerializeField] UIDocument m_Document; | ||||
|     public class DebugOverlayView : UIDocumentView { | ||||
|         const string k_DebugLabelClassName = "rr__debug-label"; | ||||
|          | ||||
|         void Start() { | ||||
|         VisualElement m_RootElement; | ||||
|          | ||||
|         Label m_FPSLabel; | ||||
|  | ||||
|         void Update() { | ||||
|             if (m_RootElement == null) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|         public async UniTask Show(CancellationToken cancellationToken) { | ||||
|             gameObject.SetActive(true); | ||||
|             await UniTask.Yield(cancellationToken); | ||||
|             m_FPSLabel.text = $"fps: {Mathf.RoundToInt(1f / Time.deltaTime)} | dt: {Time.deltaTime:F4}ms | runtime: {Time.time:F4}s"; | ||||
|         } | ||||
|  | ||||
|         public async UniTask Hide(CancellationToken cancellationToken) { | ||||
|             gameObject.SetActive(false); | ||||
|             await UniTask.Yield(cancellationToken); | ||||
|         public override VisualElement Build() { | ||||
|             m_RootElement = new VisualElement(); | ||||
|              | ||||
|             CreateLabel($"Toggle Overlay [F3] | RebootKit | game: {Application.productName}, version: {Application.version}"); | ||||
|             m_FPSLabel = CreateLabel($"FPS: {Application.targetFrameRate}"); | ||||
|  | ||||
|             return m_RootElement; | ||||
|         } | ||||
|  | ||||
|         void SetOverlayModeChanged(int mode) { | ||||
|         Label CreateLabel(string text) { | ||||
|             Label label = (Label)LabelBuilder.New(text).Build(); | ||||
|             label.AddToClassList(k_DebugLabelClassName); | ||||
|  | ||||
|             m_RootElement.Add(label); | ||||
|             return label; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,24 +1,23 @@ | ||||
| using System; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using RebootKit.Engine.Services.Console; | ||||
| using UnityEngine; | ||||
| using UnityEngine.InputSystem; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Development { | ||||
|     static class DebugCVars { | ||||
|         public const string k_OverlayMode = "debug.mode"; | ||||
|     static class DebugConfig { | ||||
|         [ConfigVar("debug.overlay", 1, "Controls overlay visibility. 0 - hidden, 1 - visible")] public static ConfigVar s_OverlayMode; | ||||
|     } | ||||
|  | ||||
|     public class DevToolsService : ServiceMonoBehaviour { | ||||
|         [SerializeField] DebugOverlayView m_DebugOverlayView; | ||||
|  | ||||
|         [CVar(DebugCVars.k_OverlayMode, 1)] CVar m_OverlayMode; | ||||
|  | ||||
|         IDisposable m_CVarChangedListener; | ||||
|  | ||||
|         void OnEnable() { | ||||
|             m_CVarChangedListener = RR.CVarChanged.Listen(OnCVarChanged); | ||||
|             OnOverlayModeChanged(m_OverlayMode.IndexValue); | ||||
|         void Start() { | ||||
|             ConfigVar.StateChanged += OnCVarChanged; | ||||
|             // OnOverlayModeChanged(m_OverlayMode.IndexValue); | ||||
|         } | ||||
|  | ||||
|         void OnDisable() { | ||||
| @@ -26,20 +25,26 @@ namespace RebootKit.Engine.Services.Development { | ||||
|         } | ||||
|  | ||||
|         public override void Dispose() { | ||||
|             m_CVarChangedListener.Dispose(); | ||||
|             ConfigVar.StateChanged -= OnCVarChanged; | ||||
|         } | ||||
|  | ||||
|         void Update() { | ||||
|             if (InputSystem.GetDevice<Keyboard>().f3Key.wasReleasedThisFrame) { | ||||
|                 DebugConfig.s_OverlayMode.Set(DebugConfig.s_OverlayMode.IndexValue == 1 ? 0 : 1); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         void OnOverlayModeChanged(int mode) { | ||||
|             if (mode == 1) { | ||||
|                 m_DebugOverlayView.Show(destroyCancellationToken).Forget(); | ||||
|                 m_DebugOverlayView.gameObject.SetActive(true); | ||||
|             } else { | ||||
|                 m_DebugOverlayView.Hide(destroyCancellationToken).Forget(); | ||||
|                 m_DebugOverlayView.gameObject.SetActive(false); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         void OnCVarChanged(string cvarName, CVarValue value) { | ||||
|             if (cvarName == DebugCVars.k_OverlayMode) { | ||||
|                 OnOverlayModeChanged((int)value.numberValue); | ||||
|         void OnCVarChanged(ConfigVar cvar) { | ||||
|             if (cvar == DebugConfig.s_OverlayMode) { | ||||
|                 OnOverlayModeChanged(cvar.IndexValue); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   | ||||
| @@ -1,78 +0,0 @@ | ||||
| using System; | ||||
| using System.Threading; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Game { | ||||
|     public abstract class GameModeAsset : FactoryAsset<GameMode> { | ||||
|         [field: SerializeField] | ||||
|         public GameMode.Config GameModeConfig { get; private set; } | ||||
|  | ||||
|         public override GameMode Create(DIContext context) { | ||||
|             GameMode gameMode = new(GameModeConfig); | ||||
|             context.Inject(gameMode); | ||||
|             ConfigureGameMode(gameMode); | ||||
|             return gameMode; | ||||
|         } | ||||
|  | ||||
|         public abstract void ConfigureGameMode(GameMode gameMode); | ||||
|     } | ||||
|      | ||||
|     public class GameMode : IDisposable { | ||||
|         [Serializable] | ||||
|         public class Config { | ||||
|             public ControllerAsset[] controllers; | ||||
|         } | ||||
|          | ||||
|         readonly Config m_Config; | ||||
|         readonly ControllersManager<IController> m_Controllers; | ||||
|  | ||||
|         readonly CancellationTokenSource m_DestroyCancellationTokenSource; | ||||
|  | ||||
|         [Inject] DIContext m_DIContext; | ||||
|         bool m_IsRunning; | ||||
|  | ||||
|         public GameMode(Config config) { | ||||
|             m_Config = config; | ||||
|             m_IsRunning = false; | ||||
|  | ||||
|             m_DestroyCancellationTokenSource = new CancellationTokenSource(); | ||||
|             m_Controllers = new ControllersManager<IController>(m_DestroyCancellationTokenSource.Token); | ||||
|         } | ||||
|  | ||||
|         public void Dispose() { | ||||
|             m_DestroyCancellationTokenSource.Cancel(); | ||||
|             m_Controllers.Dispose(); | ||||
|         } | ||||
|  | ||||
|         public async Awaitable<bool> Start(CancellationToken cancellationToken) { | ||||
|             m_Controllers.Add(m_Config.controllers, m_DIContext); | ||||
|             await m_Controllers.Start(cancellationToken); | ||||
|  | ||||
|             m_IsRunning = true; | ||||
|             return true; | ||||
|         } | ||||
|  | ||||
|         public void Stop() { | ||||
|             m_IsRunning = false; | ||||
|  | ||||
|             m_Controllers.Stop(); | ||||
|         } | ||||
|  | ||||
|         public void Tick() { | ||||
|             m_Controllers.Tick(); | ||||
|         } | ||||
|  | ||||
|         public void AddController(IController controller) { | ||||
|             m_Controllers.Add(controller); | ||||
|         } | ||||
|  | ||||
|         public T FindController<T>() where T : class, IController { | ||||
|             if (m_Controllers.TryFind<T>(out T controller)) { | ||||
|                 return controller; | ||||
|             } | ||||
|              | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,2 +0,0 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 73f15dc489209cc4a9ff6963e0fbd2c6 | ||||
| @@ -1,47 +1,57 @@ | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using R3; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEngine.Assertions; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Game { | ||||
|     public class GameService : IService { | ||||
|         static readonly Logger s_logger = new(nameof(GameService)); | ||||
|  | ||||
|         [Inject] DIContext m_DIContext; | ||||
|         GameMode m_GameMode; | ||||
|  | ||||
|         GameModeAsset m_GameModeAsset; | ||||
|         bool m_isRunning; | ||||
|  | ||||
|         CancellationTokenSource m_DestroyCancellationTokenSource = new(); | ||||
|         DisposableBag m_ActiveGameModeDisposableBag; | ||||
|         IGameMode m_ActiveGameMode; | ||||
|  | ||||
|         public void Dispose() { | ||||
|             m_isRunning = false; | ||||
|             m_GameMode.Dispose(); | ||||
|             m_DestroyCancellationTokenSource.Cancel(); | ||||
|             m_DestroyCancellationTokenSource.Dispose(); | ||||
|             m_ActiveGameModeDisposableBag.Dispose(); | ||||
|         } | ||||
|  | ||||
|         public async UniTask Start(GameModeAsset asset, CancellationToken cancellationToken) { | ||||
|             Assert.IsNotNull(asset); | ||||
|  | ||||
|             m_GameMode = asset.Create(m_DIContext); | ||||
|             await m_GameMode.Start(cancellationToken); | ||||
|  | ||||
|             Run(cancellationToken).Forget(); | ||||
|         } | ||||
|  | ||||
|         async UniTask Run(CancellationToken cancellationToken) { | ||||
|             if (m_GameMode == null) { | ||||
|                 s_logger.Error("Trying to run game without game mode"); | ||||
|         public void Start(GameModeAsset asset) { | ||||
|             if (m_ActiveGameMode != null) { | ||||
|                 s_logger.Warning("Game is already running"); | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             m_isRunning = true; | ||||
|             while (m_isRunning) { | ||||
|                 await UniTask.Yield(PlayerLoopTiming.Update, cancellationToken); | ||||
|                 m_GameMode.Tick(); | ||||
|             Stop(); | ||||
|  | ||||
|                 if (cancellationToken.IsCancellationRequested) { | ||||
|             m_ActiveGameModeDisposableBag = new DisposableBag(); | ||||
|             m_ActiveGameMode = asset.Create(m_DIContext); | ||||
|             m_ActiveGameModeDisposableBag.Add(m_ActiveGameMode); | ||||
|              | ||||
|             InitializeGameModeAsync().Forget(); | ||||
|         } | ||||
|  | ||||
|         async UniTask InitializeGameModeAsync() { | ||||
|             await m_ActiveGameMode.OnInit(m_DestroyCancellationTokenSource.Token); | ||||
|  | ||||
|             m_ActiveGameMode.OnStart(); | ||||
|             Observable.EveryUpdate().Subscribe(_ => { m_ActiveGameMode?.OnTick(); }).AddTo(ref m_ActiveGameModeDisposableBag); | ||||
|         } | ||||
|  | ||||
|         public void Stop() { | ||||
|             if (m_ActiveGameMode == null) { | ||||
|                 return; | ||||
|             } | ||||
|             } | ||||
|  | ||||
|             m_ActiveGameMode.OnStop(); | ||||
|             m_ActiveGameMode = null; | ||||
|  | ||||
|             m_ActiveGameModeDisposableBag.Dispose(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										18
									
								
								Runtime/Engine/Code/Services/Game/IGameMode.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Runtime/Engine/Code/Services/Game/IGameMode.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| using System; | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using RebootKit.Engine.Foundation; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Game { | ||||
|     public interface IGameMode : IDisposable { | ||||
|         UniTask OnInit(CancellationToken cancellationToken); | ||||
|  | ||||
|         void OnStart(); | ||||
|         void OnStop(); | ||||
|  | ||||
|         void OnTick(); | ||||
|     } | ||||
|      | ||||
|     public abstract class GameModeAsset : FactoryAsset<IGameMode> { | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/Services/Game/IGameMode.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/Services/Game/IGameMode.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 562c4ff92afe4949b468003a0e997522 | ||||
| timeCreated: 1743456239 | ||||
							
								
								
									
										5
									
								
								Runtime/Engine/Code/Services/Game/Player.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								Runtime/Engine/Code/Services/Game/Player.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| namespace RebootKit.Engine.Services.Game { | ||||
|     public class Player { | ||||
|          | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								Runtime/Engine/Code/Services/Game/Player.cs.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								Runtime/Engine/Code/Services/Game/Player.cs.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: be94d631484b4bd2a2c9825290b74b36 | ||||
| timeCreated: 1744413325 | ||||
| @@ -1,6 +1,66 @@ | ||||
| using UnityEngine; | ||||
| using System; | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using RebootKit.Engine.Foundation; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Simulation { | ||||
|     public class Actor : MonoBehaviour { | ||||
|         [field: SerializeField] | ||||
|         public SerializableGuid ActorGuid { get; private set; } = SerializableGuid.New(); | ||||
|  | ||||
|         public bool IsInitialized { get; private set; } | ||||
|  | ||||
|         bool m_Simulate; | ||||
|         public bool Simulate { | ||||
|             get => m_Simulate; | ||||
|  | ||||
|             set { | ||||
|                 if (m_Simulate == value) { | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 m_Simulate = value; | ||||
|  | ||||
|                 if (!IsInitialized) { | ||||
|                     return; | ||||
|                 } | ||||
|  | ||||
|                 if (m_Simulate) { | ||||
|                     OnBeginPlay(); | ||||
|                 } else { | ||||
|                     OnEndPlay(); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         async void Start() { | ||||
|             IsInitialized = false; | ||||
|             await InitAsync(destroyCancellationToken); | ||||
|             IsInitialized = true; | ||||
|  | ||||
|             if (Simulate) { | ||||
|                 OnBeginPlay(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         void Update() { | ||||
|             if (m_Simulate && IsInitialized) { | ||||
|                 OnTick(); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         protected virtual async UniTask InitAsync(CancellationToken cancellationToken) { | ||||
|             await UniTask.Yield(cancellationToken); | ||||
|         } | ||||
|  | ||||
|         public virtual void OnBeginPlay() { | ||||
|         } | ||||
|  | ||||
|         public virtual void OnEndPlay() { | ||||
|         } | ||||
|  | ||||
|         public virtual void OnTick() { | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,4 +1,5 @@ | ||||
| using RebootKit.Engine.Extensions; | ||||
| using System; | ||||
| using RebootKit.Engine.Extensions; | ||||
| using UnityEngine; | ||||
|  | ||||
| namespace RebootKit.Engine.Services.Simulation { | ||||
| @@ -14,12 +15,15 @@ namespace RebootKit.Engine.Services.Simulation { | ||||
|  | ||||
|         public Rigidbody Current { get; private set; } | ||||
|  | ||||
|         [field: SerializeField] | ||||
|         public Vector3 TargetWorldPosition { get; set; } | ||||
|  | ||||
|         public bool IsDragging => Current != null; | ||||
|  | ||||
|         public void FixedUpdate() { | ||||
|             if (Current.OrNull() == null) return; | ||||
|             if (Current.OrNull() == null) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             Vector3 direction = (TargetWorldPosition - Current.position).normalized; | ||||
|             float distance = Vector3.Distance(TargetWorldPosition, Current.position); | ||||
| @@ -32,13 +36,22 @@ namespace RebootKit.Engine.Services.Simulation { | ||||
|             Current.angularVelocity = Vector3.MoveTowards(Current.angularVelocity, Vector3.zero, Time.fixedDeltaTime * AngularSlowdown); | ||||
|         } | ||||
|  | ||||
|         void OnDrawGizmosSelected() { | ||||
|             Gizmos.color = Color.green; | ||||
|             Gizmos.DrawSphere(TargetWorldPosition, 0.1f); | ||||
|         } | ||||
|  | ||||
|         public void Grab(Rigidbody physicsObject) { | ||||
|             Drop(); | ||||
|  | ||||
|             Current = physicsObject; | ||||
|             Current.linearDamping = 5.0f; | ||||
|         } | ||||
|  | ||||
|         public void Drop() { | ||||
|             if (Current == null) return; | ||||
|             if (Current == null) { | ||||
|                 return; | ||||
|             } | ||||
|  | ||||
|             Current.linearDamping = 0.0f; | ||||
|             Current = null; | ||||
|   | ||||
| @@ -20,9 +20,17 @@ namespace RebootKit.Engine.Services.Simulation { | ||||
|         public async UniTask Load(WorldConfig worldConfig) { | ||||
|             m_Config = worldConfig; | ||||
|  | ||||
|             AsyncOperationHandle<SceneInstance> handle = worldConfig.mainScene.LoadSceneAsync(LoadSceneMode.Additive); | ||||
|             AsyncOperationHandle<SceneInstance> handle = worldConfig.mainScene.LoadSceneAsync(LoadSceneMode.Additive, false); | ||||
|             await handle.ToUniTask(); | ||||
|              | ||||
|             await handle.Result.ActivateAsync(); | ||||
|             SceneManager.SetActiveScene(handle.Result.Scene); | ||||
|  | ||||
|             foreach (GameObject root in handle.Result.Scene.GetRootGameObjects()) { | ||||
|                 foreach (Actor actor in root.GetComponentsInChildren<Actor>()) { | ||||
|                     RegisterActor(actor); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public async UniTask<TActor> SpawnActor<TActor>(AssetReferenceT<GameObject> asset, CancellationToken cancellationToken) where TActor : Actor { | ||||
| @@ -32,15 +40,16 @@ namespace RebootKit.Engine.Services.Simulation { | ||||
|                 return null; | ||||
|             } | ||||
|  | ||||
|             if (gameObject.TryGetComponent(out TActor actor)) return actor; | ||||
|             if (gameObject.TryGetComponent(out TActor actor)) { | ||||
|                 return actor; | ||||
|             } | ||||
|  | ||||
|             asset.ReleaseInstance(gameObject); | ||||
|             return null; | ||||
|         } | ||||
|  | ||||
|         public async UniTask RegisterActor(Actor actor) { | ||||
|         public void RegisterActor(Actor actor) { | ||||
|             m_Actors.Add(actor); | ||||
|             await UniTask.Yield(); | ||||
|         } | ||||
|  | ||||
|         public void KillActor(Actor actor) { | ||||
| @@ -48,7 +57,9 @@ namespace RebootKit.Engine.Services.Simulation { | ||||
|         } | ||||
|  | ||||
|         public void KillAllActors() { | ||||
|             foreach (Actor actor in m_Actors) Addressables.ReleaseInstance(actor.gameObject); | ||||
|             foreach (Actor actor in m_Actors) { | ||||
|                 Addressables.ReleaseInstance(actor.gameObject); | ||||
|             } | ||||
|  | ||||
|             m_Actors.Clear(); | ||||
|         } | ||||
|   | ||||
| @@ -1,3 +0,0 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 01849df87c1948778a9155b635cb0a8f | ||||
| timeCreated: 1743252918 | ||||
| @@ -1,9 +1,11 @@ | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using System; | ||||
| using UnityEngine.UIElements; | ||||
|  | ||||
| namespace RebootKit.Engine.UI { | ||||
|     public interface IView { | ||||
|         UniTask Show(CancellationToken cancellationToken); | ||||
|         UniTask Hide(CancellationToken cancellationToken); | ||||
|     public interface IViewBuilder { | ||||
|         VisualElement Build(); | ||||
|     } | ||||
|      | ||||
|     public interface IView : IDisposable, IViewBuilder { | ||||
|     } | ||||
| } | ||||
| @@ -1,6 +1,4 @@ | ||||
| using System.Threading; | ||||
| using Cysharp.Threading.Tasks; | ||||
| using UnityEngine; | ||||
| using UnityEngine; | ||||
| using UnityEngine.Profiling; | ||||
| using UnityEngine.UIElements; | ||||
| using Logger = RebootKit.Engine.Foundation.Logger; | ||||
| @@ -12,18 +10,9 @@ namespace RebootKit.Engine.UI { | ||||
|         [SerializeField] UIDocument m_Document; | ||||
|  | ||||
|         void OnEnable() { | ||||
|             s_logger.Debug("START"); | ||||
|             Rebuild(); | ||||
|         } | ||||
|  | ||||
|         public async UniTask Show(CancellationToken cancellationToken) { | ||||
|             await UniTask.Yield(cancellationToken); | ||||
|         } | ||||
|  | ||||
|         public async UniTask Hide(CancellationToken cancellationToken) { | ||||
|             await UniTask.Yield(cancellationToken); | ||||
|         } | ||||
|  | ||||
|         protected void Rebuild() { | ||||
|             Profiler.BeginSample("UI Tree Build"); | ||||
|             VisualElement child = Build(); | ||||
| @@ -34,5 +23,13 @@ namespace RebootKit.Engine.UI { | ||||
|         } | ||||
|  | ||||
|         public abstract VisualElement Build(); | ||||
|         public void Show() { | ||||
|         } | ||||
|  | ||||
|         public void Hide() { | ||||
|         } | ||||
|  | ||||
|         public void Dispose() { | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,5 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 1400c4f93b62de546a78716fe0ffe0bf | ||||
| guid: a7a04d434257e0c48921a07d2da67388 | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
							
								
								
									
										521
									
								
								Runtime/Engine/core_assets/boot/scn_boot.unity
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								Runtime/Engine/core_assets/boot/scn_boot.unity
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,521 @@ | ||||
| %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: 10 | ||||
|   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_UseRadianceAmbientProbe: 0 | ||||
| --- !u!157 &3 | ||||
| LightmapSettings: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   serializedVersion: 13 | ||||
|   m_BakeOnSceneLoad: 0 | ||||
|   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_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: 1 | ||||
|     m_PVRFilteringGaussRadiusAO: 1 | ||||
|     m_PVRFilteringAtrousPositionSigmaDirect: 0.5 | ||||
|     m_PVRFilteringAtrousPositionSigmaIndirect: 2 | ||||
|     m_PVRFilteringAtrousPositionSigmaAO: 1 | ||||
|     m_ExportTrainingData: 0 | ||||
|     m_TrainingDataDestination: TrainingData | ||||
|     m_LightProbeSampleCountMultiplier: 4 | ||||
|   m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} | ||||
|   m_LightingSettings: {fileID: 0} | ||||
| --- !u!196 &4 | ||||
| NavMeshSettings: | ||||
|   serializedVersion: 2 | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_BuildSettings: | ||||
|     serializedVersion: 3 | ||||
|     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 | ||||
|     buildHeightMesh: 0 | ||||
|     maxJobWorkers: 0 | ||||
|     preserveTilesOutsideBounds: 0 | ||||
|     debug: | ||||
|       m_Flags: 0 | ||||
|   m_NavMeshData: {fileID: 0} | ||||
| --- !u!1 &242831136 | ||||
| GameObject: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   serializedVersion: 6 | ||||
|   m_Component: | ||||
|   - component: {fileID: 242831139} | ||||
|   - component: {fileID: 242831138} | ||||
|   - component: {fileID: 242831137} | ||||
|   - component: {fileID: 242831140} | ||||
|   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 &242831137 | ||||
| AudioListener: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 242831136} | ||||
|   m_Enabled: 1 | ||||
| --- !u!20 &242831138 | ||||
| Camera: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 242831136} | ||||
|   m_Enabled: 1 | ||||
|   serializedVersion: 2 | ||||
|   m_ClearFlags: 2 | ||||
|   m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} | ||||
|   m_projectionMatrixMode: 1 | ||||
|   m_GateFitMode: 2 | ||||
|   m_FOVAxisMode: 0 | ||||
|   m_Iso: 200 | ||||
|   m_ShutterSpeed: 0.005 | ||||
|   m_Aperture: 16 | ||||
|   m_FocusDistance: 10 | ||||
|   m_FocalLength: 50 | ||||
|   m_BladeCount: 5 | ||||
|   m_Curvature: {x: 2, y: 11} | ||||
|   m_BarrelClipping: 0.25 | ||||
|   m_Anamorphism: 0 | ||||
|   m_SensorSize: {x: 36, y: 24} | ||||
|   m_LensShift: {x: 0, y: 0} | ||||
|   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 &242831139 | ||||
| Transform: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 242831136} | ||||
|   serializedVersion: 2 | ||||
|   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_ConstrainProportionsScale: 0 | ||||
|   m_Children: [] | ||||
|   m_Father: {fileID: 0} | ||||
|   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | ||||
| --- !u!114 &242831140 | ||||
| MonoBehaviour: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 242831136} | ||||
|   m_Enabled: 1 | ||||
|   m_EditorHideFlags: 0 | ||||
|   m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} | ||||
|   m_Name:  | ||||
|   m_EditorClassIdentifier:  | ||||
|   m_RenderShadows: 1 | ||||
|   m_RequiresDepthTextureOption: 2 | ||||
|   m_RequiresOpaqueTextureOption: 2 | ||||
|   m_CameraType: 0 | ||||
|   m_Cameras: [] | ||||
|   m_RendererIndex: -1 | ||||
|   m_VolumeLayerMask: | ||||
|     serializedVersion: 2 | ||||
|     m_Bits: 1 | ||||
|   m_VolumeTrigger: {fileID: 0} | ||||
|   m_VolumeFrameworkUpdateModeOption: 2 | ||||
|   m_RenderPostProcessing: 0 | ||||
|   m_Antialiasing: 0 | ||||
|   m_AntialiasingQuality: 2 | ||||
|   m_StopNaN: 0 | ||||
|   m_Dithering: 0 | ||||
|   m_ClearDepth: 1 | ||||
|   m_AllowXRRendering: 1 | ||||
|   m_AllowHDROutput: 1 | ||||
|   m_UseScreenCoordOverride: 0 | ||||
|   m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} | ||||
|   m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} | ||||
|   m_RequiresDepthTexture: 0 | ||||
|   m_RequiresColorTexture: 0 | ||||
|   m_Version: 2 | ||||
|   m_TaaSettings: | ||||
|     m_Quality: 3 | ||||
|     m_FrameInfluence: 0.1 | ||||
|     m_JitterScale: 1 | ||||
|     m_MipBias: 0 | ||||
|     m_VarianceClampScale: 0.9 | ||||
|     m_ContrastAdaptiveSharpening: 0 | ||||
| --- !u!1 &319523211 | ||||
| GameObject: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   serializedVersion: 6 | ||||
|   m_Component: | ||||
|   - component: {fileID: 319523215} | ||||
|   - component: {fileID: 319523214} | ||||
|   - component: {fileID: 319523213} | ||||
|   - component: {fileID: 319523212} | ||||
|   m_Layer: 5 | ||||
|   m_Name: Canvas | ||||
|   m_TagString: Untagged | ||||
|   m_Icon: {fileID: 0} | ||||
|   m_NavMeshLayer: 0 | ||||
|   m_StaticEditorFlags: 0 | ||||
|   m_IsActive: 1 | ||||
| --- !u!114 &319523212 | ||||
| MonoBehaviour: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 319523211} | ||||
|   m_Enabled: 1 | ||||
|   m_EditorHideFlags: 0 | ||||
|   m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} | ||||
|   m_Name:  | ||||
|   m_EditorClassIdentifier:  | ||||
|   m_IgnoreReversedGraphics: 1 | ||||
|   m_BlockingObjects: 0 | ||||
|   m_BlockingMask: | ||||
|     serializedVersion: 2 | ||||
|     m_Bits: 4294967295 | ||||
| --- !u!114 &319523213 | ||||
| MonoBehaviour: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 319523211} | ||||
|   m_Enabled: 1 | ||||
|   m_EditorHideFlags: 0 | ||||
|   m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} | ||||
|   m_Name:  | ||||
|   m_EditorClassIdentifier:  | ||||
|   m_UiScaleMode: 1 | ||||
|   m_ReferencePixelsPerUnit: 100 | ||||
|   m_ScaleFactor: 1 | ||||
|   m_ReferenceResolution: {x: 1920, y: 1080} | ||||
|   m_ScreenMatchMode: 0 | ||||
|   m_MatchWidthOrHeight: 1 | ||||
|   m_PhysicalUnit: 3 | ||||
|   m_FallbackScreenDPI: 96 | ||||
|   m_DefaultSpriteDPI: 96 | ||||
|   m_DynamicPixelsPerUnit: 1 | ||||
|   m_PresetInfoIsWorld: 0 | ||||
| --- !u!223 &319523214 | ||||
| Canvas: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 319523211} | ||||
|   m_Enabled: 1 | ||||
|   serializedVersion: 3 | ||||
|   m_RenderMode: 0 | ||||
|   m_Camera: {fileID: 0} | ||||
|   m_PlaneDistance: 100 | ||||
|   m_PixelPerfect: 0 | ||||
|   m_ReceivesEvents: 1 | ||||
|   m_OverrideSorting: 0 | ||||
|   m_OverridePixelPerfect: 0 | ||||
|   m_SortingBucketNormalizedSize: 0 | ||||
|   m_VertexColorAlwaysGammaSpace: 0 | ||||
|   m_AdditionalShaderChannelsFlag: 0 | ||||
|   m_UpdateRectTransformForStandalone: 0 | ||||
|   m_SortingLayerID: 0 | ||||
|   m_SortingOrder: 0 | ||||
|   m_TargetDisplay: 0 | ||||
| --- !u!224 &319523215 | ||||
| RectTransform: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 319523211} | ||||
|   m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} | ||||
|   m_LocalPosition: {x: 0, y: 0, z: 0} | ||||
|   m_LocalScale: {x: 0, y: 0, z: 0} | ||||
|   m_ConstrainProportionsScale: 0 | ||||
|   m_Children: | ||||
|   - {fileID: 1509941944} | ||||
|   m_Father: {fileID: 0} | ||||
|   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | ||||
|   m_AnchorMin: {x: 0, y: 0} | ||||
|   m_AnchorMax: {x: 0, y: 0} | ||||
|   m_AnchoredPosition: {x: 0, y: 0} | ||||
|   m_SizeDelta: {x: 0, y: 0} | ||||
|   m_Pivot: {x: 0, y: 0} | ||||
| --- !u!1 &1509941943 | ||||
| GameObject: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   serializedVersion: 6 | ||||
|   m_Component: | ||||
|   - component: {fileID: 1509941944} | ||||
|   - component: {fileID: 1509941946} | ||||
|   - component: {fileID: 1509941945} | ||||
|   m_Layer: 5 | ||||
|   m_Name: Image | ||||
|   m_TagString: Untagged | ||||
|   m_Icon: {fileID: 0} | ||||
|   m_NavMeshLayer: 0 | ||||
|   m_StaticEditorFlags: 0 | ||||
|   m_IsActive: 1 | ||||
| --- !u!224 &1509941944 | ||||
| RectTransform: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 1509941943} | ||||
|   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_ConstrainProportionsScale: 0 | ||||
|   m_Children: [] | ||||
|   m_Father: {fileID: 319523215} | ||||
|   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | ||||
|   m_AnchorMin: {x: 0.5, y: 0.5} | ||||
|   m_AnchorMax: {x: 0.5, y: 0.5} | ||||
|   m_AnchoredPosition: {x: 0, y: 0} | ||||
|   m_SizeDelta: {x: 799.0996, y: 799.1} | ||||
|   m_Pivot: {x: 0.5, y: 0.5} | ||||
| --- !u!114 &1509941945 | ||||
| MonoBehaviour: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 1509941943} | ||||
|   m_Enabled: 1 | ||||
|   m_EditorHideFlags: 0 | ||||
|   m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} | ||||
|   m_Name:  | ||||
|   m_EditorClassIdentifier:  | ||||
|   m_Material: {fileID: 0} | ||||
|   m_Color: {r: 0.26415092, g: 0, b: 0, a: 1} | ||||
|   m_RaycastTarget: 1 | ||||
|   m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} | ||||
|   m_Maskable: 1 | ||||
|   m_OnCullStateChanged: | ||||
|     m_PersistentCalls: | ||||
|       m_Calls: [] | ||||
|   m_Sprite: {fileID: 21300000, guid: b6b4948176bf2744fad63f0df242f185, type: 3} | ||||
|   m_Type: 0 | ||||
|   m_PreserveAspect: 0 | ||||
|   m_FillCenter: 1 | ||||
|   m_FillMethod: 4 | ||||
|   m_FillAmount: 1 | ||||
|   m_FillClockwise: 1 | ||||
|   m_FillOrigin: 0 | ||||
|   m_UseSpriteMesh: 0 | ||||
|   m_PixelsPerUnitMultiplier: 1 | ||||
| --- !u!222 &1509941946 | ||||
| CanvasRenderer: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 1509941943} | ||||
|   m_CullTransparentMesh: 1 | ||||
| --- !u!1 &1530691764 | ||||
| GameObject: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   serializedVersion: 6 | ||||
|   m_Component: | ||||
|   - component: {fileID: 1530691767} | ||||
|   - component: {fileID: 1530691766} | ||||
|   - component: {fileID: 1530691765} | ||||
|   m_Layer: 0 | ||||
|   m_Name: EventSystem | ||||
|   m_TagString: Untagged | ||||
|   m_Icon: {fileID: 0} | ||||
|   m_NavMeshLayer: 0 | ||||
|   m_StaticEditorFlags: 0 | ||||
|   m_IsActive: 1 | ||||
| --- !u!114 &1530691765 | ||||
| MonoBehaviour: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 1530691764} | ||||
|   m_Enabled: 1 | ||||
|   m_EditorHideFlags: 0 | ||||
|   m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} | ||||
|   m_Name:  | ||||
|   m_EditorClassIdentifier:  | ||||
|   m_SendPointerHoverToParent: 1 | ||||
|   m_MoveRepeatDelay: 0.5 | ||||
|   m_MoveRepeatRate: 0.1 | ||||
|   m_XRTrackingOrigin: {fileID: 0} | ||||
|   m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} | ||||
|   m_DeselectOnBackgroundClick: 1 | ||||
|   m_PointerBehavior: 0 | ||||
|   m_CursorLockBehavior: 0 | ||||
|   m_ScrollDeltaPerTick: 6 | ||||
| --- !u!114 &1530691766 | ||||
| MonoBehaviour: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 1530691764} | ||||
|   m_Enabled: 1 | ||||
|   m_EditorHideFlags: 0 | ||||
|   m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} | ||||
|   m_Name:  | ||||
|   m_EditorClassIdentifier:  | ||||
|   m_FirstSelected: {fileID: 0} | ||||
|   m_sendNavigationEvents: 1 | ||||
|   m_DragThreshold: 10 | ||||
| --- !u!4 &1530691767 | ||||
| Transform: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_CorrespondingSourceObject: {fileID: 0} | ||||
|   m_PrefabInstance: {fileID: 0} | ||||
|   m_PrefabAsset: {fileID: 0} | ||||
|   m_GameObject: {fileID: 1530691764} | ||||
|   serializedVersion: 2 | ||||
|   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_ConstrainProportionsScale: 0 | ||||
|   m_Children: [] | ||||
|   m_Father: {fileID: 0} | ||||
|   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} | ||||
| --- !u!1660057539 &9223372036854775807 | ||||
| SceneRoots: | ||||
|   m_ObjectHideFlags: 0 | ||||
|   m_Roots: | ||||
|   - {fileID: 242831139} | ||||
|   - {fileID: 319523215} | ||||
|   - {fileID: 1530691767} | ||||
							
								
								
									
										7
									
								
								Runtime/Engine/core_assets/boot/scn_boot.unity.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/core_assets/boot/scn_boot.unity.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 0ede5ded46062a440b4f05794ec1a9fb | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
| @@ -1,5 +1,5 @@ | ||||
| { | ||||
|     "name": "RealityKitControls", | ||||
|     "name": "controls_realitykit", | ||||
|     "maps": [ | ||||
|         { | ||||
|             "name": "FPP", | ||||
| @@ -108,6 +108,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "d67d0677-bbce-4d3c-b135-27accc98bfb1", | ||||
|                     "path": "<Gamepad>/rightStick", | ||||
|                     "interactions": "", | ||||
|                     "processors": "ScaleVector2(x=4)", | ||||
|                     "groups": "", | ||||
|                     "action": "Look", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "dd672a14-64ba-4cf6-a7b6-dbd4ac779d9f", | ||||
| @@ -119,6 +130,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "c7899bc3-40a6-4c5f-b4be-aa35b744a98b", | ||||
|                     "path": "<Gamepad>/buttonSouth", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Jump", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "095c0e94-6900-442e-8bad-a61430bfead1", | ||||
| @@ -130,6 +152,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "c22525c4-fa19-4f56-b9ae-63cd056dae70", | ||||
|                     "path": "<Gamepad>/rightStickPress", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Drag", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "d01e2a9b-4e4a-439f-892d-db8521ed0028", | ||||
| @@ -141,6 +174,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "28cdb072-0969-47ee-a2b5-c1e30b05cfc8", | ||||
|                     "path": "<Gamepad>/buttonWest", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Primary", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "0f8ae92e-c66e-4807-b95d-2fab59bd4e81", | ||||
| @@ -152,6 +196,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "46615209-739a-447c-9313-5befdf6b885e", | ||||
|                     "path": "<Gamepad>/buttonEast", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Secondary", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "WASD", | ||||
|                     "id": "3151504d-248f-47a2-b1c6-c62f5582beea", | ||||
| @@ -207,6 +262,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": true | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "e3c4c724-efa2-49c3-8ee9-32f68f7310f4", | ||||
|                     "path": "<Gamepad>/leftStick", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Move", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "358c81fe-cbfe-455a-8828-a6d166426430", | ||||
| @@ -218,6 +284,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "037bde49-96a0-4b33-a67e-881fd33c6f38", | ||||
|                     "path": "<Gamepad>/buttonNorth", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Use", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "352a96ce-7752-40ca-8ee7-dcc84bbdebd2", | ||||
| @@ -229,6 +306,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "6810417c-8efe-4e03-be16-3484f87dde13", | ||||
|                     "path": "<Gamepad>/dpad/up", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Menu0", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "956136b4-30ff-49d2-bd98-b42bd8944543", | ||||
| @@ -240,6 +328,17 @@ | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "95c4113e-905b-4672-aa00-f9fcb9d396b6", | ||||
|                     "path": "<Gamepad>/dpad/right", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Menu1", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "ad048d87-67fa-434f-a0ed-cce955e68659", | ||||
| @@ -250,6 +349,17 @@ | ||||
|                     "action": "Menu2", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 }, | ||||
|                 { | ||||
|                     "name": "", | ||||
|                     "id": "1785e027-c5f5-4434-acff-320c5eec5d64", | ||||
|                     "path": "<Gamepad>/dpad/down", | ||||
|                     "interactions": "", | ||||
|                     "processors": "", | ||||
|                     "groups": "", | ||||
|                     "action": "Menu2", | ||||
|                     "isComposite": false, | ||||
|                     "isPartOfComposite": false | ||||
|                 } | ||||
|             ] | ||||
|         } | ||||
| @@ -10,7 +10,7 @@ MonoBehaviour: | ||||
|   m_Enabled: 1 | ||||
|   m_EditorHideFlags: 0 | ||||
|   m_Script: {fileID: 11500000, guid: e8d574cf0e024ec7bc4363a675dbb2c9, type: 3} | ||||
|   m_Name: Input Action Toggle Console | ||||
|   m_Name: input_action_toggle_console | ||||
|   m_EditorClassIdentifier:  | ||||
|   <Action>k__BackingField: | ||||
|     m_Name: Action | ||||
							
								
								
									
										8
									
								
								Runtime/Engine/core_assets/logo.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								Runtime/Engine/core_assets/logo.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: addb506cc6bf3cc4fa91b3ef840ff4fa | ||||
| folderAsset: yes | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										4
									
								
								Runtime/Engine/core_assets/logo/Color_Standarization.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								Runtime/Engine/core_assets/logo/Color_Standarization.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| Logo 1st - #B9B8B9 | ||||
| Logo 2nd - #6B6B6B | ||||
| Background - #242126 | ||||
| Text 2nd - #696969 | ||||
| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 5423389ca1de67a4da6ce5b8b000b820 | ||||
| TextScriptImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										45
									
								
								Runtime/Engine/core_assets/logo/Logo_black_01.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								Runtime/Engine/core_assets/logo/Logo_black_01.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512"> | ||||
|   <!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116)  --> | ||||
|   <defs> | ||||
|     <style> | ||||
|       .st0 { | ||||
|         fill: #fff; | ||||
|         stroke: #fff; | ||||
|         stroke-miterlimit: 10; | ||||
|       } | ||||
|     </style> | ||||
|   </defs> | ||||
|   <path class="st0" d="M421.27,254.6"/> | ||||
|   <path class="st0" d="M21.02,254.6"/> | ||||
|   <g> | ||||
|     <g> | ||||
|       <path d="M303.53,224.93c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,200.94h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/> | ||||
|       <path d="M331.82,205.54h-9.39c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3ZM322.52,223.69v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21Z"/> | ||||
|       <path d="M366.8,205.45h-2.66c-2.07,0-3.69.55-4.87,1.64-.59.55-1.03,1.24-1.33,2.07v-19.38h-10.01v59.24h9.92v-4.01c.29.97.76,1.76,1.42,2.37,1.18,1.09,2.8,1.64,4.87,1.64h2.66c3.19,0,5.5-.77,6.95-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-26.03c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.76-2.3-6.95-2.3ZM365.82,228.48v10.36c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-2.66c-.94,0-1.64-.22-2.08-.66s-.66-1.2-.66-2.26v-22.05c0-1.12.22-1.9.66-2.35.44-.44,1.14-.66,2.08-.66h2.66c1,0,1.67.16,1.99.49.32.32.49.96.49,1.9v12.84Z"/> | ||||
|       <path d="M401.86,205.54h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3ZM401.42,232.99v6.11c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-23.64c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v17.53Z"/> | ||||
|       <path d="M427.45,249.02h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3ZM427.81,229.63v-14.17c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v23.64c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-9.47Z"/> | ||||
|       <path d="M470.93,213.33v-7.79h-5.93v-7.79h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93Z"/> | ||||
|     </g> | ||||
|     <g> | ||||
|       <rect x="400.18" y="256.72" width="10.54" height="8.77"/> | ||||
|       <g> | ||||
|         <path d="M303.53,291.96c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,267.96h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/> | ||||
|         <path d="M322.43,272.57c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3h-9.39ZM329.25,280.01c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25Z"/> | ||||
|         <path d="M365.38,276.82c-.27-1.07-.76-1.95-1.46-2.61-1.15-1.09-2.76-1.64-4.83-1.64h-2.75c-3.13,0-5.42.77-6.86,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.73,2.3,6.86,2.3h2.75c2.07,0,3.67-.55,4.83-1.64.57-.54,1-1.22,1.28-2.04v3.68h10.09v-43.48h-9.92v4.25ZM364.58,307.59c-.41.44-1.12.66-2.13.66h-2.66c-.95,0-1.59-.18-1.95-.53-.35-.35-.53-.97-.53-1.86v-23.11c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h2.66c1,0,1.71.22,2.13.66.41.44.62,1.2.62,2.26v22.05c0,1.06-.21,1.82-.62,2.26Z"/> | ||||
|         <rect x="382.82" y="256.81" width="10.01" height="59.24"/> | ||||
|         <rect x="400.44" y="272.57" width="10.01" height="43.48"/> | ||||
|         <path d="M429.04,264.78h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93v-7.79h-5.93v-7.79Z"/> | ||||
|         <path d="M452.95,306.04l-6.2-33.47h-10.36l9.92,41.88h4.78l-.71,2.83c-.35,1.24-.93,2.07-1.73,2.48-.8.41-1.82.62-3.06.62h-4.52v7.7h5.93c3.54,0,6.26-.81,8.15-2.43,1.89-1.62,3.19-3.94,3.9-6.95l9.74-46.13h-10.09l-5.76,33.47Z"/> | ||||
|       </g> | ||||
|     </g> | ||||
|     <g> | ||||
|       <path d="M230.84,365.76l34.69,8.74-95.47-95.5h0c4.76-2.32,9.05-5.41,12.8-9.22,4.3-4.36,7.65-9.44,9.96-15.08,2.4-5.86,3.57-12.06,3.47-18.43-.18-12.2-5.07-23.69-13.76-32.36-8.69-8.67-20.2-13.52-32.4-13.66-.34,0-.69,0-1.04,0-5.57.06-11.09,1.16-16.39,3.29-2.83,1.14-5.69,2.65-8.48,4.51l-61.31,40.67c7.29-40.21,42.56-70.79,84.84-70.79,47.54,0,86.22,38.68,86.22,86.22,0,20.91-7.49,40.11-19.92,55.06l15.35,15.35c7.35-8.51,13.29-18.04,17.68-28.44,5.62-13.3,8.48-27.42,8.48-41.97s-2.85-28.67-8.48-41.97c-5.43-12.84-13.2-24.37-23.1-34.27-9.9-9.9-21.43-17.67-34.27-23.1-9.67-4.09-19.78-6.71-30.17-7.84-2.45-.45-29.7-5.84-56.46-29.02,0,0,6.14,19.1,18.34,31.62-5.33,1.34-10.55,3.09-15.66,5.25-12.84,5.43-24.37,13.2-34.27,23.1-9.9,9.9-17.67,21.43-23.1,34.27-5.62,13.3-8.48,27.42-8.48,41.97,0,8.15.9,16.16,2.67,23.97l19.62-13.01s0,0,0-.01l73.94-49.05c1.57-1.04,3.11-1.87,4.58-2.46,2.8-1.12,5.68-1.71,8.57-1.74.19,0,.37,0,.56,0,13.49.16,24.63,11.26,24.83,24.75.1,6.79-2.47,13.2-7.23,18.03-4.65,4.72-10.82,7.37-17.43,7.49v-31.5l-18.37.16v180.49l18.37,38.28v-164.59l80.79,80.79Z"/> | ||||
|       <path d="M103.53,352.5s.09.04.13.06l18.24,37.9v-153.22l-18.37,12.19v103.08Z"/> | ||||
|       <path d="M159.83,339.51v21.77c10.29-1.14,20.3-3.75,29.89-7.81,3.46-1.46,6.82-3.1,10.09-4.9l-16.09-16.09c-7.45,3.44-15.48,5.84-23.88,7.02Z"/> | ||||
|       <path d="M64.21,275.51l-18.85,12.51c.9,2.73,1.92,5.43,3.05,8.09,5.43,12.84,13.2,24.37,23.1,34.27,6.7,6.7,14.15,12.42,22.24,17.11v-26.18c-14.3-11.52-24.85-27.49-29.54-45.8Z"/> | ||||
|     </g> | ||||
|     <path class="st0" d="M421.27,254.58"/> | ||||
|     <path class="st0" d="M21.02,254.58"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.5 KiB | 
							
								
								
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_black_01.svg.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_black_01.svg.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 944bd158fdf2f06439bb48c526610aac | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										21
									
								
								Runtime/Engine/core_assets/logo/Logo_black_02.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								Runtime/Engine/core_assets/logo/Logo_black_02.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512"> | ||||
|   <!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116)  --> | ||||
|   <defs> | ||||
|     <style> | ||||
|       .st0 { | ||||
|         fill: #fff; | ||||
|         stroke: #fff; | ||||
|         stroke-miterlimit: 10; | ||||
|       } | ||||
|     </style> | ||||
|   </defs> | ||||
|   <path class="st0" d="M421.27,254.6"/> | ||||
|   <path class="st0" d="M21.02,254.6"/> | ||||
|   <g> | ||||
|     <path d="M338.35,332.16l34.69,8.74-95.47-95.5h0c4.76-2.32,9.05-5.41,12.8-9.22,4.3-4.36,7.65-9.44,9.96-15.08,2.4-5.86,3.57-12.06,3.47-18.43-.18-12.2-5.07-23.69-13.76-32.36-8.69-8.67-20.2-13.52-32.4-13.66-.34,0-.69,0-1.04,0-5.57.06-11.09,1.16-16.39,3.29-2.83,1.14-5.69,2.65-8.48,4.51l-61.31,40.67c7.29-40.21,42.56-70.79,84.84-70.79,47.54,0,86.22,38.68,86.22,86.22,0,20.91-7.49,40.11-19.92,55.06l15.35,15.35c7.35-8.51,13.29-18.04,17.68-28.44,5.62-13.3,8.48-27.42,8.48-41.97s-2.85-28.67-8.48-41.97c-5.43-12.84-13.2-24.37-23.1-34.27-9.9-9.9-21.43-17.67-34.27-23.1-9.67-4.09-19.78-6.71-30.17-7.84-2.45-.45-29.7-5.84-56.46-29.02,0,0,6.14,19.1,18.34,31.62-5.33,1.34-10.55,3.09-15.66,5.25-12.84,5.43-24.37,13.2-34.27,23.1-9.9,9.9-17.67,21.43-23.1,34.27-5.62,13.3-8.48,27.42-8.48,41.97,0,8.15.9,16.16,2.67,23.97l19.62-13.01s0,0,0-.01l73.94-49.05c1.57-1.04,3.11-1.87,4.58-2.46,2.8-1.12,5.68-1.71,8.57-1.74.19,0,.37,0,.56,0,13.49.16,24.63,11.26,24.83,24.75.1,6.79-2.47,13.2-7.23,18.03-4.65,4.72-10.82,7.37-17.43,7.49v-31.5l-18.37.16v180.49l18.37,38.28v-164.59l80.79,80.79Z"/> | ||||
|     <path d="M211.04,318.9s.09.04.13.06l18.24,37.9v-153.22l-18.37,12.19v103.08Z"/> | ||||
|     <path d="M267.34,305.91v21.77c10.29-1.14,20.3-3.75,29.89-7.81,3.46-1.46,6.82-3.1,10.09-4.9l-16.09-16.09c-7.45,3.44-15.48,5.84-23.88,7.02Z"/> | ||||
|     <path d="M171.72,241.91l-18.85,12.51c.9,2.73,1.92,5.43,3.05,8.09,5.43,12.84,13.2,24.37,23.1,34.27,6.7,6.7,14.15,12.42,22.24,17.11v-26.18c-14.3-11.52-24.85-27.49-29.54-45.8Z"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 1.9 KiB | 
							
								
								
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_black_02.svg.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_black_02.svg.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: 2c401539fa0fc574e861668963322a91 | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										67
									
								
								Runtime/Engine/core_assets/logo/Logo_color_01.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								Runtime/Engine/core_assets/logo/Logo_color_01.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512"> | ||||
|   <!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116)  --> | ||||
|   <defs> | ||||
|     <style> | ||||
|       .st0 { | ||||
|         fill: #fff; | ||||
|         stroke: #fff; | ||||
|       } | ||||
|  | ||||
|       .st0, .st1 { | ||||
|         stroke-miterlimit: 10; | ||||
|       } | ||||
|  | ||||
|       .st1 { | ||||
|         stroke: #6b6b6b; | ||||
|         stroke-width: 0px; | ||||
|       } | ||||
|  | ||||
|       .st1, .st2 { | ||||
|         fill: #696969; | ||||
|       } | ||||
|  | ||||
|       .st3 { | ||||
|         fill: #b9b8b9; | ||||
|       } | ||||
|     </style> | ||||
|   </defs> | ||||
|   <g> | ||||
|     <g> | ||||
|       <path class="st3" d="M303.53,224.95c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,200.96h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/> | ||||
|       <path class="st3" d="M331.82,205.56h-9.39c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3ZM322.52,223.71v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21Z"/> | ||||
|       <path class="st3" d="M366.8,205.47h-2.66c-2.07,0-3.69.55-4.87,1.64-.59.55-1.03,1.24-1.33,2.07v-19.38h-10.01v59.24h9.92v-4.01c.29.97.76,1.76,1.42,2.37,1.18,1.09,2.8,1.64,4.87,1.64h2.66c3.19,0,5.5-.77,6.95-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-26.03c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.76-2.3-6.95-2.3ZM365.82,228.49v10.36c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-2.66c-.94,0-1.64-.22-2.08-.66s-.66-1.2-.66-2.26v-22.05c0-1.12.22-1.9.66-2.35.44-.44,1.14-.66,2.08-.66h2.66c1,0,1.67.16,1.99.49.32.32.49.96.49,1.9v12.84Z"/> | ||||
|       <path class="st3" d="M401.86,205.56h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3ZM401.42,233.01v6.11c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-23.64c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v17.53Z"/> | ||||
|       <path class="st3" d="M427.45,249.04h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3ZM427.81,229.65v-14.17c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v23.64c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-9.47Z"/> | ||||
|       <path class="st3" d="M470.93,213.35v-7.79h-5.93v-7.79h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93Z"/> | ||||
|     </g> | ||||
|     <g> | ||||
|       <rect class="st2" x="400.18" y="256.74" width="10.54" height="8.77"/> | ||||
|       <g> | ||||
|         <path class="st2" d="M303.53,291.98c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,267.98h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/> | ||||
|         <path class="st2" d="M322.43,272.59c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3h-9.39ZM329.25,280.03c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25Z"/> | ||||
|         <path class="st2" d="M365.38,276.84c-.27-1.07-.76-1.95-1.46-2.61-1.15-1.09-2.76-1.64-4.83-1.64h-2.75c-3.13,0-5.42.77-6.86,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.73,2.3,6.86,2.3h2.75c2.07,0,3.67-.55,4.83-1.64.57-.54,1-1.22,1.28-2.04v3.68h10.09v-43.48h-9.92v4.25ZM364.58,307.61c-.41.44-1.12.66-2.13.66h-2.66c-.95,0-1.59-.18-1.95-.53-.35-.35-.53-.97-.53-1.86v-23.11c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h2.66c1,0,1.71.22,2.13.66.41.44.62,1.2.62,2.26v22.05c0,1.06-.21,1.82-.62,2.26Z"/> | ||||
|         <rect class="st2" x="382.82" y="256.83" width="10.01" height="59.24"/> | ||||
|         <rect class="st2" x="400.44" y="272.59" width="10.01" height="43.48"/> | ||||
|         <path class="st2" d="M429.04,264.8h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93v-7.79h-5.93v-7.79Z"/> | ||||
|         <path class="st2" d="M452.95,306.06l-6.2-33.47h-10.36l9.92,41.88h4.78l-.71,2.83c-.35,1.24-.93,2.07-1.73,2.48-.8.41-1.82.62-3.06.62h-4.52v7.7h5.93c3.54,0,6.26-.81,8.15-2.43,1.89-1.62,3.19-3.94,3.9-6.95l9.74-46.13h-10.09l-5.76,33.47Z"/> | ||||
|       </g> | ||||
|     </g> | ||||
|     <g> | ||||
|       <g> | ||||
|         <path class="st3" d="M230.84,365.78l34.69,8.74-95.47-95.5h0c4.76-2.32,9.05-5.41,12.8-9.22,4.3-4.36,7.65-9.44,9.96-15.08,2.4-5.86,3.57-12.06,3.47-18.43-.18-12.2-5.07-23.69-13.76-32.36-8.69-8.67-20.2-13.52-32.4-13.66-.34,0-.69,0-1.04,0-5.57.06-11.09,1.16-16.39,3.29-2.83,1.14-5.69,2.65-8.48,4.51l-61.31,40.67c7.29-40.21,42.56-70.79,84.84-70.79,47.54,0,86.22,38.68,86.22,86.22,0,20.91-7.49,40.11-19.92,55.06l15.35,15.35c7.35-8.51,13.29-18.04,17.68-28.44,5.62-13.3,8.48-27.42,8.48-41.97s-2.85-28.67-8.48-41.97c-5.43-12.84-13.2-24.37-23.1-34.27-9.9-9.9-21.43-17.67-34.27-23.1-9.67-4.09-19.78-6.71-30.17-7.84-2.45-.45-29.7-5.84-56.46-29.02,0,0,6.14,19.1,18.34,31.62-5.33,1.34-10.55,3.09-15.66,5.25-12.84,5.43-24.37,13.2-34.27,23.1-9.9,9.9-17.67,21.43-23.1,34.27-5.62,13.3-8.48,27.42-8.48,41.97,0,8.15.9,16.16,2.67,23.97l19.62-13.01s0,0,0-.01l73.94-49.05c1.57-1.04,3.11-1.87,4.58-2.46,2.8-1.12,5.68-1.71,8.57-1.74.19,0,.37,0,.56,0,13.49.16,24.63,11.26,24.83,24.75.1,6.79-2.47,13.2-7.23,18.03-4.65,4.72-10.82,7.37-17.43,7.49v-31.5l-18.37.16v180.49l18.37,38.28v-164.59l80.79,80.79Z"/> | ||||
|         <path class="st3" d="M103.53,352.51s.09.04.13.06l18.24,37.9v-153.22l-18.37,12.19v103.08Z"/> | ||||
|         <path class="st3" d="M159.83,339.53v21.77c10.29-1.14,20.3-3.75,29.89-7.81,3.46-1.46,6.82-3.1,10.09-4.9l-16.09-16.09c-7.45,3.44-15.48,5.84-23.88,7.02Z"/> | ||||
|         <path class="st3" d="M64.21,275.53l-18.85,12.51c.9,2.73,1.92,5.43,3.05,8.09,5.43,12.84,13.2,24.37,23.1,34.27,6.7,6.7,14.15,12.42,22.24,17.11v-26.18c-14.3-11.52-24.85-27.49-29.54-45.8Z"/> | ||||
|       </g> | ||||
|       <g> | ||||
|         <polygon class="st1" points="150.05 230.64 131.68 230.81 131.68 259.61 150.05 247.42 150.05 230.64"/> | ||||
|         <polygon class="st1" points="103.54 249.43 103.54 278.29 105.65 276.9 121.9 266.11 121.9 237.25 103.54 249.43"/> | ||||
|         <path class="st1" d="M73.56,298.05c-3.08-5.19-5.63-10.72-7.58-16.54-.02-.05-.03-.09-.05-.14-.31-.94-.61-1.89-.89-2.84,0-.02-.01-.05-.02-.07-.29-.97-.56-1.94-.81-2.93l-18.84,12.5c.9,2.73,1.92,5.42,3.04,8.09.48,1.14.99,2.27,1.5,3.39.06.12.11.24.17.36,1.05,2.25,2.18,4.46,3.38,6.62.05.09.1.17.14.26.61,1.09,1.23,2.16,1.87,3.22l18.08-11.92Z"/> | ||||
|         <path class="st1" d="M199.8,348.6l-16.09-16.09c-4.26,1.96-8.71,3.58-13.3,4.83l17.07,17.07c.75-.3,1.49-.6,2.23-.91,3.46-1.46,6.82-3.1,10.09-4.9Z"/> | ||||
|       </g> | ||||
|     </g> | ||||
|   </g> | ||||
|   <path class="st0" d="M421.27,254.6"/> | ||||
|   <path class="st0" d="M21.02,254.6"/> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 7.6 KiB | 
							
								
								
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_color_01.svg.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_color_01.svg.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d73aceed81ef7e64ba43aceb540345e9 | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										42
									
								
								Runtime/Engine/core_assets/logo/Logo_color_02.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								Runtime/Engine/core_assets/logo/Logo_color_02.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512"> | ||||
|   <!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116)  --> | ||||
|   <defs> | ||||
|     <style> | ||||
|       .st0 { | ||||
|         fill: #fff; | ||||
|         stroke: #fff; | ||||
|       } | ||||
|  | ||||
|       .st0, .st1 { | ||||
|         stroke-miterlimit: 10; | ||||
|       } | ||||
|  | ||||
|       .st1 { | ||||
|         fill: #696969; | ||||
|         stroke: #6b6b6b; | ||||
|         stroke-width: 0px; | ||||
|       } | ||||
|  | ||||
|       .st2 { | ||||
|         fill: #b9b8b9; | ||||
|       } | ||||
|     </style> | ||||
|   </defs> | ||||
|   <path class="st0" d="M421.27,254.6"/> | ||||
|   <path class="st0" d="M21.02,254.6"/> | ||||
|   <g> | ||||
|     <g> | ||||
|       <path class="st2" d="M338.35,332.16l34.69,8.74-95.47-95.5h0c4.76-2.32,9.05-5.41,12.8-9.22,4.3-4.36,7.65-9.44,9.96-15.08,2.4-5.86,3.57-12.06,3.47-18.43-.18-12.2-5.07-23.69-13.76-32.36-8.69-8.67-20.2-13.52-32.4-13.66-.34,0-.69,0-1.04,0-5.57.06-11.09,1.16-16.39,3.29-2.83,1.14-5.69,2.65-8.48,4.51l-61.31,40.67c7.29-40.21,42.56-70.79,84.84-70.79,47.54,0,86.22,38.68,86.22,86.22,0,20.91-7.49,40.11-19.92,55.06l15.35,15.35c7.35-8.51,13.29-18.04,17.68-28.44,5.62-13.3,8.48-27.42,8.48-41.97s-2.85-28.67-8.48-41.97c-5.43-12.84-13.2-24.37-23.1-34.27-9.9-9.9-21.43-17.67-34.27-23.1-9.67-4.09-19.78-6.71-30.17-7.84-2.45-.45-29.7-5.84-56.46-29.02,0,0,6.14,19.1,18.34,31.62-5.33,1.34-10.55,3.09-15.66,5.25-12.84,5.43-24.37,13.2-34.27,23.1-9.9,9.9-17.67,21.43-23.1,34.27-5.62,13.3-8.48,27.42-8.48,41.97,0,8.15.9,16.16,2.67,23.97l19.62-13.01s0,0,0-.01l73.94-49.05c1.57-1.04,3.11-1.87,4.58-2.46,2.8-1.12,5.68-1.71,8.57-1.74.19,0,.37,0,.56,0,13.49.16,24.63,11.26,24.83,24.75.1,6.79-2.47,13.2-7.23,18.03-4.65,4.72-10.82,7.37-17.43,7.49v-31.5l-18.37.16v180.49l18.37,38.28v-164.59l80.79,80.79Z"/> | ||||
|       <path class="st2" d="M211.04,318.9s.09.04.13.06l18.24,37.9v-153.22l-18.37,12.19v103.08Z"/> | ||||
|       <path class="st2" d="M267.34,305.91v21.77c10.29-1.14,20.3-3.75,29.89-7.81,3.46-1.46,6.82-3.1,10.09-4.9l-16.09-16.09c-7.45,3.44-15.48,5.84-23.88,7.02Z"/> | ||||
|       <path class="st2" d="M171.72,241.91l-18.85,12.51c.9,2.73,1.92,5.43,3.05,8.09,5.43,12.84,13.2,24.37,23.1,34.27,6.7,6.7,14.15,12.42,22.24,17.11v-26.18c-14.3-11.52-24.85-27.49-29.54-45.8Z"/> | ||||
|     </g> | ||||
|     <g> | ||||
|       <polygon class="st1" points="257.56 197.03 239.19 197.19 239.19 225.99 257.56 213.8 257.56 197.03"/> | ||||
|       <polygon class="st1" points="211.05 215.81 211.05 244.67 213.16 243.28 229.41 232.49 229.41 203.63 211.05 215.81"/> | ||||
|       <path class="st1" d="M181.07,264.43c-3.08-5.19-5.63-10.72-7.58-16.54-.02-.05-.03-.09-.05-.14-.31-.94-.61-1.89-.89-2.84,0-.02-.01-.05-.02-.07-.29-.97-.56-1.94-.81-2.93l-18.84,12.5c.9,2.73,1.92,5.42,3.04,8.09.48,1.14.99,2.27,1.5,3.39.06.12.11.24.17.36,1.05,2.25,2.18,4.46,3.38,6.62.05.09.1.17.14.26.61,1.09,1.23,2.16,1.87,3.22l18.08-11.92Z"/> | ||||
|       <path class="st1" d="M307.31,314.98l-16.09-16.09c-4.26,1.96-8.71,3.58-13.3,4.83l17.07,17.07c.75-.3,1.49-.6,2.23-.91,3.46-1.46,6.82-3.1,10.09-4.9Z"/> | ||||
|     </g> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 2.9 KiB | 
							
								
								
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_color_02.svg.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Runtime/Engine/core_assets/logo/Logo_color_02.svg.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| fileFormatVersion: 2 | ||||
| guid: d24da9fb27cfeae4da138bc19808a2d7 | ||||
| DefaultImporter: | ||||
|   externalObjects: {} | ||||
|   userData:  | ||||
|   assetBundleName:  | ||||
|   assetBundleVariant:  | ||||
							
								
								
									
										48
									
								
								Runtime/Engine/core_assets/logo/Logo_white_01.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								Runtime/Engine/core_assets/logo/Logo_white_01.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512"> | ||||
|   <!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116)  --> | ||||
|   <defs> | ||||
|     <style> | ||||
|       .st0 { | ||||
|         stroke: #fff; | ||||
|         stroke-miterlimit: 10; | ||||
|       } | ||||
|  | ||||
|       .st0, .st1 { | ||||
|         fill: #fff; | ||||
|       } | ||||
|     </style> | ||||
|   </defs> | ||||
|   <path class="st0" d="M421.27,254.6"/> | ||||
|   <path class="st0" d="M21.02,254.6"/> | ||||
|   <g> | ||||
|     <g> | ||||
|       <path class="st1" d="M303.53,224.93c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,200.94h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/> | ||||
|       <path class="st1" d="M331.82,205.54h-9.39c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3ZM322.52,223.69v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21Z"/> | ||||
|       <path class="st1" d="M366.8,205.45h-2.66c-2.07,0-3.69.55-4.87,1.64-.59.55-1.03,1.24-1.33,2.07v-19.38h-10.01v59.24h9.92v-4.01c.29.97.76,1.76,1.42,2.37,1.18,1.09,2.8,1.64,4.87,1.64h2.66c3.19,0,5.5-.77,6.95-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-26.03c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.76-2.3-6.95-2.3ZM365.82,228.48v10.36c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-2.66c-.94,0-1.64-.22-2.08-.66s-.66-1.2-.66-2.26v-22.05c0-1.12.22-1.9.66-2.35.44-.44,1.14-.66,2.08-.66h2.66c1,0,1.67.16,1.99.49.32.32.49.96.49,1.9v12.84Z"/> | ||||
|       <path class="st1" d="M401.86,205.54h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3ZM401.42,232.99v6.11c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-23.64c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v17.53Z"/> | ||||
|       <path class="st1" d="M427.45,249.02h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3ZM427.81,229.63v-14.17c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v23.64c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-9.47Z"/> | ||||
|       <path class="st1" d="M470.93,213.33v-7.79h-5.93v-7.79h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93Z"/> | ||||
|     </g> | ||||
|     <g> | ||||
|       <rect class="st1" x="400.18" y="256.72" width="10.54" height="8.77"/> | ||||
|       <g> | ||||
|         <path class="st1" d="M303.53,291.96c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,267.96h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/> | ||||
|         <path class="st1" d="M322.43,272.57c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3h-9.39ZM329.25,280.01c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25Z"/> | ||||
|         <path class="st1" d="M365.38,276.82c-.27-1.07-.76-1.95-1.46-2.61-1.15-1.09-2.76-1.64-4.83-1.64h-2.75c-3.13,0-5.42.77-6.86,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.73,2.3,6.86,2.3h2.75c2.07,0,3.67-.55,4.83-1.64.57-.54,1-1.22,1.28-2.04v3.68h10.09v-43.48h-9.92v4.25ZM364.58,307.59c-.41.44-1.12.66-2.13.66h-2.66c-.95,0-1.59-.18-1.95-.53-.35-.35-.53-.97-.53-1.86v-23.11c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h2.66c1,0,1.71.22,2.13.66.41.44.62,1.2.62,2.26v22.05c0,1.06-.21,1.82-.62,2.26Z"/> | ||||
|         <rect class="st1" x="382.82" y="256.81" width="10.01" height="59.24"/> | ||||
|         <rect class="st1" x="400.44" y="272.57" width="10.01" height="43.48"/> | ||||
|         <path class="st1" d="M429.04,264.78h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93v-7.79h-5.93v-7.79Z"/> | ||||
|         <path class="st1" d="M452.95,306.04l-6.2-33.47h-10.36l9.92,41.88h4.78l-.71,2.83c-.35,1.24-.93,2.07-1.73,2.48-.8.41-1.82.62-3.06.62h-4.52v7.7h5.93c3.54,0,6.26-.81,8.15-2.43,1.89-1.62,3.19-3.94,3.9-6.95l9.74-46.13h-10.09l-5.76,33.47Z"/> | ||||
|       </g> | ||||
|     </g> | ||||
|     <g> | ||||
|       <path class="st1" d="M230.84,365.76l34.69,8.74-95.47-95.5h0c4.76-2.32,9.05-5.41,12.8-9.22,4.3-4.36,7.65-9.44,9.96-15.08,2.4-5.86,3.57-12.06,3.47-18.43-.18-12.2-5.07-23.69-13.76-32.36-8.69-8.67-20.2-13.52-32.4-13.66-.34,0-.69,0-1.04,0-5.57.06-11.09,1.16-16.39,3.29-2.83,1.14-5.69,2.65-8.48,4.51l-61.31,40.67c7.29-40.21,42.56-70.79,84.84-70.79,47.54,0,86.22,38.68,86.22,86.22,0,20.91-7.49,40.11-19.92,55.06l15.35,15.35c7.35-8.51,13.29-18.04,17.68-28.44,5.62-13.3,8.48-27.42,8.48-41.97s-2.85-28.67-8.48-41.97c-5.43-12.84-13.2-24.37-23.1-34.27-9.9-9.9-21.43-17.67-34.27-23.1-9.67-4.09-19.78-6.71-30.17-7.84-2.45-.45-29.7-5.84-56.46-29.02,0,0,6.14,19.1,18.34,31.62-5.33,1.34-10.55,3.09-15.66,5.25-12.84,5.43-24.37,13.2-34.27,23.1-9.9,9.9-17.67,21.43-23.1,34.27-5.62,13.3-8.48,27.42-8.48,41.97,0,8.15.9,16.16,2.67,23.97l19.62-13.01s0,0,0-.01l73.94-49.05c1.57-1.04,3.11-1.87,4.58-2.46,2.8-1.12,5.68-1.71,8.57-1.74.19,0,.37,0,.56,0,13.49.16,24.63,11.26,24.83,24.75.1,6.79-2.47,13.2-7.23,18.03-4.65,4.72-10.82,7.37-17.43,7.49v-31.5l-18.37.16v180.49l18.37,38.28v-164.59l80.79,80.79Z"/> | ||||
|       <path class="st1" d="M103.53,352.5s.09.04.13.06l18.24,37.9v-153.22l-18.37,12.19v103.08Z"/> | ||||
|       <path class="st1" d="M159.83,339.51v21.77c10.29-1.14,20.3-3.75,29.89-7.81,3.46-1.46,6.82-3.1,10.09-4.9l-16.09-16.09c-7.45,3.44-15.48,5.84-23.88,7.02Z"/> | ||||
|       <path class="st1" d="M64.21,275.51l-18.85,12.51c.9,2.73,1.92,5.43,3.05,8.09,5.43,12.84,13.2,24.37,23.1,34.27,6.7,6.7,14.15,12.42,22.24,17.11v-26.18c-14.3-11.52-24.85-27.49-29.54-45.8Z"/> | ||||
|     </g> | ||||
|     <path class="st0" d="M421.27,254.58"/> | ||||
|     <path class="st0" d="M21.02,254.58"/> | ||||
|   </g> | ||||
| </svg> | ||||
| After Width: | Height: | Size: 6.8 KiB | 
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user