This commit is contained in:
2025-04-14 23:22:38 +02:00
parent 72b8a37345
commit 1e190fe94b
166 changed files with 2989 additions and 687 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -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;
}
}

View File

@@ -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) {

View File

@@ -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() {

View 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);
}
}
}
}
}

View 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;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 602c79db950d497ea9800a6538aa7ab6
timeCreated: 1743848110

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace RebootKit.Engine.Foundation {
[CreateAssetMenu(menuName = RConsts.k_CreateAssetMenu + "Constants/Consts Color")]
public class ConstsColorAsset : ConstantsAsset<Color> {
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5055a0315a6942988576e3dc5fa72368
timeCreated: 1743848378

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace RebootKit.Engine.Foundation {
[CreateAssetMenu(menuName = RConsts.k_CreateAssetMenu + "Constants/Consts Float")]
public class ConstsFloatAsset : ConstantsAsset<float> {
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 82df0e4f31ac4722ae6ec18f66815179
timeCreated: 1743848335

View File

@@ -0,0 +1,7 @@
using UnityEngine;
namespace RebootKit.Engine.Foundation {
[CreateAssetMenu(menuName = RConsts.k_CreateAssetMenu + "Constants/Consts Int")]
public class ConstsIntAsset : ConfigAsset<int> {
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 064ad4ee1c584489b0c65417e8b500ea
timeCreated: 1743848190

View 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;
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 426c2ae5506c4629bf757f51c5b94249
timeCreated: 1743848423

View File

@@ -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;
}

View File

@@ -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);
}
}
}

View File

@@ -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) {

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}
}
}
}
}

View File

@@ -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";
}

View File

@@ -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;
}
}

View File

@@ -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>();
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: d7b1b5cbd7e04f38ba5f61a04709336b
timeCreated: 1743213081

View 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);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c614fae80bc84ae8b7f3ee034a42f074
timeCreated: 1743437396

View File

@@ -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);
}
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 443a66c3a441450d96d222872a567df0
timeCreated: 1741639598

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -57,6 +57,7 @@ namespace RebootKit.Engine.Services.ConsoleUI {
}
void OnUserInput(string input) {
RR.Console.WriteToOutput("> " + input);
RR.Console.Execute(input);
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 73f15dc489209cc4a9ff6963e0fbd2c6

View File

@@ -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();
}
}
}

View 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> {
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 562c4ff92afe4949b468003a0e997522
timeCreated: 1743456239

View File

@@ -0,0 +1,5 @@
namespace RebootKit.Engine.Services.Game {
public class Player {
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: be94d631484b4bd2a2c9825290b74b36
timeCreated: 1744413325

View File

@@ -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() {
}
}
}

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 01849df87c1948778a9155b635cb0a8f
timeCreated: 1743252918

View File

@@ -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 {
}
}

View File

@@ -84,7 +84,7 @@ namespace RebootKit.Engine.UI {
label.AddToClassList(Classes.k_Label);
return label;
}
public static LabelBuilder New(string text) => new(text);
}
}

View File

@@ -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() {
}
}
}

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 1400c4f93b62de546a78716fe0ffe0bf
guid: a7a04d434257e0c48921a07d2da67388
folderAsset: yes
DefaultImporter:
externalObjects: {}

View 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}

View File

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

View File

@@ -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
}
]
}

View File

@@ -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

View File

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

View File

@@ -0,0 +1,4 @@
Logo 1st - #B9B8B9
Logo 2nd - #6B6B6B
Background - #242126
Text 2nd - #696969

View File

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

View 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

View File

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

View 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

View File

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

View 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

View File

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

View 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

View File

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

View File

