using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame.Beatmap; using UnityEngine; namespace Ichni.RhythmGame { public partial class SkyboxSubsetter : GameElement { #region [核心组件与天空盒列表] Core Components & Skybox Lists public SkyboxBlender skyboxBlender; public List skyBoxThemeBundleList; public List skyboxNameList; public List skyboxMaterialList; public List blendSpeedList; public List blendTimeList; public int currentSkyboxIndex = 0; #endregion #region [编辑器UI支持] Editor Selection Tools public List themeBundleListForSelection; public List skyboxNameListForSelection; public string selectedThemeBundle; public string selectedSkybox; #endregion #region [生命周期] Lifecycle & Factory public static SkyboxSubsetter GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, GameElement parentElement, List themeBundleList,List skyboxList, List blendTimeList, List blendSpeedList) { SkyboxSubsetter skyboxSubsetter = Instantiate(GameManager.Instance.basePrefabs.emptyObject) .AddComponent(); GameManager.Instance.backgroundSetter.skyboxSubsetter = skyboxSubsetter; skyboxSubsetter.Initialize(elementName, id, tags, isFirstGenerated, parentElement); skyboxSubsetter.skyBoxThemeBundleList = themeBundleList; skyboxSubsetter.skyboxNameList = skyboxList; skyboxSubsetter.skyboxMaterialList = new List(); skyboxSubsetter.blendTimeList = blendTimeList; skyboxSubsetter.blendSpeedList = blendSpeedList; skyboxSubsetter.SetUpBlender(); skyboxSubsetter.themeBundleListForSelection = ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName); skyboxSubsetter.skyboxNameListForSelection = new List(); skyboxSubsetter.selectedThemeBundle = String.Empty; skyboxSubsetter.selectedSkybox = String.Empty; return skyboxSubsetter; } #endregion #region [内部设置与工具] Internal Configs & Utils private void SetUpBlender() { skyboxBlender = gameObject.AddComponent(); skyboxBlender.loop = false; skyboxBlender.timeToWait = 0f; skyboxBlender.updateLighting = false; skyboxBlender.updateReflections = false; skyboxBlender.skyboxMaterials = new List(); for (int i = 0; i < skyBoxThemeBundleList.Count; i++) { Material skybox = ThemeBundleManager.instance.GetObject(skyBoxThemeBundleList[i], skyboxNameList[i]); skyboxMaterialList.Add(skybox); skyboxBlender.skyboxMaterials.Add(skybox); } skyboxBlender.makeFirstMaterialSkybox = true; skyboxBlender.InspectorAndAwakeChanges(); } private void AddSkybox(string skyboxThemeBundleName, string skyboxObjectName) { Material skybox = ThemeBundleManager.instance.GetObject(skyboxThemeBundleName, skyboxObjectName); if (skybox != null) { skyBoxThemeBundleList.Add(skyboxThemeBundleName); skyboxNameList.Add(skyboxObjectName); skyboxMaterialList.Add(skybox); skyboxBlender.skyboxMaterials.Add(skybox); } } #endregion #region [轮询更新] Main Update private void Update() { if (skyBoxThemeBundleList.Count > 1) { float songTime = CoreServices.TimeProvider.SongTime; float delay = GameManager.Instance.songInformation.delay; float finalTime = 32767; // 曲目长度 for (var index = 0; index < blendTimeList.Count + 1; index++) { float startTime = index == 0 ? -delay : blendTimeList[index - 1]; float endTime = index >= blendTimeList.Count ? finalTime : blendTimeList[index]; if(songTime >= startTime && songTime < endTime && currentSkyboxIndex != index) { currentSkyboxIndex = index; if(currentSkyboxIndex != 0) skyboxBlender.blendSpeed = blendSpeedList[currentSkyboxIndex - 1]; skyboxBlender.Blend(currentSkyboxIndex, false); DynamicGI.UpdateEnvironment(); } } } } #endregion } }