Inspector内容开始填充完善

This commit is contained in:
SoulliesOfficial
2025-02-17 14:46:14 -05:00
parent d77e1a0f70
commit 8d4772532f
84 changed files with 4340 additions and 208 deletions

View File

@@ -22,7 +22,10 @@ namespace Ichni.RhythmGame
/// <summary>
/// 刷新物体的状态
/// </summary>
public void Refresh();
public void Refresh()
{
}
/// <summary>
/// 当物体被删除时执行的方法

View File

@@ -20,11 +20,6 @@ namespace Ichni.RhythmGame
this.attachedGameElement = attachedGameElement;
}
public virtual void InitialRefresh()
{
}
public abstract void SaveBM();
public virtual void OnDelete()

View File

@@ -44,12 +44,7 @@ namespace Ichni.RhythmGame
public void SetUpInspector()
{
throw new System.NotImplementedException();
}
public void Refresh()
{
throw new System.NotImplementedException();
}
}

View File

@@ -35,12 +35,7 @@ namespace Ichni.RhythmGame
public void SetUpInspector()
{
throw new System.NotImplementedException();
}
public void Refresh()
{
throw new System.NotImplementedException();
}
}

View File

@@ -40,6 +40,40 @@ namespace Ichni.RhythmGame
new ElementFolder_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM) :
new ElementFolder_BM(elementName, elementGuid, tags, null);
}
public override void SetUpInspector()
{
base.SetUpInspector();
var container = inspector.GenerateContainer("Generate");
var folderButton = inspector.GenerateButton(this, container, "Folder",
() => ElementFolder.GenerateElement("New Folder", Guid.NewGuid(), new List<string>(), true, this));
var trackButton = inspector.GenerateButton(this, container, "Track",
() => Track.GenerateElement("New Track", Guid.NewGuid(), new List<string>(), true, this));
var cameraButton = inspector.GenerateButton(this, container, "Camera",
() => GameCamera.GenerateElement("New Camera", Guid.NewGuid(), new List<string>(), true, this,
GameCamera.CameraViewType.Perspective, 60, 10));
var crossTrackPoint = inspector.GenerateButton(this, container, "Cross Track Point",
() => CrossTrackPoint.GenerateElement("New Cross Track Point", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleInt(), new FlexibleFloat()));
var tapButton = inspector.GenerateButton(this, container, "Tap",
() => Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f));
var stayButton = inspector.GenerateButton(this, container, "Stay",
() => Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f));
// var holdButton = inspector.GenerateButton(this, container, "Generate Hold",
// () => Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f));
var flickButton = inspector.GenerateButton(this, container, "Flick",
() => Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f,
new List<Vector2>()));
var environmentObjectButton = inspector.GenerateButton(this, container, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
var displacementButton = inspector.GenerateButton(this, container, "Displacement",
() => Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var swirlButton = inspector.GenerateButton(this, container, "Swirl",
() => Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
}
}
namespace Beatmap

View File

@@ -1,18 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BackgroundController : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}

View File

@@ -0,0 +1,100 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
namespace Ichni.Editor
{
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)
{
BackgroundSetter backgroundSetter = Instantiate(EditorManager.instance.basePrefabs.emptyObject)
.AddComponent<BackgroundSetter>();
backgroundSetter.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
backgroundSetter.useSkybox = useSkybox;
backgroundSetter.skyboxThemeBundleName = skyboxThemeBundleName;
backgroundSetter.skyboxMaterialName = skyboxMaterialName;
backgroundSetter.backgroundSpriteName = backgroundSpriteName;
return backgroundSetter;
}
public 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);
}
public void SetBackgroundSprite(string backgroundSpriteName)
{
string path = EditorManager.instance.projectInformation.projectPath + "/Sprites/" + backgroundSpriteName + ".png";
backgroundSprite = ES3.FileExists(path) ? ES3.Load<Sprite>(path) : EditorManager.instance.basePrefabs.defaultBackground;
EditorManager.instance.backgroundController.SetBackground(backgroundSprite);
}
protected override void SetDefaultSubmodules()
{
}
public override void SetUpInspector()
{
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);
useSkyboxToggle.AddListenerFunction(EditorManager.instance.backgroundController.EnableBackground);
useSkyboxToggle.AddListenerFunction(value =>
{
skyboxThemeBundleField.inputField.interactable = value;
skyboxMaterialNameField.inputField.interactable = value;
backgroundSpriteField.inputField.interactable = !value;
});
}
public override void Refresh()
{
EditorManager.instance.backgroundController.EnableBackground(useSkybox);
if (useSkybox)
{
SetSkybox(skyboxThemeBundleName, skyboxMaterialName);
}
else
{
SetBackgroundSprite(backgroundSpriteName);
}
}
}
namespace Beatmap
{
public class BackgroundSetter_BM : BaseElement_BM
{
public BackgroundSetter_BM()
{
}
public override void ExecuteBM()
{
throw new System.NotImplementedException();
}
}
}
}

View File

@@ -65,7 +65,10 @@ namespace Ichni.RhythmGame
/// <summary>
/// 设置次级模块
/// </summary>
protected abstract void SetDefaultSubmodules();
protected virtual void SetDefaultSubmodules()
{
}
/// <summary>
/// 在所有物体生成完毕后,执行的初始化方法
@@ -111,7 +114,7 @@ namespace Ichni.RhythmGame
/// </summary>
public virtual void OnDelete()
{
throw new NotImplementedException();
}
@@ -135,6 +138,7 @@ namespace Ichni.RhythmGame
#endif
EditorManager.instance.beatmapContainer.gameElementList.Remove(this); //从保存列表中剔除
this.parentElement.childElementList.Remove(this);
Destroy(connectedTab.gameObject);
Destroy(gameObject); //销毁
}
}
@@ -145,7 +149,7 @@ namespace Ichni.RhythmGame
{
var container = inspector.GenerateContainer("Element Info");
var nameInputField = inspector.GenerateInputField(this, container, GetType().Name + "'s Name", nameof(elementName));
var guidText = inspector.GenerateText(this, container, "Element GUID", nameof(elementGuid), true);
var guidText = inspector.GenerateText(this, container, "Element GUID", nameof(elementGuid));
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList();

View File

@@ -0,0 +1,58 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Ichni.RhythmGame
{
public class TemporaryObject : SubstantialObject
{
public static TemporaryObject GenerateElement(string elementName, Guid id, List<string> tags,
bool isFirstGenerated, GameElement parentElement)
{
TemporaryObject tempObj = Instantiate(EditorManager.instance.basePrefabs.emptyObject)
.AddComponent<TemporaryObject>();
tempObj.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
tempObj.themeBundleName = string.Empty;
tempObj.objectName = string.Empty;
tempObj.themeBundleList = ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName);
tempObj.objectNameList = new List<string>();
return tempObj;
}
public List<string> themeBundleList;
public List<string> objectNameList;
public override void SetUpInspector()
{
var container = inspector.GenerateContainer("Temporary Object");
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", themeBundleList, nameof(themeBundleName));
themeBundleDropdown.AddListenerFunction(_ => inspector.SetInspector(this));
if (themeBundleName != String.Empty)
{
objectNameList = ThemeBundleManager.instance.GetThemeBundle(themeBundleName).assetList_GameObject.ConvertAll(x => x.name);
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Object Name", objectNameList, nameof(objectName));
objectNameDropdown.AddListenerFunction(_ => inspector.SetInspector(this));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Object Name", new List<string>(), nameof(objectName));
objectNameDropdown.dropdown.interactable = false;
}
var generateButton = inspector.GenerateButton(this, container, "Generate", () =>
{
Delete();
inspector.ClearInspector();
SubstantialObject.GenerateElement(elementName, elementGuid, tags, false, themeBundleName, objectName, parentElement);
});
if (themeBundleName == String.Empty || objectName == String.Empty)
{
generateButton.button.interactable = false;
}
}
}
}

View File

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

View File

@@ -51,13 +51,7 @@ namespace Ichni.RhythmGame
public override void AfterInitialize()
{
base.AfterInitialize();
Refresh();
if (track.trackPathSubmodule.pathNodeList.Count > 3)
{
track.trackPathSubmodule.ClosePath(track.trackPathSubmodule.isClosed);
}
}
}

View File

