变量模块;Element启用控制

This commit is contained in:
SoulliesOfficial
2025-03-20 19:30:42 -04:00
parent ab86d6d985
commit 54de98b0fa
26 changed files with 1976 additions and 44 deletions

View File

@@ -0,0 +1,141 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.RhythmGame
{
public partial class BackgroundSetter : GameElement
{
public bool useSkybox;
public string skyboxThemeBundleName;
public string skyboxMaterialName;
public Material skyboxMaterial;
public string backgroundSpriteName;
public Sprite backgroundSprite;
public static BackgroundSetter GenerateElement(string elementName, Guid id, List<string> tags,
bool isFirstGenerated, GameElement parentElement, bool useSkybox, string skyboxThemeBundleName,
string skyboxMaterialName, string backgroundSpriteName)
{
if (EditorManager.instance.backgroundSetter != null)
{
LogWindow.Log("There is already a Background Setter in the scene.", Color.red);
return null;
}
BackgroundSetter backgroundSetter = Instantiate(EditorManager.instance.basePrefabs.emptyObject)
.AddComponent<BackgroundSetter>();
EditorManager.instance.backgroundSetter = backgroundSetter;
backgroundSetter.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
backgroundSetter.useSkybox = useSkybox;
backgroundSetter.skyboxThemeBundleName = skyboxThemeBundleName;
backgroundSetter.skyboxMaterialName = skyboxMaterialName;
backgroundSetter.backgroundSpriteName = backgroundSpriteName;
return backgroundSetter;
}
public override void Refresh()
{
EditorManager.instance.backgroundController.EnableBackground(!useSkybox);
if (useSkybox)
{
SetSkybox(skyboxThemeBundleName, skyboxMaterialName);
}
else
{
SetBackgroundSprite(backgroundSpriteName);
}
}
}
public partial class BackgroundSetter
{
public override void SaveBM()
{
matchedBM = new BackgroundSetter_BM(elementName, elementGuid, tags, null,
useSkybox, skyboxThemeBundleName, skyboxMaterialName, backgroundSpriteName);
}
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Background Setter");
var useSkyboxToggle = inspector.GenerateToggle(this, container, "Use Skybox", nameof(useSkybox));
var skyboxThemeBundleField = inspector.GenerateInputField(this, container, "Skybox Theme Bundle", nameof(skyboxThemeBundleName));
var skyboxMaterialNameField = inspector.GenerateInputField(this, container, "Skybox Material", nameof(skyboxMaterialName));
var backgroundSpriteField = inspector.GenerateInputField(this, container, "Background Sprite", nameof(backgroundSpriteName));
var applyButton = inspector.GenerateButton(this, container, "Apply", Refresh);
void SetInputFields(bool value) // 根据是否使用Skybox设置输入框的可交互性
{
skyboxThemeBundleField.inputField.interactable = value;
skyboxMaterialNameField.inputField.interactable = value;
backgroundSpriteField.inputField.interactable = !value;
}
SetInputFields(useSkybox);
useSkyboxToggle.AddListenerFunction(() => EditorManager.instance.backgroundController.EnableBackground(!useSkybox));
useSkyboxToggle.AddListenerFunction(() => SetInputFields(useSkybox));
}
}
public partial class BackgroundSetter
{
private void SetSkybox(string themeBundleName, string materialName)
{
skyboxThemeBundleName = themeBundleName;
skyboxMaterialName = materialName;
skyboxMaterial = ThemeBundleManager.instance.GetObject<Material>(themeBundleName, materialName);
if (skyboxMaterial == null) skyboxMaterial = EditorManager.instance.basePrefabs.defaultSkyboxMaterial;
EditorManager.instance.backgroundController.SetSkybox(skyboxMaterial);
}
private void SetBackgroundSprite(string spriteName)
{
string path = EditorManager.instance.projectInformation.projectPath + "/Sprites/" + spriteName + ".png";
backgroundSprite = ES3.FileExists(path) ? ES3.Load<Sprite>(path) : EditorManager.instance.basePrefabs.defaultBackground;
EditorManager.instance.backgroundController.SetBackground(backgroundSprite);
}
}
namespace Beatmap
{
public class BackgroundSetter_BM : GameElement_BM
{
public bool useSkybox;
public string skyboxThemeBundleName;
public string skyboxMaterialName;
public string backgroundSpriteName;
public BackgroundSetter_BM()
{
}
public BackgroundSetter_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
bool useSkybox, string skyboxThemeBundleName, string skyboxMaterialName, string backgroundSpriteName)
: base(elementName, elementGuid, tags, attachedElement)
{
this.useSkybox = useSkybox;
this.skyboxThemeBundleName = skyboxThemeBundleName;
this.skyboxMaterialName = skyboxMaterialName;
this.backgroundSpriteName = backgroundSpriteName;
}
public override void ExecuteBM()
{
matchedElement = BackgroundSetter.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid), useSkybox, skyboxThemeBundleName, skyboxMaterialName, backgroundSpriteName);
}
public override GameElement DuplicateBM(GameElement attached)
{
return BackgroundSetter.GenerateElement(elementName, Guid.NewGuid(), tags, false, attached,
useSkybox, skyboxThemeBundleName, skyboxMaterialName, backgroundSpriteName);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 0bfee67d496ae4f609383bce72ee88fe
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,111 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Unity.VisualScripting;
using UnityEngine;
namespace Ichni.RhythmGame
{
public partial class VariablesContainer : GameElement
{
public Dictionary<string, int> originalVariables;
public Dictionary<string, int> currentVariables;
public static VariablesContainer GenerateElement(string elementName, Guid id, List<string> tags, bool isFirstGenerated,
GameElement parentElement, Dictionary<string, int> variables)
{
if (EditorManager.instance.variablesContainer != null)
{
LogWindow.Log("There is already a Variables Container in the scene.", Color.red);
return null;
}
VariablesContainer variablesContainer =
Instantiate(EditorManager.instance.basePrefabs.emptyObject).AddComponent<VariablesContainer>();
EditorManager.instance.variablesContainer = variablesContainer;
variablesContainer.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
variablesContainer.originalVariables = new Dictionary<string, int>(variables);
variablesContainer.currentVariables = new Dictionary<string, int>(variables);
return variablesContainer;
}
public void SetVariable(string variableName, int value)
{
currentVariables[variableName] = value;
}
public int GetVariable(string variableName)
{
return currentVariables[variableName];
}
public void RevertVariable(string variableName)
{
currentVariables[variableName] = originalVariables[variableName];
}
public void RevertAllVariables()
{
currentVariables = new Dictionary<string, int>(originalVariables);
}
}
public partial class VariablesContainer
{
public override void SaveBM()
{
matchedBM = new VariablesContainer_BM(elementName, elementGuid, tags, null, originalVariables);
}
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Variables Container");
var originalVariablesButton = inspector.GenerateButton(this, container, "Original Variables", () =>
{
var ov = inspector.GenerateCompositeParameterWindow(this, "Original Variables List", nameof(originalVariables));
ov.SetAsStringIntDictionary();
ov.AddListenerFunction(RevertAllVariables);
});
var currentVariablesButton = inspector.GenerateButton(this, container, "Current Variables", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Current Variables List", nameof(currentVariables)).SetAsStringIntDictionary();
});
}
}
namespace Beatmap
{
public class VariablesContainer_BM : GameElement_BM
{
public Dictionary<string, int> originalVariables;
public VariablesContainer_BM()
{
}
public VariablesContainer_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM parentElement,
Dictionary<string, int> originalVariables) : base(elementName, elementGuid, tags, parentElement)
{
this.originalVariables = new Dictionary<string, int>(originalVariables);
}
public override void ExecuteBM()
{
matchedElement = VariablesContainer.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid), originalVariables);
}
public override GameElement DuplicateBM(GameElement attached)
{
return VariablesContainer.GenerateElement(elementName, Guid.NewGuid(), tags, false, attached, originalVariables);
}
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 3635ae4e7b31f4ae7a942151377c59f6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: