using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame.Beatmap; using UnityEngine; namespace Ichni.RhythmGame { public partial class SkyboxSubsetter : GameElement { public SkyboxBlender skyboxBlender; public List skyBoxThemeBundleList; public List skyboxNameList; public List skyboxMaterialList; public List blendSpeedList; public List blendTimeList; public int currentSkyboxIndex = 0; public List themeBundleListForSelection; public List skyboxNameListForSelection; public string selectedThemeBundle; public string selectedSkybox; 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; } 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); } } private void Update() { if (skyBoxThemeBundleList.Count > 1) { float songTime = GameManager.instance.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(); } } } } public override void SaveBM() { matchedBM = new SkyboxSubsetter_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM, skyBoxThemeBundleList, skyboxNameList, blendTimeList, blendSpeedList); } } namespace Beatmap { public class SkyboxSubsetter_BM : GameElement_BM { public List skyBoxThemeBundleList; public List skyboxNameList; public List blendTimeList; public List blendSpeedList; public SkyboxSubsetter_BM() { } public SkyboxSubsetter_BM(string elementName, Guid elementGuid, List tags, GameElement_BM attachedElement, List skyBoxThemeBundleList, List skyboxNameList, List blendTimeList, List blendSpeedList) : base(elementName, elementGuid, tags, attachedElement) { this.skyBoxThemeBundleList = skyBoxThemeBundleList; this.skyboxNameList = skyboxNameList; this.blendTimeList = blendTimeList; this.blendSpeedList = blendSpeedList; } public override void ExecuteBM() { matchedElement = SkyboxSubsetter.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid), skyBoxThemeBundleList, skyboxNameList, blendTimeList, blendSpeedList); } } } }