@@ -43,13 +43,104 @@ namespace Ichni.RhythmGame
(trackTimeSubmodule as TrackTimeSubmoduleMovable)?.UpdateTrackPart();
}
}
public override void AfterInitialize()
{
if (trackPathSubmodule != null && trackPathSubmodule.pathNodeList.Count > 3)
{
trackPathSubmodule.ClosePath();
}
}
public override void Refresh()
{
trackPathSubmodule?.Refresh();
trackTimeSubmodule?.Refresh();
trackRendererSubmodule?.Refresh();
}
}
public partial class Track
{
public override void SaveBM()
{
matchedBM = new Beatmap.Track_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM);
matchedBM = new Track_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM);
}
public override void SetUpInspector()
{
base.SetUpInspector();
var container = inspector.GenerateContainer("Track");
var trackPathButton = inspector.GenerateButton(this, container, "Track Path",
() =>
{
trackPathSubmodule = new TrackPathSubmodule(this, TrackSpaceType.CatmullRom,
TrackSamplingType.TimeDistributed, false);
inspector.SetInspector(this);
});
var trackTimeMovableButton = inspector.GenerateButton(this, container, "Track Time Movable",
() =>
{
trackTimeSubmodule = new TrackTimeSubmoduleMovable(this, 0, 1, 1, AnimationCurveType.Linear);
inspector.SetInspector(this);
});
var trackTimeStaticButton = inspector.GenerateButton(this, container, "Track Time Static",
() =>
{
trackTimeSubmodule = new TrackTimeSubmoduleStatic(this, 1, AnimationCurveType.Linear);
inspector.SetInspector(this);
});
var trackRendererAutoOrientButton = inspector.GenerateButton(this, container, "Track Renderer Auto Orient",
() =>
{
trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(this);
inspector.SetInspector(this);
});
var trackRendererPathGeneratorButton = inspector.GenerateButton(this, container,
"Track Renderer Path Generator",
() =>
{
trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(this);
inspector.SetInspector(this);
});
if (trackPathSubmodule != null)
{
trackPathButton.button.interactable = false;
trackPathSubmodule.SetUpInspector();
}
if (trackTimeSubmodule != null)
{
trackTimeMovableButton.button.interactable = false;
trackTimeStaticButton.button.interactable = false;
trackTimeSubmodule.SetUpInspector();
}
if (trackRendererSubmodule != null)
{
trackRendererAutoOrientButton.button.interactable = false;
trackRendererPathGeneratorButton.button.interactable = false;
trackRendererSubmodule.SetUpInspector();
}
var displacementButton = inspector.GenerateButton(this, container, "Displacement",
() =>
{
Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
});
var swirlButton = inspector.GenerateButton(this, container, "Swirl",
() =>
{
Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
});
}
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
@@ -39,9 +40,9 @@ namespace Ichni.RhythmGame
path.space = SplineComputer.Space.Local;
}
public void ClosePath(bool close)
public void ClosePath()
{
if (close)
if (isClosed)
{
path.Close();
}
@@ -49,8 +50,6 @@ namespace Ichni.RhythmGame
{
path.Break();
}
isClosed = close;
}
public void SetTrackSpaceType(int spaceType)
@@ -79,6 +78,13 @@ namespace Ichni.RhythmGame
inspector.GenerateDropdown(this, container, "Space Type", typeof(Track.TrackSpaceType), nameof(trackSpaceType));
var trackSamplingDropdown =
inspector.GenerateDropdown(this, container, "Sampling Type", typeof(Track.TrackSamplingType), nameof(trackSamplingType));
var isClosedToggle =
inspector.GenerateToggle(this, container, "Is Closed", nameof(isClosed));
isClosedToggle.AddListenerFunction(_ => ClosePath());
var generatePathNodeButton = inspector.GenerateButton(this, container, "Generate Path Node", () =>
{
PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, track);
});
}
}

View File

