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