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; | using UnityEngine; | ||||||
|  |  | ||||||
| namespace RebootKitEditor.PropertyDrawers { | namespace RebootKitEditor.PropertyDrawers { | ||||||
|     [CustomPropertyDrawer(typeof(CVar))] |     [CustomPropertyDrawer(typeof(ConfigVar))] | ||||||
|     public class CVarDrawer : PropertyDrawer { |     public class CVarDrawer : PropertyDrawer { | ||||||
|         bool m_Expand; |         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 | ||||||
| @@ -1,18 +1,20 @@ | |||||||
| { | { | ||||||
|   "name": "SzafaKitEditor", |     "name": "SzafaKitEditor", | ||||||
|   "rootNamespace": "RebootKitEditor", |     "rootNamespace": "RebootKitEditor", | ||||||
|   "references": [ |     "references": [ | ||||||
|     "GUID:284059c7949783646b281a1b815580e6" |         "GUID:284059c7949783646b281a1b815580e6", | ||||||
|   ], |         "GUID:9e24947de15b9834991c9d8411ea37cf", | ||||||
|   "includePlatforms": [ |         "GUID:69448af7b92c7f342b298e06a37122aa" | ||||||
|     "Editor" |     ], | ||||||
|   ], |     "includePlatforms": [ | ||||||
|   "excludePlatforms": [], |         "Editor" | ||||||
|   "allowUnsafeCode": false, |     ], | ||||||
|   "overrideReferences": false, |     "excludePlatforms": [], | ||||||
|   "precompiledReferences": [], |     "allowUnsafeCode": false, | ||||||
|   "autoReferenced": true, |     "overrideReferences": false, | ||||||
|   "defineConstraints": [], |     "precompiledReferences": [], | ||||||
|   "versionDefines": [], |     "autoReferenced": true, | ||||||
|   "noEngineReferences": false |     "defineConstraints": [], | ||||||
|  |     "versionDefines": [], | ||||||
|  |     "noEngineReferences": false | ||||||
| } | } | ||||||
							
								
								
									
										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 | # 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 | ### manifest.json | ||||||
| Ensure you have the following dependencies in your `Packages/manifest.json` file: | 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 | ```json | ||||||
| { | { | ||||||
|   "dependencies": { |   "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 { | namespace RebootKit.Engine { | ||||||
|     [CreateAssetMenu(menuName = RConsts.k_AddComponentMenu + RConsts.k_EngineConfigAssetName, fileName = RConsts.k_EngineConfigAssetName)] |     [CreateAssetMenu(menuName = RConsts.k_AddComponentMenu + RConsts.k_EngineConfigAssetName, fileName = RConsts.k_EngineConfigAssetName)] | ||||||
| @@ -6,6 +7,8 @@ namespace RebootKit.Engine { | |||||||
|         public bool initializeOnLoad = true; |         public bool initializeOnLoad = true; | ||||||
|  |  | ||||||
|         public EngineCoreServicesAsset coreServices; |         public EngineCoreServicesAsset coreServices; | ||||||
|  |         public ServiceAsset[] services; | ||||||
|  |          | ||||||
|         public AppConfig appConfig; |         public AppConfig appConfig; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -5,7 +5,11 @@ using Object = UnityEngine.Object; | |||||||
| namespace RebootKit.Engine.Extensions { | namespace RebootKit.Engine.Extensions { | ||||||
|     public static class TransformEx { |     public static class TransformEx { | ||||||
|         public static void DestroyChildren(this Transform transform) { |         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) { |         public static void ForEachChild(this Transform transform, Action<Transform> action) { | ||||||
|   | |||||||
| @@ -45,7 +45,7 @@ namespace RebootKit.Engine.Services.Console { | |||||||
|         public override string ToString() { |         public override string ToString() { | ||||||
|             return kind switch { |             return kind switch { | ||||||
|                 CVarValueKind.Number => numberValue.ToString(), |                 CVarValueKind.Number => numberValue.ToString(), | ||||||
|                 CVarValueKind.String => $"\"{stringValue}\"", |                 CVarValueKind.String => $"{stringValue}", | ||||||
|                 _ => throw new ArgumentOutOfRangeException() |                 _ => throw new ArgumentOutOfRangeException() | ||||||
|             }; |             }; | ||||||
|         } |         } | ||||||
| @@ -53,17 +53,21 @@ namespace RebootKit.Engine.Services.Console { | |||||||
| 
 | 
 | ||||||
|     [Flags] |     [Flags] | ||||||
|     public enum CVarFlags { |     public enum CVarFlags { | ||||||
|         None, Persistent, ReadOnly |         None = 0, | ||||||
|  |         Client = 1 << 0, | ||||||
|  |         Server = 1 << 1, | ||||||
|  |         ReadOnly = 1 << 2, | ||||||
|  |         User = 1 << 3, | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     [Serializable] |     [Serializable] | ||||||
|     public class CVar { |     public class ConfigVar { | ||||||
|         public CVarFlags flags; |         public CVarFlags flags; | ||||||
|         public string name; |         public string name; | ||||||
|         public string description; |         public string description; | ||||||
|         public CVarValue defaultValue; |         public CVarValue defaultValue; | ||||||
| 
 | 
 | ||||||
|         public CVar(CVar other) { |         public ConfigVar(ConfigVar other) { | ||||||
|             flags = other.flags; |             flags = other.flags; | ||||||
|             name = other.name; |             name = other.name; | ||||||
|             description = other.description; |             description = other.description; | ||||||
| @@ -71,35 +75,35 @@ namespace RebootKit.Engine.Services.Console { | |||||||
|             Value = other.Value; |             Value = other.Value; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public CVar(string name, CVarValue value, string description = "") { |         public ConfigVar(string name, CVarValue value, string description = "") { | ||||||
|             this.name = name; |             this.name = name; | ||||||
|             this.description = description; |             this.description = description; | ||||||
|             defaultValue = value; |             defaultValue = value; | ||||||
|             Value = defaultValue; |             Value = defaultValue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public CVar(string name, int value, string description = "") { |         public ConfigVar(string name, int value, string description = "") { | ||||||
|             this.name = name; |             this.name = name; | ||||||
|             this.description = description; |             this.description = description; | ||||||
|             defaultValue = new CVarValue(value); |             defaultValue = new CVarValue(value); | ||||||
|             Value = defaultValue; |             Value = defaultValue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public CVar(string name, float value, string description = "") { |         public ConfigVar(string name, float value, string description = "") { | ||||||
|             this.name = name; |             this.name = name; | ||||||
|             this.description = description; |             this.description = description; | ||||||
|             defaultValue = new CVarValue(value); |             defaultValue = new CVarValue(value); | ||||||
|             Value = defaultValue; |             Value = defaultValue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public CVar(string name, double value, string description = "") { |         public ConfigVar(string name, double value, string description = "") { | ||||||
|             this.name = name; |             this.name = name; | ||||||
|             this.description = description; |             this.description = description; | ||||||
|             defaultValue = new CVarValue(value); |             defaultValue = new CVarValue(value); | ||||||
|             Value = defaultValue; |             Value = defaultValue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public CVar(string name, string value, string description = "") { |         public ConfigVar(string name, string value, string description = "") { | ||||||
|             this.name = name; |             this.name = name; | ||||||
|             this.description = description; |             this.description = description; | ||||||
|             defaultValue = new CVarValue(value); |             defaultValue = new CVarValue(value); | ||||||
| @@ -113,43 +117,54 @@ namespace RebootKit.Engine.Services.Console { | |||||||
|         public double NumberValue => Value.numberValue; |         public double NumberValue => Value.numberValue; | ||||||
|         public string StringValue => Value.stringValue; |         public string StringValue => Value.stringValue; | ||||||
| 
 | 
 | ||||||
|         public event Action StateChanged = delegate { }; |         public static event Action<ConfigVar> StateChanged = delegate { }; | ||||||
| 
 | 
 | ||||||
|         public void Set(int value) { |         public void Set(int value) { | ||||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; |             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             Value = new CVarValue(value); |             Value = new CVarValue(value); | ||||||
|             StateChanged?.Invoke(); |             StateChanged?.Invoke(this); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void Set(float value) { |         public void Set(float value) { | ||||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; |             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             Value = new CVarValue(value); |             Value = new CVarValue(value); | ||||||
|             StateChanged?.Invoke(); |             StateChanged?.Invoke(this); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void Set(string value) { |         public void Set(string value) { | ||||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; |             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             Value = new CVarValue(value); |             Value = new CVarValue(value); | ||||||
|             StateChanged?.Invoke(); |             StateChanged?.Invoke(this); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void ParseFromString(string str) { |         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); |                 Set(f); | ||||||
|             else |             } else { | ||||||
|                 Set(str); |                 Set(str); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void Reset() { |         public void Reset() { | ||||||
|             if (flags.HasFlag(CVarFlags.ReadOnly)) return; |             if (flags.HasFlag(CVarFlags.ReadOnly)) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|             Value = defaultValue; |             Value = defaultValue; | ||||||
|             StateChanged?.Invoke(); |             StateChanged?.Invoke(this); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public override string ToString() { |         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.Collections.Generic; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Reflection; | using System.Reflection; | ||||||
|  | using ZLinq; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Foundation { | namespace RebootKit.Engine.Foundation { | ||||||
|     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method)] |     [AttributeUsage(AttributeTargets.Field | AttributeTargets.Method)] | ||||||
| @@ -28,7 +29,9 @@ namespace RebootKit.Engine.Foundation { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void Bind(Type type, object obj) { |         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) { |         public void Bind<TBind>(TBind obj) { | ||||||
| @@ -53,22 +56,27 @@ namespace RebootKit.Engine.Foundation { | |||||||
|             Inject(instance); |             Inject(instance); | ||||||
|             return instance; |             return instance; | ||||||
|         } |         } | ||||||
|          |  | ||||||
|         public T Create<T>(params object[] args) { |         public T Create<T>(params object[] args) { | ||||||
|             T instance = (T) Activator.CreateInstance(typeof(T), args); |             T instance = (T) Activator.CreateInstance(typeof(T), args); | ||||||
|             Inject(instance); |             Inject(instance); | ||||||
|             return instance; |             return instance; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void Inject<T>(T target) { |         public void Inject(object target) { | ||||||
|             Type type = typeof(T); |             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)) { |             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() |                 Type[] paramsTypes = method.GetParameters() | ||||||
|  |                                            .AsValueEnumerable() | ||||||
|                                            .Select(t => t.ParameterType) |                                            .Select(t => t.ParameterType) | ||||||
|                                            .ToArray(); |                                            .ToArray(); | ||||||
|  |  | ||||||
| @@ -77,7 +85,9 @@ namespace RebootKit.Engine.Foundation { | |||||||
|                 for (int i = 0; i < paramsTypes.Length; ++i) { |                 for (int i = 0; i < paramsTypes.Length; ++i) { | ||||||
|                     instances[i] = Resolve(paramsTypes[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); |                 method.Invoke(target, instances); | ||||||
| @@ -85,9 +95,11 @@ namespace RebootKit.Engine.Foundation { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         bool InjectField(FieldInfo field, object target) { |         bool InjectField(FieldInfo field, object target) { | ||||||
|             for (int i = m_FieldInjectors.Count - 1; i >= 0; i--) |             for (int i = m_FieldInjectors.Count - 1; i >= 0; i--) { | ||||||
|                 if (m_FieldInjectors[i].Inject(field, target, this)) |                 if (m_FieldInjectors[i].Inject(field, target, this)) { | ||||||
|                     return true; |                     return true; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -18,12 +18,16 @@ namespace RebootKit.Engine.Foundation { | |||||||
|  |  | ||||||
|             RR.s_Shared = null; |             RR.s_Shared = null; | ||||||
|  |  | ||||||
|  |             // unload all scenes | ||||||
|  |  | ||||||
|             s_cancellationTokenSource = new CancellationTokenSource(); |             s_cancellationTokenSource = new CancellationTokenSource(); | ||||||
|             RunAsync(s_cancellationTokenSource.Token).Forget(); |             RunAsync(s_cancellationTokenSource.Token).Forget(); | ||||||
|  |  | ||||||
| #if UNITY_EDITOR | #if UNITY_EDITOR | ||||||
|             static void OnPlayerModeState(PlayModeStateChange state) { |             static void OnPlayerModeState(PlayModeStateChange state) { | ||||||
|                 if (state == PlayModeStateChange.ExitingPlayMode) s_cancellationTokenSource.Cancel(); |                 if (state == PlayModeStateChange.ExitingPlayMode) { | ||||||
|  |                     s_cancellationTokenSource.Cancel(); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             EditorApplication.playModeStateChanged -= OnPlayerModeState; |             EditorApplication.playModeStateChanged -= OnPlayerModeState; | ||||||
| @@ -32,6 +36,9 @@ namespace RebootKit.Engine.Foundation { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         static async UniTask RunAsync(CancellationToken cancellationToken) { |         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"); |             s_logger.Info("Loading engine config"); | ||||||
|             EngineConfigAsset configAsset = Resources.Load<EngineConfigAsset>(RConsts.k_EngineConfigResourcesPath); |             EngineConfigAsset configAsset = Resources.Load<EngineConfigAsset>(RConsts.k_EngineConfigResourcesPath); | ||||||
|             if (configAsset == null) { |             if (configAsset == null) { | ||||||
| @@ -42,7 +49,7 @@ namespace RebootKit.Engine.Foundation { | |||||||
|             if (!configAsset.initializeOnLoad) { |             if (!configAsset.initializeOnLoad) { | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|              |  | ||||||
|             using RR instance = new(); |             using RR instance = new(); | ||||||
|             RR.s_Shared = instance; |             RR.s_Shared = instance; | ||||||
|  |  | ||||||
| @@ -54,6 +61,8 @@ namespace RebootKit.Engine.Foundation { | |||||||
|  |  | ||||||
|             s_logger.Info("Starting RR"); |             s_logger.Info("Starting RR"); | ||||||
|             instance.Run(); |             instance.Run(); | ||||||
|  |  | ||||||
|  |             await UniTask.WaitUntilCanceled(Application.exitCancellationToken); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -2,6 +2,7 @@ | |||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using Cysharp.Threading.Tasks; | using Cysharp.Threading.Tasks; | ||||||
|  | using JetBrains.Annotations; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Foundation { | namespace RebootKit.Engine.Foundation { | ||||||
|     public interface IController : IDisposable { |     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 { |         public bool TryFind<T>(out T outController) where T : IController { | ||||||
|             foreach (TController controller in _controllers) { |             foreach (TController controller in _controllers) { | ||||||
|                 if (controller is T res) { |                 if (controller is T res) { | ||||||
|   | |||||||
| @@ -74,7 +74,7 @@ namespace RebootKit.Engine.Foundation { | |||||||
|                 case LogLevel.Warning: |                 case LogLevel.Warning: | ||||||
|                     return $"[W][<b>{name}</b>] <color=#ffffff>{message}</color>"; |                     return $"[W][<b>{name}</b>] <color=#ffffff>{message}</color>"; | ||||||
|                 case LogLevel.Error: |                 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: |                 default: | ||||||
|                     throw new ArgumentOutOfRangeException(nameof(level), level, null); |                     throw new ArgumentOutOfRangeException(nameof(level), level, null); | ||||||
|             } |             } | ||||||
|   | |||||||
| @@ -11,19 +11,22 @@ namespace RebootKit.Engine.Foundation { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     [DefaultExecutionOrder(-1000)] |     [DefaultExecutionOrder(-1000)] | ||||||
|     public class SceneDI : MonoBehaviour, IDependencyInstaller { |     public class SceneContext : MonoBehaviour, IDependencyInstaller { | ||||||
|         static readonly Logger s_logger = new(nameof(SceneDI)); |         static readonly Logger s_logger = new(nameof(SceneContext)); | ||||||
| 
 | 
 | ||||||
|         [SerializeField] SceneDependencyInstaller[] m_Installers; |         [SerializeField] SceneDependencyInstaller[] m_Installers; | ||||||
| 
 | 
 | ||||||
|         void Awake() { |         void Awake() { | ||||||
|             DIContext context = RR.DIContext; |             DIContext context = RR.DIContext; | ||||||
|  |              | ||||||
|             foreach (GameObject root in gameObject.scene.GetRootGameObjects()) { |             foreach (GameObject root in gameObject.scene.GetRootGameObjects()) { | ||||||
|  |                 s_logger.Info("Injecting root game object: " + root.name); | ||||||
|                 context.InjectGameObject(root); |                 context.InjectGameObject(root); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         public void Install(DIContext context) { |         public void Install(DIContext context) { | ||||||
|  |             s_logger.Info("Installing scene dependency installers"); | ||||||
|             foreach (SceneDependencyInstaller installer in m_Installers) { |             foreach (SceneDependencyInstaller installer in m_Installers) { | ||||||
|                 installer.Install(context); |                 installer.Install(context); | ||||||
|             } |             } | ||||||
| @@ -1,17 +1,15 @@ | |||||||
| using RebootKit.Engine.Foundation; | using RebootKit.Engine.Foundation; | ||||||
| using RebootKit.Engine.Graphics; |  | ||||||
| using RebootKit.Engine.Services.ConsoleUI; |  | ||||||
| using UnityEngine; | using UnityEngine; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine { | namespace RebootKit.Engine { | ||||||
|     public class MainSceneInstaller : SceneDependencyInstaller { |     public class MainSceneInstaller : SceneDependencyInstaller { | ||||||
|         [SerializeField] MainCameraService _mainCameraService; |  | ||||||
|  |  | ||||||
|         [SerializeField] ConsoleUIService _consoleUIService; |  | ||||||
|  |  | ||||||
|         public override void Install(DIContext context) { |         public override void Install(DIContext context) { | ||||||
|             context.Bind(_mainCameraService); |             foreach (GameObject rootGameObject in gameObject.scene.GetRootGameObjects()) { | ||||||
|             context.Bind(_consoleUIService); |                 IService[] services = rootGameObject.GetComponentsInParent<IService>(); | ||||||
|  |                 foreach (IService service in services) { | ||||||
|  |                     context.Bind(service.GetType(), service); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,13 +1,20 @@ | |||||||
| namespace RebootKit.Engine { | namespace RebootKit.Engine { | ||||||
|     public static class RConsts { |     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_EngineConfigAssetName = "RealityRebootKit"; | ||||||
|         public const string k_EngineConfigResourcesPath = "TheGame/" + k_EngineConfigAssetName; |         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_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"; |         internal const string k_BuildFlagDebug = "RR_DEBUG"; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -13,38 +13,36 @@ namespace RebootKit.Engine { | |||||||
|         public static GameService Game => s_Shared.m_GameService; |         public static GameService Game => s_Shared.m_GameService; | ||||||
|         public static DIContext DIContext => s_Shared.m_DIContext; |         public static DIContext DIContext => s_Shared.m_DIContext; | ||||||
|          |          | ||||||
|         public static UnityEvent<string, CVarValue> CVarChanged => s_Shared.m_CVarChanged; |         public static ConfigVar CVarIndex(string name, int defaultValue = -1) { | ||||||
|          |             ConfigVar cvar = ConfigVarsContainer.Get(name); | ||||||
|         public static CVar CVarIndex(string name, int defaultValue = -1) { |  | ||||||
|             CVar cvar = Console.GetCVar(name); |  | ||||||
|             if (cvar != null) { |             if (cvar != null) { | ||||||
|                 return cvar; |                 return cvar; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             cvar = new CVar(name, defaultValue); |             cvar = new ConfigVar(name, defaultValue); | ||||||
|             Console.Replace(cvar); |             ConfigVarsContainer.Register(cvar); | ||||||
|             return cvar; |             return cvar; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public static CVar CVarNumber(string name, double defaultValue = 0) { |         public static ConfigVar CVarNumber(string name, double defaultValue = 0) { | ||||||
|             CVar cvar = Console.GetCVar(name); |             ConfigVar cvar = ConfigVarsContainer.Get(name); | ||||||
|             if (cvar != null) { |             if (cvar != null) { | ||||||
|                 return cvar; |                 return cvar; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             cvar = new CVar(name, defaultValue); |             cvar = new ConfigVar(name, defaultValue); | ||||||
|             Console.Replace(cvar); |             ConfigVarsContainer.Register(cvar); | ||||||
|             return cvar; |             return cvar; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public static CVar CVarString(string name, string defaultValue = "") { |         public static ConfigVar CVarString(string name, string defaultValue = "") { | ||||||
|             CVar cvar = Console.GetCVar(name); |             ConfigVar cvar = ConfigVarsContainer.Get(name); | ||||||
|             if (cvar != null) { |             if (cvar != null) { | ||||||
|                 return cvar; |                 return cvar; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             cvar = new CVar(name, defaultValue); |             cvar = new ConfigVar(name, defaultValue); | ||||||
|             Console.Replace(cvar); |             ConfigVarsContainer.Register(cvar); | ||||||
|             return 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; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using Cysharp.Threading.Tasks; | using Cysharp.Threading.Tasks; | ||||||
|  | using R3; | ||||||
| using RebootKit.Engine.Foundation; | using RebootKit.Engine.Foundation; | ||||||
| using RebootKit.Engine.Services.Console; | using RebootKit.Engine.Services.Console; | ||||||
| using RebootKit.Engine.Services.Game; | using RebootKit.Engine.Services.Game; | ||||||
| using RebootKit.Engine.Services.Input; | using RebootKit.Engine.Services.Input; | ||||||
| using RebootKit.Engine.Services.Simulation; | using RebootKit.Engine.Services.Simulation; | ||||||
| using UnityEngine; |  | ||||||
| using UnityEngine.Assertions; | using UnityEngine.Assertions; | ||||||
| using UnityEngine.Events; |  | ||||||
| using Logger = RebootKit.Engine.Foundation.Logger; | using Logger = RebootKit.Engine.Foundation.Logger; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine { | namespace RebootKit.Engine { | ||||||
| @@ -17,42 +16,49 @@ namespace RebootKit.Engine { | |||||||
|  |  | ||||||
|         static readonly Logger s_logger = new("RR"); |         static readonly Logger s_logger = new("RR"); | ||||||
|  |  | ||||||
|         ConsoleService m_ConsoleService; |  | ||||||
|         DIContext m_DIContext; |         DIContext m_DIContext; | ||||||
|  |  | ||||||
|  |         ConsoleService m_ConsoleService; | ||||||
|  |  | ||||||
|         EngineConfigAsset m_EngineConfigAsset; |         EngineConfigAsset m_EngineConfigAsset; | ||||||
|         GameService m_GameService; |         GameService m_GameService; | ||||||
|         InputService m_InputService; |         InputService m_InputService; | ||||||
|         WorldService m_WorldService; |         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() { |         public void Dispose() { | ||||||
|             m_CVarChanged.RemoveAllListeners(); |             s_logger.Info("Shutting down"); | ||||||
|  |             m_DisposableBag.Dispose(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async UniTask Init(EngineConfigAsset configAsset, CancellationToken cancellationToken) { |         public async UniTask Init(EngineConfigAsset configAsset, CancellationToken cancellationToken) { | ||||||
|             Assert.IsNotNull(configAsset, "Config asset is required"); |             Assert.IsNotNull(configAsset, "Config asset is required"); | ||||||
|              |  | ||||||
|             s_logger.Info("Waking up"); |             s_logger.Info("Initializing"); | ||||||
|             m_EngineConfigAsset = configAsset; |             m_EngineConfigAsset = configAsset; | ||||||
|  |  | ||||||
|             m_DIContext = new DIContext(); |  | ||||||
|             m_DIContext.AddInjector(new CVarFieldInjector()); |  | ||||||
|  |  | ||||||
|             CreateCoreServices(); |             CreateCoreServices(); | ||||||
|             InitializeAppStateMachine(); |             CreateServices(); | ||||||
|  |  | ||||||
|             await UniTask.Yield(cancellationToken); |             await UniTask.Yield(cancellationToken); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void Run() { |         public void Run() { | ||||||
|             OpenMainMenu(); |             StartGameMode(m_EngineConfigAsset.appConfig.gameConfig.defaultGameMode); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         TService CreateService<TService>(ServiceAsset<TService> asset) where TService : class, IService { |         TService CreateService<TService>(ServiceAsset<TService> asset) where TService : class, IService { | ||||||
|             TService service = asset.Create(m_DIContext); |             TService service = asset.Create(m_DIContext); | ||||||
|             m_DIContext.Bind(service); |             m_DIContext.Bind(service); | ||||||
|  |             m_DisposableBag.Add(service); | ||||||
|             return service; |             return service; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -64,5 +70,11 @@ namespace RebootKit.Engine { | |||||||
|             m_WorldService = CreateService(m_EngineConfigAsset.coreServices.worldService); |             m_WorldService = CreateService(m_EngineConfigAsset.coreServices.worldService); | ||||||
|             m_GameService = CreateService(m_EngineConfigAsset.coreServices.gameService); |             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; | ||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
|  | using System.IO; | ||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Text; | using System.Text; | ||||||
| using RebootKit.Engine.Foundation; | using RebootKit.Engine.Foundation; | ||||||
|  | using UnityEngine; | ||||||
| using Logger = RebootKit.Engine.Foundation.Logger; | using Logger = RebootKit.Engine.Foundation.Logger; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Services.Console { | namespace RebootKit.Engine.Services.Console { | ||||||
| @@ -21,104 +23,136 @@ namespace RebootKit.Engine.Services.Console { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public class ConsoleService : IService { |     public class PrintCVarsCommand : IConsoleCommand { | ||||||
|         static readonly Logger _logger = new(nameof(ConsoleService)); |         public string Name { get; } = "print_cvars"; | ||||||
|  |         public string Description { get; } = "Prints all cvars and their values."; | ||||||
|  |  | ||||||
|         readonly List<IConsoleCommand> _commands = new(); |         public void Execute(string[] args) { | ||||||
|         readonly List<CVar> _cvars = new(); |             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() { |         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()); |             RegisterCommand(new HelpCommand()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void Dispose() { |         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 event Action<string> OnOutputMessage = _ => { }; | ||||||
|  |  | ||||||
|         public void WriteToOutput(string message) { |         public void WriteToOutput(string message) { | ||||||
|  |             if (m_LogFileWriter != null) { | ||||||
|  |                 m_LogFileWriter.WriteLine(message); | ||||||
|  |                 m_LogFileWriter.Flush(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             OnOutputMessage?.Invoke(message); |             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) { |         string[] ParseCommandInputArguments(string text) { | ||||||
|             if (text.Length == 0) return Array.Empty<string>(); |             if (text.Length == 0) { | ||||||
|  |                 return Array.Empty<string>(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|             return new[] {text}; |             return new[] {text}; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void Execute(string input) { |         public void Execute(string input) { | ||||||
|             if (input.Length == 0) return; |             if (input.Length == 0) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             string commandName = input; |             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)); |             string[] arguments = ParseCommandInputArguments(input.Substring(commandName.Length)); | ||||||
|  |  | ||||||
|             foreach (IConsoleCommand command in _commands) |             foreach (IConsoleCommand command in m_ConsoleCommands) { | ||||||
|                 if (command.Name.Equals(commandName)) { |                 if (command.Name.Equals(commandName)) { | ||||||
|                     command.Execute(arguments); |                     command.Execute(arguments); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|             foreach (CVar cvar in _cvars) |             foreach (ConfigVar cvar in ConfigVarsContainer.All()) { | ||||||
|                 if (cvar.name.Equals(commandName)) { |                 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"); |                     WriteToOutput($"<b>{cvar.name}</b> - {cvar}\n"); | ||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|  |             } | ||||||
|  |  | ||||||
|             WriteToOutput($"ERROR: Command/CVar `{commandName}` not found."); |             WriteToOutput($"ERROR: Command/CVar `{commandName}` not found."); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void RegisterCommand(IConsoleCommand command) { |         public void RegisterCommand(IConsoleCommand command) { | ||||||
|             if (_commands.Any(t => t.Name.Equals(command.Name))) { |             if (m_ConsoleCommands.Any(t => t.Name.Equals(command.Name))) { | ||||||
|                 _logger.Error($"`{command.Name}` command is already registered"); |                 s_logger.Error($"`{command.Name}` command is already registered"); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             _commands.Add(command); |             m_ConsoleCommands.Add(command); | ||||||
|             _logger.Info($"Registered command: {command.Name}"); |             s_logger.Info($"Registered command: {command.Name}"); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void PrintHelp() { |         public void PrintHelp() { | ||||||
|             StringBuilder message = new(); |             StringBuilder message = new(); | ||||||
|  |  | ||||||
|             message.AppendLine("Available commands:"); |             message.AppendLine("Available commands:"); | ||||||
|             foreach (IConsoleCommand command in _commands) { |             foreach (IConsoleCommand command in m_ConsoleCommands) { | ||||||
|                 message.Append("    "); |                 message.Append("    "); | ||||||
|                 message.Append(command.Name); |                 message.Append(command.Name); | ||||||
|                 message.Append(" - "); |                 message.Append(" - "); | ||||||
| @@ -127,7 +161,7 @@ namespace RebootKit.Engine.Services.Console { | |||||||
|             } |             } | ||||||
|  |  | ||||||
|             message.AppendLine("Available cvars:"); |             message.AppendLine("Available cvars:"); | ||||||
|             foreach (CVar cvar in _cvars) { |             foreach (ConfigVar cvar in ConfigVarsContainer.All()) { | ||||||
|                 message.Append("    "); |                 message.Append("    "); | ||||||
|                 message.Append(cvar.name); |                 message.Append(cvar.name); | ||||||
|                 message.Append(" - "); |                 message.Append(" - "); | ||||||
| @@ -137,5 +171,60 @@ namespace RebootKit.Engine.Services.Console { | |||||||
|  |  | ||||||
|             WriteToOutput(message.ToString()); |             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 RebootKit.Engine.Foundation; | ||||||
| using UnityEngine; | using UnityEngine; | ||||||
|  | using Logger = RebootKit.Engine.Foundation.Logger; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Services.Console { | namespace RebootKit.Engine.Services.Console { | ||||||
|     [CreateAssetMenu(menuName = RConsts.k_ServiceAssetMenu + "Console")] |     [CreateAssetMenu(menuName = RConsts.k_ServiceAssetMenu + "Console")] | ||||||
|     public class ConsoleServiceAsset : ServiceAsset<ConsoleService> { |     public class ConsoleServiceAsset : ServiceAsset<ConsoleService> { | ||||||
|         [SerializeField] CVar[] _initialCVars; |         static readonly Logger s_logger = new(nameof(ConsoleServiceAsset)); | ||||||
|  |  | ||||||
|         [SerializeField] bool _loadCVarsFromResources = true; |  | ||||||
|  |  | ||||||
|         public override ConsoleService Create(DIContext context) { |         public override ConsoleService Create(DIContext context) { | ||||||
|             ConsoleService service = new(); |             ConsoleService service = new(); | ||||||
|             context.Inject(service); |             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; |             return service; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -57,6 +57,7 @@ namespace RebootKit.Engine.Services.ConsoleUI { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         void OnUserInput(string input) { |         void OnUserInput(string input) { | ||||||
|  |             RR.Console.WriteToOutput("> " + input); | ||||||
|             RR.Console.Execute(input); |             RR.Console.Execute(input); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,28 +1,39 @@ | |||||||
| using System.Threading; | using System; | ||||||
| using Cysharp.Threading.Tasks; |  | ||||||
| using RebootKit.Engine.UI; | using RebootKit.Engine.UI; | ||||||
| using UnityEngine; | using UnityEngine; | ||||||
| using UnityEngine.UIElements; | using UnityEngine.UIElements; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Services.Development { | namespace RebootKit.Engine.Services.Development { | ||||||
|     public class DebugOverlayView : MonoBehaviour, IView { |     public class DebugOverlayView : UIDocumentView { | ||||||
|         [SerializeField] UIDocument m_Document; |         const string k_DebugLabelClassName = "rr__debug-label"; | ||||||
|  |  | ||||||
|         void Start() { |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public async UniTask Show(CancellationToken cancellationToken) { |  | ||||||
|             gameObject.SetActive(true); |  | ||||||
|             await UniTask.Yield(cancellationToken); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public async UniTask Hide(CancellationToken cancellationToken) { |  | ||||||
|             gameObject.SetActive(false); |  | ||||||
|             await UniTask.Yield(cancellationToken); |  | ||||||
|         } |  | ||||||
|          |          | ||||||
|         void SetOverlayModeChanged(int mode) { |         VisualElement m_RootElement; | ||||||
|  |          | ||||||
|  |         Label m_FPSLabel; | ||||||
|  |  | ||||||
|  |         void Update() { | ||||||
|  |             if (m_RootElement == null) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             m_FPSLabel.text = $"fps: {Mathf.RoundToInt(1f / Time.deltaTime)} | dt: {Time.deltaTime:F4}ms | runtime: {Time.time:F4}s"; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         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; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         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 System; | ||||||
| using Cysharp.Threading.Tasks; |  | ||||||
| using RebootKit.Engine.Foundation; | using RebootKit.Engine.Foundation; | ||||||
| using RebootKit.Engine.Services.Console; | using RebootKit.Engine.Services.Console; | ||||||
| using UnityEngine; | using UnityEngine; | ||||||
|  | using UnityEngine.InputSystem; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Services.Development { | namespace RebootKit.Engine.Services.Development { | ||||||
|     static class DebugCVars { |     static class DebugConfig { | ||||||
|         public const string k_OverlayMode = "debug.mode"; |         [ConfigVar("debug.overlay", 1, "Controls overlay visibility. 0 - hidden, 1 - visible")] public static ConfigVar s_OverlayMode; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public class DevToolsService : ServiceMonoBehaviour { |     public class DevToolsService : ServiceMonoBehaviour { | ||||||
|         [SerializeField] DebugOverlayView m_DebugOverlayView; |         [SerializeField] DebugOverlayView m_DebugOverlayView; | ||||||
|  |  | ||||||
|         [CVar(DebugCVars.k_OverlayMode, 1)] CVar m_OverlayMode; |  | ||||||
|  |  | ||||||
|         IDisposable m_CVarChangedListener; |         IDisposable m_CVarChangedListener; | ||||||
|  |  | ||||||
|         void OnEnable() { |         void Start() { | ||||||
|             m_CVarChangedListener = RR.CVarChanged.Listen(OnCVarChanged); |             ConfigVar.StateChanged += OnCVarChanged; | ||||||
|             OnOverlayModeChanged(m_OverlayMode.IndexValue); |             // OnOverlayModeChanged(m_OverlayMode.IndexValue); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         void OnDisable() { |         void OnDisable() { | ||||||
| @@ -26,20 +25,26 @@ namespace RebootKit.Engine.Services.Development { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         public override void Dispose() { |         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) { |         void OnOverlayModeChanged(int mode) { | ||||||
|             if (mode == 1) { |             if (mode == 1) { | ||||||
|                 m_DebugOverlayView.Show(destroyCancellationToken).Forget(); |                 m_DebugOverlayView.gameObject.SetActive(true); | ||||||
|             } else { |             } else { | ||||||
|                 m_DebugOverlayView.Hide(destroyCancellationToken).Forget(); |                 m_DebugOverlayView.gameObject.SetActive(false); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         void OnCVarChanged(string cvarName, CVarValue value) { |         void OnCVarChanged(ConfigVar cvar) { | ||||||
|             if (cvarName == DebugCVars.k_OverlayMode) { |             if (cvar == DebugConfig.s_OverlayMode) { | ||||||
|                 OnOverlayModeChanged((int)value.numberValue); |                 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 System.Threading; | ||||||
| using Cysharp.Threading.Tasks; | using Cysharp.Threading.Tasks; | ||||||
|  | using R3; | ||||||
| using RebootKit.Engine.Foundation; | using RebootKit.Engine.Foundation; | ||||||
| using UnityEngine.Assertions; |  | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Services.Game { | namespace RebootKit.Engine.Services.Game { | ||||||
|     public class GameService : IService { |     public class GameService : IService { | ||||||
|         static readonly Logger s_logger = new(nameof(GameService)); |         static readonly Logger s_logger = new(nameof(GameService)); | ||||||
|  |  | ||||||
|         [Inject] DIContext m_DIContext; |         [Inject] DIContext m_DIContext; | ||||||
|         GameMode m_GameMode; |  | ||||||
|  |  | ||||||
|         GameModeAsset m_GameModeAsset; |         GameModeAsset m_GameModeAsset; | ||||||
|         bool m_isRunning; |  | ||||||
|  |         CancellationTokenSource m_DestroyCancellationTokenSource = new(); | ||||||
|  |         DisposableBag m_ActiveGameModeDisposableBag; | ||||||
|  |         IGameMode m_ActiveGameMode; | ||||||
|  |  | ||||||
|         public void Dispose() { |         public void Dispose() { | ||||||
|             m_isRunning = false; |             m_DestroyCancellationTokenSource.Cancel(); | ||||||
|             m_GameMode.Dispose(); |             m_DestroyCancellationTokenSource.Dispose(); | ||||||
|  |             m_ActiveGameModeDisposableBag.Dispose(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async UniTask Start(GameModeAsset asset, CancellationToken cancellationToken) { |         public void Start(GameModeAsset asset) { | ||||||
|             Assert.IsNotNull(asset); |             if (m_ActiveGameMode != null) { | ||||||
|  |                 s_logger.Warning("Game is already running"); | ||||||
|             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"); |  | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             m_isRunning = true; |             Stop(); | ||||||
|             while (m_isRunning) { |  | ||||||
|                 await UniTask.Yield(PlayerLoopTiming.Update, cancellationToken); |  | ||||||
|                 m_GameMode.Tick(); |  | ||||||
|  |  | ||||||
|                 if (cancellationToken.IsCancellationRequested) { |             m_ActiveGameModeDisposableBag = new DisposableBag(); | ||||||
|                     return; |             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 { | namespace RebootKit.Engine.Services.Simulation { | ||||||
|     public class Actor : MonoBehaviour { |     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; | using UnityEngine; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.Services.Simulation { | namespace RebootKit.Engine.Services.Simulation { | ||||||
| @@ -14,12 +15,15 @@ namespace RebootKit.Engine.Services.Simulation { | |||||||
|  |  | ||||||
|         public Rigidbody Current { get; private set; } |         public Rigidbody Current { get; private set; } | ||||||
|  |  | ||||||
|  |         [field: SerializeField] | ||||||
|         public Vector3 TargetWorldPosition { get; set; } |         public Vector3 TargetWorldPosition { get; set; } | ||||||
|  |  | ||||||
|         public bool IsDragging => Current != null; |         public bool IsDragging => Current != null; | ||||||
|  |  | ||||||
|         public void FixedUpdate() { |         public void FixedUpdate() { | ||||||
|             if (Current.OrNull() == null) return; |             if (Current.OrNull() == null) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             Vector3 direction = (TargetWorldPosition - Current.position).normalized; |             Vector3 direction = (TargetWorldPosition - Current.position).normalized; | ||||||
|             float distance = Vector3.Distance(TargetWorldPosition, Current.position); |             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); |             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) { |         public void Grab(Rigidbody physicsObject) { | ||||||
|  |             Drop(); | ||||||
|  |  | ||||||
|             Current = physicsObject; |             Current = physicsObject; | ||||||
|             Current.linearDamping = 5.0f; |             Current.linearDamping = 5.0f; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void Drop() { |         public void Drop() { | ||||||
|             if (Current == null) return; |             if (Current == null) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             Current.linearDamping = 0.0f; |             Current.linearDamping = 0.0f; | ||||||
|             Current = null; |             Current = null; | ||||||
|   | |||||||
| @@ -20,9 +20,17 @@ namespace RebootKit.Engine.Services.Simulation { | |||||||
|         public async UniTask Load(WorldConfig worldConfig) { |         public async UniTask Load(WorldConfig worldConfig) { | ||||||
|             m_Config = 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.ToUniTask(); | ||||||
|  |              | ||||||
|  |             await handle.Result.ActivateAsync(); | ||||||
|             SceneManager.SetActiveScene(handle.Result.Scene); |             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 { |         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; |                 return null; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             if (gameObject.TryGetComponent(out TActor actor)) return actor; |             if (gameObject.TryGetComponent(out TActor actor)) { | ||||||
|  |                 return actor; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             asset.ReleaseInstance(gameObject); |             asset.ReleaseInstance(gameObject); | ||||||
|             return null; |             return null; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async UniTask RegisterActor(Actor actor) { |         public void RegisterActor(Actor actor) { | ||||||
|             m_Actors.Add(actor); |             m_Actors.Add(actor); | ||||||
|             await UniTask.Yield(); |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void KillActor(Actor actor) { |         public void KillActor(Actor actor) { | ||||||
| @@ -48,7 +57,9 @@ namespace RebootKit.Engine.Services.Simulation { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         public void KillAllActors() { |         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(); |             m_Actors.Clear(); | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -1,3 +0,0 @@ | |||||||
| fileFormatVersion: 2 |  | ||||||
| guid: 01849df87c1948778a9155b635cb0a8f |  | ||||||
| timeCreated: 1743252918 |  | ||||||
| @@ -1,9 +1,11 @@ | |||||||
| using System.Threading; | using System; | ||||||
| using Cysharp.Threading.Tasks; | using UnityEngine.UIElements; | ||||||
|  |  | ||||||
| namespace RebootKit.Engine.UI { | namespace RebootKit.Engine.UI { | ||||||
|     public interface IView { |     public interface IViewBuilder { | ||||||
|         UniTask Show(CancellationToken cancellationToken); |         VisualElement Build(); | ||||||
|         UniTask Hide(CancellationToken cancellationToken); |     } | ||||||
|  |      | ||||||
|  |     public interface IView : IDisposable, IViewBuilder { | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -84,7 +84,7 @@ namespace RebootKit.Engine.UI { | |||||||
|             label.AddToClassList(Classes.k_Label); |             label.AddToClassList(Classes.k_Label); | ||||||
|             return label; |             return label; | ||||||
|         } |         } | ||||||
|  |          | ||||||
|         public static LabelBuilder New(string text) => new(text); |         public static LabelBuilder New(string text) => new(text); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,6 +1,4 @@ | |||||||
| using System.Threading; | using UnityEngine; | ||||||
| using Cysharp.Threading.Tasks; |  | ||||||
| using UnityEngine; |  | ||||||
| using UnityEngine.Profiling; | using UnityEngine.Profiling; | ||||||
| using UnityEngine.UIElements; | using UnityEngine.UIElements; | ||||||
| using Logger = RebootKit.Engine.Foundation.Logger; | using Logger = RebootKit.Engine.Foundation.Logger; | ||||||
| @@ -12,18 +10,9 @@ namespace RebootKit.Engine.UI { | |||||||
|         [SerializeField] UIDocument m_Document; |         [SerializeField] UIDocument m_Document; | ||||||
|  |  | ||||||
|         void OnEnable() { |         void OnEnable() { | ||||||
|             s_logger.Debug("START"); |  | ||||||
|             Rebuild(); |             Rebuild(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public async UniTask Show(CancellationToken cancellationToken) { |  | ||||||
|             await UniTask.Yield(cancellationToken); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         public async UniTask Hide(CancellationToken cancellationToken) { |  | ||||||
|             await UniTask.Yield(cancellationToken); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         protected void Rebuild() { |         protected void Rebuild() { | ||||||
|             Profiler.BeginSample("UI Tree Build"); |             Profiler.BeginSample("UI Tree Build"); | ||||||
|             VisualElement child = Build(); |             VisualElement child = Build(); | ||||||
| @@ -34,5 +23,13 @@ namespace RebootKit.Engine.UI { | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         public abstract VisualElement Build(); |         public abstract VisualElement Build(); | ||||||
|  |         public void Show() { | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public void Hide() { | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         public void Dispose() { | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -1,5 +1,5 @@ | |||||||
| fileFormatVersion: 2 | fileFormatVersion: 2 | ||||||
| guid: 1400c4f93b62de546a78716fe0ffe0bf | guid: a7a04d434257e0c48921a07d2da67388 | ||||||
| folderAsset: yes | folderAsset: yes | ||||||
| DefaultImporter: | DefaultImporter: | ||||||
|   externalObjects: {} |   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": [ |     "maps": [ | ||||||
|         { |         { | ||||||
|             "name": "FPP", |             "name": "FPP", | ||||||
| @@ -108,6 +108,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": 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": "", |                     "name": "", | ||||||
|                     "id": "dd672a14-64ba-4cf6-a7b6-dbd4ac779d9f", |                     "id": "dd672a14-64ba-4cf6-a7b6-dbd4ac779d9f", | ||||||
| @@ -119,6 +130,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": false |                     "isPartOfComposite": false | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "c7899bc3-40a6-4c5f-b4be-aa35b744a98b", | ||||||
|  |                     "path": "<Gamepad>/buttonSouth", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Jump", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "", |                     "name": "", | ||||||
|                     "id": "095c0e94-6900-442e-8bad-a61430bfead1", |                     "id": "095c0e94-6900-442e-8bad-a61430bfead1", | ||||||
| @@ -130,6 +152,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": false |                     "isPartOfComposite": false | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "c22525c4-fa19-4f56-b9ae-63cd056dae70", | ||||||
|  |                     "path": "<Gamepad>/rightStickPress", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Drag", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "", |                     "name": "", | ||||||
|                     "id": "d01e2a9b-4e4a-439f-892d-db8521ed0028", |                     "id": "d01e2a9b-4e4a-439f-892d-db8521ed0028", | ||||||
| @@ -141,6 +174,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": false |                     "isPartOfComposite": false | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "28cdb072-0969-47ee-a2b5-c1e30b05cfc8", | ||||||
|  |                     "path": "<Gamepad>/buttonWest", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Primary", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "", |                     "name": "", | ||||||
|                     "id": "0f8ae92e-c66e-4807-b95d-2fab59bd4e81", |                     "id": "0f8ae92e-c66e-4807-b95d-2fab59bd4e81", | ||||||
| @@ -152,6 +196,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": false |                     "isPartOfComposite": false | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "46615209-739a-447c-9313-5befdf6b885e", | ||||||
|  |                     "path": "<Gamepad>/buttonEast", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Secondary", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "WASD", |                     "name": "WASD", | ||||||
|                     "id": "3151504d-248f-47a2-b1c6-c62f5582beea", |                     "id": "3151504d-248f-47a2-b1c6-c62f5582beea", | ||||||
| @@ -207,6 +262,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": true |                     "isPartOfComposite": true | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "e3c4c724-efa2-49c3-8ee9-32f68f7310f4", | ||||||
|  |                     "path": "<Gamepad>/leftStick", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Move", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "", |                     "name": "", | ||||||
|                     "id": "358c81fe-cbfe-455a-8828-a6d166426430", |                     "id": "358c81fe-cbfe-455a-8828-a6d166426430", | ||||||
| @@ -218,6 +284,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": false |                     "isPartOfComposite": false | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "037bde49-96a0-4b33-a67e-881fd33c6f38", | ||||||
|  |                     "path": "<Gamepad>/buttonNorth", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Use", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "", |                     "name": "", | ||||||
|                     "id": "352a96ce-7752-40ca-8ee7-dcc84bbdebd2", |                     "id": "352a96ce-7752-40ca-8ee7-dcc84bbdebd2", | ||||||
| @@ -229,6 +306,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": false |                     "isPartOfComposite": false | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "6810417c-8efe-4e03-be16-3484f87dde13", | ||||||
|  |                     "path": "<Gamepad>/dpad/up", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Menu0", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "", |                     "name": "", | ||||||
|                     "id": "956136b4-30ff-49d2-bd98-b42bd8944543", |                     "id": "956136b4-30ff-49d2-bd98-b42bd8944543", | ||||||
| @@ -240,6 +328,17 @@ | |||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": false |                     "isPartOfComposite": false | ||||||
|                 }, |                 }, | ||||||
|  |                 { | ||||||
|  |                     "name": "", | ||||||
|  |                     "id": "95c4113e-905b-4672-aa00-f9fcb9d396b6", | ||||||
|  |                     "path": "<Gamepad>/dpad/right", | ||||||
|  |                     "interactions": "", | ||||||
|  |                     "processors": "", | ||||||
|  |                     "groups": "", | ||||||
|  |                     "action": "Menu1", | ||||||
|  |                     "isComposite": false, | ||||||
|  |                     "isPartOfComposite": false | ||||||
|  |                 }, | ||||||
|                 { |                 { | ||||||
|                     "name": "", |                     "name": "", | ||||||
|                     "id": "ad048d87-67fa-434f-a0ed-cce955e68659", |                     "id": "ad048d87-67fa-434f-a0ed-cce955e68659", | ||||||
| @@ -250,6 +349,17 @@ | |||||||
|                     "action": "Menu2", |                     "action": "Menu2", | ||||||
|                     "isComposite": false, |                     "isComposite": false, | ||||||
|                     "isPartOfComposite": 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_Enabled: 1 | ||||||
|   m_EditorHideFlags: 0 |   m_EditorHideFlags: 0 | ||||||
|   m_Script: {fileID: 11500000, guid: e8d574cf0e024ec7bc4363a675dbb2c9, type: 3} |   m_Script: {fileID: 11500000, guid: e8d574cf0e024ec7bc4363a675dbb2c9, type: 3} | ||||||
|   m_Name: Input Action Toggle Console |   m_Name: input_action_toggle_console | ||||||
|   m_EditorClassIdentifier:  |   m_EditorClassIdentifier:  | ||||||
|   <Action>k__BackingField: |   <Action>k__BackingField: | ||||||
|     m_Name: Action |     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:  | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user