@@ -23,6 +23,8 @@ namespace Ichni.RhythmGame
}
}
#region AutoOrient
public class TrackRendererSubmoduleAutoOrient : TrackRendererSubmodule
{
public SplineRenderer splineRenderer;
@@ -40,13 +42,18 @@ namespace Ichni.RhythmGame
this.splineRenderer.color = Color.white;
}
public override void InitialRefresh()
public override void Refresh()
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable)
{
splineRenderer.clipFrom = 0;
splineRenderer.clipTo = 0;
}
else
{
splineRenderer.clipFrom = 0;
splineRenderer.clipTo = 1;
}
}
public override void SaveBM()
@@ -56,7 +63,7 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
var container = inspector.GenerateContainer("Track Renderer Auto Orient");
}
}
@@ -72,7 +79,7 @@ namespace Ichni.RhythmGame
}
public TrackRendererSubmoduleAutoOrient_BM(GameElement attachedElement,
TrackRendererSubmodule trackRendererSubmodule) : base(attachedElement)
TrackRendererSubmoduleAutoOrient trackRendererSubmodule) : base(attachedElement)
{
renderMaterialName = trackRendererSubmodule.renderMaterial.name;
}
@@ -81,16 +88,98 @@ namespace Ichni.RhythmGame
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmodule(track);//TODO: Implement Material
track.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(track); //TODO: Implement Material
track.submoduleList.Add(track.trackRendererSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmodule(track);//TODO: Implement Material
track.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(track); //TODO: Implement Material
track.submoduleList.Add(track.trackRendererSubmodule);
}
}
}
#endregion
#region PathGenerator
public class TrackRendererSubmodulePathGenerator : TrackRendererSubmodule
{
public PathGenerator pathGenerator;
public TrackRendererSubmodulePathGenerator(Track track, Material material = null) : base(track)
{
this.pathGenerator = track.AddComponent<PathGenerator>();
this.meshRenderer = pathGenerator.GetComponent<MeshRenderer>();
this.meshGenerator = pathGenerator;
this.renderMaterial = material == null ? EditorManager.instance.basePrefabs.defaultTrackMaterial : material;
this.pathGenerator.spline = track.trackPathSubmodule.path;
this.pathGenerator.clipFrom = 0;
this.pathGenerator.clipTo = 1;
this.meshRenderer.material = renderMaterial;
this.pathGenerator.color = Color.white;
}
public override void Refresh()
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable)
{
pathGenerator.clipFrom = 0;
pathGenerator.clipTo = 0;
}
else
{
pathGenerator.clipFrom = 0;
pathGenerator.clipTo = 1;
}
}
public override void SaveBM()
{
matchedBM = new Beatmap.TrackRendererSubmodulePathGenerator_BM(attachedGameElement, this);
}
public override void SetUpInspector()
{
var container = inspector.GenerateContainer("Track Renderer Path Generator");
}
}
namespace Beatmap
{
public class TrackRendererSubmodulePathGenerator_BM : Submodule_BM
{
public string renderMaterialName;
public TrackRendererSubmodulePathGenerator_BM()
{
}
public TrackRendererSubmodulePathGenerator_BM(GameElement attachedElement,
TrackRendererSubmodulePathGenerator trackRendererSubmodule) : base(attachedElement)
{
renderMaterialName = trackRendererSubmodule.renderMaterial.name;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(track);//TODO: Implement Material
track.submoduleList.Add(track.trackRendererSubmodule);
}
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(track);//TODO: Implement Material
track.submoduleList.Add(track.trackRendererSubmodule);
}
}
}
#endregion
}

View File

@@ -62,11 +62,31 @@ namespace Ichni.RhythmGame
(songTimeInTime - trackStartTime) / trackTotalTime);
return Mathf.Clamp01(per);
}
public override void SaveBM()
{
matchedBM = new Beatmap.TrackTimeSubmoduleMovable_BM(attachedGameElement, this);
}
public override void SetUpInspector()
{
var container = inspector.GenerateContainer("Track Time Movable");
var startTimeInputField =
inspector.GenerateInputField(this, container, "Start Time", nameof(trackStartTime));
var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(trackEndTime));
var visibleTimeInputField =
inspector.GenerateInputField(this, container, "Visible Time Length", nameof(visibleTrackTimeLength));
var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve",
typeof(AnimationCurveType), nameof(animationCurveType));
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
{
Delete();
track.trackTimeSubmodule = null;
inspector.SetInspector(track);
track.Refresh();
});
}
}
namespace Beatmap
@@ -130,6 +150,23 @@ namespace Ichni.RhythmGame
{
matchedBM = new Beatmap.TrackTimeSubmoduleStatic_BM(attachedGameElement, this);
}
public override void SetUpInspector()
{
var container = inspector.GenerateContainer("Track Time Static");
var totalTimeInputField =
inspector.GenerateInputField(this, container, "Total Time", nameof(trackTotalTime));
var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve",
typeof(AnimationCurveType), nameof(animationCurveType));
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
{
Delete();
track.trackTimeSubmodule = null;
inspector.SetInspector(track);
track.Refresh();
});
}
}
namespace Beatmap