using System; using System.Collections; using System.Collections.Generic; using Dreamteck.Splines.Primitives; using Ichni.Editor; using Ichni.RhythmGame; using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.ThemeBundles.Basic; using Sirenix.OdinInspector; using TMPro; using UnityEngine; namespace Ichni { public class EditorManager : GameElement { public static EditorManager instance; public bool isLoaded; public ProjectManager projectManager; public AudioManager audioManager; public MusicPlayer musicPlayer; public EditorUIManager uiManager; public EditorSettings editorSettings; public OperationManager operationManager; public BackgroundController backgroundController; public GridController gridController; public CameraManager cameraManager; public Ichni.Editor.PostProcessingManager postProcessingManager; public Canvas judgeHintCanvas; public Canvas inspectorCanvas; public Timeline timeline; public ProjectInformation projectInformation; public SongInformation songInformation; public BeatmapContainer beatmapContainer; public CommandScripts commandScripts; public NoteBase.NoteJudgeType currentJudgeType; public bool useNotePrefab = true; public bool ExpandWhileClick = false; public BasePrefabsCollection basePrefabs; public Dictionary customPrefabs; public NoteAudioCollection noteAudioCollection; [Title("Runtime Global Elements")] public VariablesContainer variablesContainer; public BackgroundSetter backgroundSetter; private void Awake() { instance = this; isLoaded = false; projectManager = new ProjectManager(); operationManager = new OperationManager(); if (!ES3.FileExists(Application.streamingAssetsPath + "/EditorSettings.es3")) { editorSettings = new EditorSettings(300, 3, 100, 100, 60); EditorSettings.SaveSettings(editorSettings); Application.targetFrameRate = editorSettings.frameRate; } else { EditorSettings.LoadSettings(ref editorSettings); Application.targetFrameRate = editorSettings.frameRate; } } private void Start() { StartCoroutine(StartFrameRate()); this.elementName = "EditorManager"; this.elementGuid = Guid.Empty; uiManager.hierarchy.GenerateTab(this, null); this.connectedTab.deleteButton.gameObject.SetActive(false); if (InformationTransistor.instance.isLoadedProject) { LoadProject(InformationTransistor.instance.loadedProjectName); } else { projectManager.GenerateEmptyProject(InformationTransistor.instance.projectInfo_BM, InformationTransistor.instance.songInfo_BM); projectManager.saveManager.Save(); musicPlayer.audioSource.clip = songInformation.song; } isLoaded = true; } public float CurrentFrameRate; public TMP_Text FPStext; private IEnumerator StartFrameRate() { int frameCount = 0; while (true) { CurrentFrameRate = 1f / Time.deltaTime; if (frameCount == 2) { frameCount = 0; FPStext.text = string.Format("FPS: {0:N2}", CurrentFrameRate); } frameCount++; yield return null; } } private void Update() { if (isLoaded) projectManager.autoSaveManager.UpdateAutoSave(); } public void LoadProject(string projectName) { projectManager.loadManager.Load(projectName); musicPlayer.audioSource.clip = songInformation.song; beatmapContainer.gameElementList.ForEach(gameElement => { gameElement.AfterInitialize(); gameElement.Refresh(); }); } public override void SetUpInspector() { IHaveInspection inspector = uiManager.inspector; var container = inspector.GenerateContainer("Editor Manager"); var inGameSettings = container.GenerateSubcontainer(3); var judgeTypeDropdown = inspector.GenerateDropdown(this, inGameSettings, "Judge Type", typeof(NoteBase.NoteJudgeType), nameof(currentJudgeType)).AddListenerFunction(() => { foreach (GameElement gameElement in beatmapContainer.gameElementList) { if (gameElement is NoteVisualBase noteVisual) { noteVisual.Recover(); } } }); var useNotePrefabToggle = inspector.GenerateToggle(this, inGameSettings, "Use Note Prefab", nameof(useNotePrefab)); var ExpandWhileClickToggle = inspector.GenerateToggle(this, inGameSettings, "Expand Tab While Click", nameof(ExpandWhileClick)); var generation = container.GenerateSubcontainer(3); var generateFolderButton = inspector.GenerateButton(this, generation, "Generate Folder", () => ElementFolder.GenerateElement("Folder", Guid.NewGuid(), new List(), true, null)); var generateBackgroundSetterButton = inspector.GenerateButton(this, generation, "Generate Background Setter", () => BackgroundSetter.GenerateElement("Background Setter", Guid.NewGuid(), new List(), true, null, false, "basic", "Skybox", "Background")); var generateVariablesContainerButton = inspector.GenerateButton(this, generation, "Generate Variables Container", () => VariablesContainer.GenerateElement("Variables Container", Guid.NewGuid(), new List(), true, null, new Dictionary())); projectInformation.SetUpInspector(); songInformation.SetUpInspector(); cameraManager.SetUpInspector(); gridController.SetUpInspector(); } } }