@@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512">
<!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116) -->
<defs>
<style>
.st0 {
stroke: #fff;
stroke-miterlimit: 10;
}
.st0, .st1 {
fill: #fff;
}
</style>
</defs>
<path class="st0" d="M421.27,254.6"/>
<path class="st0" d="M21.02,254.6"/>
<g>
<g>
<path class="st1" d="M303.53,224.93c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,200.94h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/>
<path class="st1" d="M331.82,205.54h-9.39c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3ZM322.52,223.69v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21Z"/>
<path class="st1" d="M366.8,205.45h-2.66c-2.07,0-3.69.55-4.87,1.64-.59.55-1.03,1.24-1.33,2.07v-19.38h-10.01v59.24h9.92v-4.01c.29.97.76,1.76,1.42,2.37,1.18,1.09,2.8,1.64,4.87,1.64h2.66c3.19,0,5.5-.77,6.95-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-26.03c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.76-2.3-6.95-2.3ZM365.82,228.48v10.36c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-2.66c-.94,0-1.64-.22-2.08-.66s-.66-1.2-.66-2.26v-22.05c0-1.12.22-1.9.66-2.35.44-.44,1.14-.66,2.08-.66h2.66c1,0,1.67.16,1.99.49.32.32.49.96.49,1.9v12.84Z"/>
<path class="st1" d="M401.86,205.54h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3ZM401.42,232.99v6.11c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-23.64c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v17.53Z"/>
<path class="st1" d="M427.45,249.02h10.01c3.36,0,5.77-.77,7.22-2.3,1.45-1.53,2.17-3.69,2.17-6.46v-25.94c0-2.77-.72-4.93-2.17-6.46-1.45-1.53-3.85-2.3-7.22-2.3h-10.01c-3.42,0-5.86.77-7.31,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.88,2.3,7.31,2.3ZM427.81,229.63v-14.17c0-.94.18-1.58.53-1.9.35-.32,1.03-.49,2.04-.49h4.07c1,0,1.68.16,2.04.49.35.33.53.96.53,1.9v23.64c0,.89-.18,1.51-.53,1.86s-1.03.53-2.04.53h-4.07c-1,0-1.68-.18-2.04-.53-.35-.35-.53-.97-.53-1.86v-9.47Z"/>
<path class="st1" d="M470.93,213.33v-7.79h-5.93v-7.79h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93Z"/>
</g>
<g>
<rect class="st1" x="400.18" y="256.72" width="10.54" height="8.77"/>
<g>
<path class="st1" d="M303.53,291.96c1.51-1.53,2.26-3.69,2.26-6.46v-16.56c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.97-2.3-7.39-2.3h-20.54v55.87h10.18v-21.78h3.33l8.53,21.78h10.98l-9.32-22.06c1.82-.34,3.24-1.02,4.23-2.03ZM285.77,267.96h7.35c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v13.99c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-7.35v-18.77Z"/>
<path class="st1" d="M322.43,272.57c-3.36,0-5.81.77-7.35,2.3s-2.3,3.69-2.3,6.46v25.94c0,2.78.77,4.93,2.3,6.46,1.53,1.54,3.98,2.3,7.35,2.3h9.21c3.36,0,5.81-.77,7.35-2.3s2.3-3.69,2.3-6.46v-4.43h-9.74v3.28c0,.89-.16,1.51-.49,1.86-.33.35-.99.53-1.99.53h-4.07c-.95,0-1.59-.16-1.95-.49-.35-.32-.53-.96-.53-1.9v-8.94h18.86v-15.85c0-2.77-.75-4.93-2.26-6.46-1.51-1.53-3.94-2.3-7.3-2.3h-9.39ZM329.25,280.01c1,0,1.67.16,1.99.49.32.33.49.96.49,1.9v8.32h-9.21v-8.32c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h4.25Z"/>
<path class="st1" d="M365.38,276.82c-.27-1.07-.76-1.95-1.46-2.61-1.15-1.09-2.76-1.64-4.83-1.64h-2.75c-3.13,0-5.42.77-6.86,2.3-1.45,1.54-2.17,3.69-2.17,6.46v25.94c0,2.78.72,4.93,2.17,6.46,1.45,1.54,3.73,2.3,6.86,2.3h2.75c2.07,0,3.67-.55,4.83-1.64.57-.54,1-1.22,1.28-2.04v3.68h10.09v-43.48h-9.92v4.25ZM364.58,307.59c-.41.44-1.12.66-2.13.66h-2.66c-.95,0-1.59-.18-1.95-.53-.35-.35-.53-.97-.53-1.86v-23.11c0-.94.18-1.58.53-1.9.35-.32,1-.49,1.95-.49h2.66c1,0,1.71.22,2.13.66.41.44.62,1.2.62,2.26v22.05c0,1.06-.21,1.82-.62,2.26Z"/>
<rect class="st1" x="382.82" y="256.81" width="10.01" height="59.24"/>
<rect class="st1" x="400.44" y="272.57" width="10.01" height="43.48"/>
<path class="st1" d="M429.04,264.78h-10.01v7.79h-4.34v7.79h4.34v26.92c0,2.78.75,4.93,2.26,6.46,1.51,1.54,3.97,2.3,7.39,2.3h6.2v-8.06h-3.28c-1,0-1.68-.16-2.04-.49-.35-.32-.53-.96-.53-1.9v-25.24h5.93v-7.79h-5.93v-7.79Z"/>
<path class="st1" d="M452.95,306.04l-6.2-33.47h-10.36l9.92,41.88h4.78l-.71,2.83c-.35,1.24-.93,2.07-1.73,2.48-.8.41-1.82.62-3.06.62h-4.52v7.7h5.93c3.54,0,6.26-.81,8.15-2.43,1.89-1.62,3.19-3.94,3.9-6.95l9.74-46.13h-10.09l-5.76,33.47Z"/>
</g>
</g>
<g>
<path class="st1" d="M230.84,365.76l34.69,8.74-95.47-95.5h0c4.76-2.32,9.05-5.41,12.8-9.22,4.3-4.36,7.65-9.44,9.96-15.08,2.4-5.86,3.57-12.06,3.47-18.43-.18-12.2-5.07-23.69-13.76-32.36-8.69-8.67-20.2-13.52-32.4-13.66-.34,0-.69,0-1.04,0-5.57.06-11.09,1.16-16.39,3.29-2.83,1.14-5.69,2.65-8.48,4.51l-61.31,40.67c7.29-40.21,42.56-70.79,84.84-70.79,47.54,0,86.22,38.68,86.22,86.22,0,20.91-7.49,40.11-19.92,55.06l15.35,15.35c7.35-8.51,13.29-18.04,17.68-28.44,5.62-13.3,8.48-27.42,8.48-41.97s-2.85-28.67-8.48-41.97c-5.43-12.84-13.2-24.37-23.1-34.27-9.9-9.9-21.43-17.67-34.27-23.1-9.67-4.09-19.78-6.71-30.17-7.84-2.45-.45-29.7-5.84-56.46-29.02,0,0,6.14,19.1,18.34,31.62-5.33,1.34-10.55,3.09-15.66,5.25-12.84,5.43-24.37,13.2-34.27,23.1-9.9,9.9-17.67,21.43-23.1,34.27-5.62,13.3-8.48,27.42-8.48,41.97,0,8.15.9,16.16,2.67,23.97l19.62-13.01s0,0,0-.01l73.94-49.05c1.57-1.04,3.11-1.87,4.58-2.46,2.8-1.12,5.68-1.71,8.57-1.74.19,0,.37,0,.56,0,13.49.16,24.63,11.26,24.83,24.75.1,6.79-2.47,13.2-7.23,18.03-4.65,4.72-10.82,7.37-17.43,7.49v-31.5l-18.37.16v180.49l18.37,38.28v-164.59l80.79,80.79Z"/>
<path class="st1" d="M103.53,352.5s.09.04.13.06l18.24,37.9v-153.22l-18.37,12.19v103.08Z"/>
<path class="st1" d="M159.83,339.51v21.77c10.29-1.14,20.3-3.75,29.89-7.81,3.46-1.46,6.82-3.1,10.09-4.9l-16.09-16.09c-7.45,3.44-15.48,5.84-23.88,7.02Z"/>
<path class="st1" d="M64.21,275.51l-18.85,12.51c.9,2.73,1.92,5.43,3.05,8.09,5.43,12.84,13.2,24.37,23.1,34.27,6.7,6.7,14.15,12.42,22.24,17.11v-26.18c-14.3-11.52-24.85-27.49-29.54-45.8Z"/>
</g>
<path class="st0" d="M421.27,254.58"/>
<path class="st0" d="M21.02,254.58"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

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

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512">
<!-- Generator: Adobe Illustrator 29.2.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 116) -->
<defs>
<style>
.st0 {
stroke: #fff;
stroke-miterlimit: 10;
}
.st0, .st1 {
fill: #fff;
}
</style>
</defs>
<path class="st0" d="M421.27,254.6"/>
<path class="st0" d="M21.02,254.6"/>
<g>
<path class="st1" 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="st1" d="M211.04,318.9s.09.04.13.06l18.24,37.9v-153.22l-18.37,12.19v103.08Z"/>
<path class="st1" 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="st1" 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: 2.0 KiB

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: b1c861e6353e19f48a56fff1559c1a76
guid: b6b4948176bf2744fad63f0df242f185
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
@@ -43,7 +43,7 @@ TextureImporter:
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
@@ -100,7 +100,7 @@ TextureImporter:
customData:
physicsShape: []
bones: []
spriteID:
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:

View File

@@ -12,8 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 19101, guid: 0000000000000000e000000000000000, type: 0}
m_Name: panel_main_menu
m_EditorClassIdentifier:
themeUss: {fileID: -4733365628477956816, guid: e23ba26e2a2f5a24fbba6ba1d0d59b11,
type: 3}
themeUss: {fileID: -4733365628477956816, guid: e23ba26e2a2f5a24fbba6ba1d0d59b11, type: 3}
m_DisableNoThemeWarning: 0
m_TargetTexture: {fileID: 0}
m_RenderMode: 0

View File

@@ -10,11 +10,10 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 577b018c25510774aaccba06137e264d, type: 3}
m_Name: Console
m_Name: service_console
m_EditorClassIdentifier:
_config:
ConsoleUIPrefab: {fileID: 1375678557884231458, guid: f83916a033d3c4b45b40ee51f7f62a5c,
type: 3}
ConsoleUIPrefab: {fileID: 1375678557884231458, guid: f83916a033d3c4b45b40ee51f7f62a5c, type: 3}
ToggleAction: {fileID: 11400000, guid: 1c5aabf95d7e5d949af83d0a4c686e95, type: 2}
_initialCVars: []
_loadCVarsFromResources: 1

View File

@@ -10,5 +10,5 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 51f134b6c2abcd34fa8e376b3afc757d, type: 3}
m_Name: Game
m_Name: service_game
m_EditorClassIdentifier:

View File

@@ -10,8 +10,7 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8fcf71fe79ef1ed4cbfdefde09e708d9, type: 3}
m_Name: Input
m_Name: service_input
m_EditorClassIdentifier:
m_Config:
inputAsset: {fileID: -944628639613478452, guid: f991e9abd9a53ee4b94b329a5ce96cb2,
type: 3}
inputAsset: {fileID: -944628639613478452, guid: f991e9abd9a53ee4b94b329a5ce96cb2, type: 3}

View File

@@ -10,5 +10,5 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3f449396a11e05e41990dbddfb992815, type: 3}
m_Name: World
m_Name: service_world
m_EditorClassIdentifier:

View File

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

View File

@@ -0,0 +1,93 @@
Copyright 2023 The Teko Project Authors (https://www.github.com/googlefonts/teko)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://openfontlicense.org
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

View File

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

View File

@@ -0,0 +1,67 @@
Teko Variable Font
==================
This download contains Teko as both a variable font and static fonts.
Teko is a variable font with this axis:
wght
This means all the styles are contained in a single file:
Teko/Teko-VariableFont_wght.ttf
If your app fully supports variable fonts, you can now pick intermediate styles
that arent available as static fonts. Not all apps support variable fonts, and
in those cases you can use the static font files for Teko:
Teko/static/Teko-Light.ttf
Teko/static/Teko-Regular.ttf
Teko/static/Teko-Medium.ttf
Teko/static/Teko-SemiBold.ttf
Teko/static/Teko-Bold.ttf
Get started
-----------
1. Install the font files you want to use
2. Use your app's font picker to view the font family and all the
available styles
Learn more about variable fonts
-------------------------------
https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts
https://variablefonts.typenetwork.com
https://medium.com/variable-fonts
In desktop apps
https://theblog.adobe.com/can-variable-fonts-illustrator-cc
https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts
Online
https://developers.google.com/fonts/docs/getting_started
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide
https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts
Installing fonts
MacOS: https://support.apple.com/en-us/HT201749
Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux
Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows
Android Apps
https://developers.google.com/fonts/docs/android
https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts
License
-------
Please read the full license text (OFL.txt) to understand the permissions,
restrictions and requirements for usage, redistribution, and modification.
You can use them in your products & projects print or digital,
commercial or otherwise.
This isn't legal advice, please consider consulting a lawyer and see the full
license for all details.

Some files were not shown because too many files have changed in this diff Show More