三种动画参数的Composite Unit

This commit is contained in:
SoulliesOfficial
2025-02-13 14:26:37 -05:00
parent 96a4d620f5
commit 0bcc843740
22 changed files with 8273 additions and 51 deletions

View File

@@ -75,7 +75,17 @@ namespace Ichni.RhythmGame
var positionXButton = inspector.GenerateButton(this, container, "Position X",
() =>
{
inspector.GenerateCompositeParameterWindow(this, "Position X", nameof(positionX), typeof(FlexibleFloat));
inspector.GenerateCompositeParameterWindow(this, "Position X", nameof(positionX)).SetAsFlexibleFloat();
});
var positionYButton = inspector.GenerateButton(this, container, "Position Y",
() =>
{
inspector.GenerateCompositeParameterWindow(this, "Position Y", nameof(positionY)).SetAsFlexibleFloat();
});
var positionZButton = inspector.GenerateButton(this, container, "Position Z",
() =>
{
inspector.GenerateCompositeParameterWindow(this, "Position Z", nameof(positionZ)).SetAsFlexibleFloat();
});
}
}

View File

@@ -43,4 +43,7 @@ public class BasePrefabsCollection : SerializedScriptableObject
[Title("DynamicUI相关-Composite")]
public GameObject compositeParameterWindow;
public GameObject stringUnit;
public GameObject animatedFloatUnit;
public GameObject animatedIntUnit;
public GameObject animatedBoolUnit;
}

View File

@@ -1,18 +1,38 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class DynamicUIAnimatedBoolUnit : MonoBehaviour
namespace Ichni.Editor
{
// Start is called before the first frame update
void Start()
public class DynamicUIAnimatedBoolUnit : DynamicUICompositeUnit
{
public TMP_InputField timeInputField;
public Toggle valueToggle;
}
public override void SetUnit(CompositeParameterWindow window, object itemContent)
{
compositeParameterWindow = window;
AnimatedBool animatedBool = (AnimatedBool)itemContent;
timeInputField.text = animatedBool.time.ToString();
valueToggle.isOn = animatedBool.value;
timeInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
valueToggle.onValueChanged.AddListener(_ => compositeParameterWindow.ApplyParameters());
// Update is called once per frame
void Update()
{
removeButton.onClick.AddListener(() =>
{
compositeParameterWindow.RemoveUnit(this);
compositeParameterWindow.ApplyParameters();
});
}
public AnimatedBool GetValue()
{
return new AnimatedBool(float.Parse(timeInputField.text), valueToggle.isOn);
}
}
}
}

View File

@@ -1,18 +1,54 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.RhythmGame;
using TMPro;
using UnityEngine;
using UnityEngine.Serialization;
public class DynamicUIAnimatedFloatUnit : MonoBehaviour
namespace Ichni.Editor
{
// Start is called before the first frame update
void Start()
public class DynamicUIAnimatedFloatUnit : DynamicUICompositeUnit
{
public TMP_InputField startTimeInputField;
public TMP_InputField endTimeInputField;
public TMP_InputField startValueInputField;
public TMP_InputField endValueInputField;
public TMP_Dropdown animationCurveTypeDropdown;
}
public override void SetUnit(CompositeParameterWindow window, object itemContent)
{
compositeParameterWindow = window;
AnimatedFloat animatedFloat = (AnimatedFloat)itemContent;
startTimeInputField.text = animatedFloat.startTime.ToString();
endTimeInputField.text = animatedFloat.endTime.ToString();
startValueInputField.text = animatedFloat.startValue.ToString();
endValueInputField.text = animatedFloat.endValue.ToString();
animationCurveTypeDropdown.ClearOptions();
List<string> enumNameList = System.Enum.GetNames(typeof(AnimationCurveType)).ToList();
animationCurveTypeDropdown.AddOptions(enumNameList);
animationCurveTypeDropdown.value = (int)animatedFloat.animationCurveType;
startTimeInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
endTimeInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
startValueInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
endValueInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
animationCurveTypeDropdown.onValueChanged.AddListener(_ => compositeParameterWindow.ApplyParameters());
removeButton.onClick.AddListener(() =>
{
compositeParameterWindow.RemoveUnit(this);
compositeParameterWindow.ApplyParameters();
});
}
// Update is called once per frame
void Update()
{
public AnimatedFloat GetValue()
{
return new AnimatedFloat(float.Parse(startTimeInputField.text), float.Parse(endTimeInputField.text),
float.Parse(startValueInputField.text), float.Parse(endValueInputField.text),
(AnimationCurveType)animationCurveTypeDropdown.value);
}
}
}
}

View File

@@ -1,18 +1,37 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using TMPro;
using UnityEngine;
public class DynamicUIAnimatedIntUnit : MonoBehaviour
namespace Ichni.Editor
{
// Start is called before the first frame update
void Start()
public class DynamicUIAnimatedIntUnit : DynamicUICompositeUnit
{
public TMP_InputField timeInputField;
public TMP_InputField valueInputField;
}
public override void SetUnit(CompositeParameterWindow window, object itemContent)
{
compositeParameterWindow = window;
AnimatedInt animatedInt = (AnimatedInt)itemContent;
timeInputField.text = animatedInt.time.ToString();
valueInputField.text = animatedInt.value.ToString();
timeInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
valueInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
// Update is called once per frame
void Update()
{
removeButton.onClick.AddListener(() =>
{
compositeParameterWindow.RemoveUnit(this);
compositeParameterWindow.ApplyParameters();
});
}
public AnimatedInt GetValue()
{
return new AnimatedInt(float.Parse(timeInputField.text), int.Parse(valueInputField.text));
}
}
}
}

View File

@@ -10,6 +10,6 @@ namespace Ichni.Editor
{
public CompositeParameterWindow compositeParameterWindow;
public Button removeButton;
public abstract void SetUnit(CompositeParameterWindow list, object itemContent);
public abstract void SetUnit(CompositeParameterWindow window, object itemContent);
}
}

View File

@@ -10,9 +10,9 @@ namespace Ichni.Editor
{
public TMP_InputField stringInputField;
public override void SetUnit(CompositeParameterWindow list, object itemContent)
public override void SetUnit(CompositeParameterWindow window, object itemContent)
{
compositeParameterWindow = list;
compositeParameterWindow = window;
stringInputField.text = (string)itemContent;
stringInputField.onEndEdit.AddListener(_ => compositeParameterWindow.ApplyParameters());
removeButton.onClick.AddListener(() =>

View File

@@ -21,7 +21,7 @@ namespace Ichni.Editor
public void SetUpEnum(Type enumType)
{
dropdown.options.Clear();
dropdown.ClearOptions();
List<string> enumNameList = System.Enum.GetNames(enumType).ToList();
dropdown.AddOptions(enumNameList);
}

View File

@@ -17,7 +17,7 @@ namespace Ichni.Editor
public string parameterName;
/// <summary>
/// 是否始终更新如果子类可能用到此变量则在子类中写Update即可
/// 是否始终更新如果子类可能用到此变量则在子类中写Update即可注意如果最后仅有Text用到此变量直接移动它到Text即可
/// </summary>
public bool isAlwaysUpdated;

View File

@@ -40,26 +40,32 @@ namespace Ichni.Editor
{
public void SetAsStringList()
{
unitPrefab = EditorManager.instance.basePrefabs.stringUnit;
addNewUnitButton.onClick.AddListener(() =>
//生成Unit
void GenerateUnit(string content)
{
DynamicUIStringUnit unit = Instantiate(unitPrefab, windowRect).GetComponent<DynamicUIStringUnit>();
unitList.Add(unit);
unit.SetUnit(this, "");
unit.SetUnit(this, content);
}
unitPrefab = EditorManager.instance.basePrefabs.stringUnit;
//初始化获取当前的List<string>并生成对应的Unit
List<string> list = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as List<string>;
foreach (string item in list)
{
GenerateUnit(item);
}
addNewUnitButton.GetComponent<RectTransform>().SetAsLastSibling();
//为添加新的Unit的按钮设置点击事件
addNewUnitButton.onClick.AddListener(() =>
{
GenerateUnit("");
addNewUnitButton.GetComponent<RectTransform>().SetAsLastSibling();
});
List<string> list = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as List<string>;
foreach (var item in list)
{
DynamicUIStringUnit unit = Instantiate(unitPrefab, windowRect).GetComponent<DynamicUIStringUnit>();
unitList.Add(unit);
unit.SetUnit(this, item);
}
addNewUnitButton.GetComponent<RectTransform>().SetAsLastSibling();
//将当前所有Unit的值应用到对应的变量中
ApplyParameters = () =>
{
List<string> list = new List<string>();
@@ -71,5 +77,40 @@ namespace Ichni.Editor
connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, list);
};
}
public void SetAsFlexibleFloat()
{
void GenerateUnit(AnimatedFloat content)
{
DynamicUIAnimatedFloatUnit unit = Instantiate(unitPrefab, windowRect).GetComponent<DynamicUIAnimatedFloatUnit>();
unitList.Add(unit);
unit.SetUnit(this, content);
}
unitPrefab = EditorManager.instance.basePrefabs.animatedFloatUnit;
FlexibleFloat flexibleFloat = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as FlexibleFloat;
foreach (AnimatedFloat animatedFloat in flexibleFloat.animations)
{
GenerateUnit(animatedFloat);
}
addNewUnitButton.GetComponent<RectTransform>().SetAsLastSibling();
addNewUnitButton.onClick.AddListener(() =>
{
GenerateUnit(new AnimatedFloat(0, 0, 0, 0, AnimationCurveType.Linear));
addNewUnitButton.GetComponent<RectTransform>().SetAsLastSibling();
});
ApplyParameters = () =>
{
FlexibleFloat newFlexibleFloat = new FlexibleFloat();
foreach (var unit in unitList)
{
newFlexibleFloat.animations.Add((unit as DynamicUIAnimatedFloatUnit).GetValue());
}
connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, newFlexibleFloat);
};
}
}
}

View File

@@ -31,7 +31,7 @@ namespace Ichni.Editor
public partial class Inspector
{
public CompositeParameterWindow GenerateCompositeParameterWindow(IBaseElement baseElement, string title, string parameterName, Type parameterType)
public CompositeParameterWindow GenerateCompositeParameterWindow(IBaseElement baseElement, string title, string parameterName)
{
CompositeParameterWindow compositeParameterWindow =
Instantiate(EditorManager.instance.basePrefabs.compositeParameterWindow,

View File

@@ -148,8 +148,7 @@ namespace Ichni.RhythmGame
var guidText = inspector.GenerateText(this, container, "Element GUID", nameof(elementGuid), true);
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags), typeof(List<string>))
.SetAsStringList();
inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList();
});
foreach (var submodule in submoduleList)
{