using System.Collections; using System.Collections.Generic; using System.Linq; using Ichni.RhythmGame; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace Ichni.Editor { public partial class CompositeParameterWindow : MovableWindow { public Button addNewUnitButton; public GameObject unitPrefab; public IBaseElement connectedBaseElement; public List unitList; public string parameterName; public UnityAction ApplyParameters; public void Initialize(IBaseElement baseElement, string titleText, string parameterName) { transform.localScale = Vector3.zero; this.connectedBaseElement = baseElement; this.parameterName = parameterName; unitList = new List(); InitializeWindow(titleText, ApplyParameters); StartCoroutine(WindowAnim.ShowPanelOnScale(gameObject)); } public void RemoveUnit(DynamicUICompositeUnit unit) { unitList.Remove(unit); Destroy(unit.gameObject); } public CompositeParameterWindow AddListenerFunction(UnityAction action) { onQuit = action; return this; } } public partial class CompositeParameterWindow { public CompositeParameterWindow SetAsStringList() { //生成Unit void GenerateUnit(string content) { DynamicUIInputFieldUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.inputFieldUnit; //初始化:获取当前的List,并生成对应的Unit List list = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as List; foreach (string item in list) { GenerateUnit(item); } addNewUnitButton.GetComponent().SetAsLastSibling(); //为添加新的Unit的按钮设置点击事件 addNewUnitButton.onClick.AddListener(() => { GenerateUnit(""); addNewUnitButton.GetComponent().SetAsLastSibling(); }); //将当前所有Unit的值应用到对应的变量中 ApplyParameters = () => { List stringList = unitList.Select(unit => (unit as DynamicUIInputFieldUnit).GetValue()).ToList(); connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, stringList); }; return this; } public CompositeParameterWindow SetAsFloatList() { void GenerateUnit(float content) { DynamicUIInputFieldUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.inputFieldUnit; List list = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as List; foreach (float item in list) { GenerateUnit(item); } addNewUnitButton.GetComponent().SetAsLastSibling(); addNewUnitButton.onClick.AddListener(() => { GenerateUnit(0); addNewUnitButton.GetComponent().SetAsLastSibling(); }); ApplyParameters = () => { List floatList = unitList.Select(unit => (unit as DynamicUIInputFieldUnit).GetValue()).ToList(); connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, floatList); }; return this; } public CompositeParameterWindow SetAsFlexibleFloat() { void GenerateUnit(AnimatedFloat content) { DynamicUIAnimatedFloatUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); 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().SetAsLastSibling(); addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new AnimatedFloat(0, 0, 0, 0, AnimationCurveType.Linear)); addNewUnitButton.GetComponent().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); }; return this; } public CompositeParameterWindow SetAsFlexibleInt() { void GenerateUnit(AnimatedInt content) { DynamicUIAnimatedIntUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.animatedIntUnit; FlexibleInt flexibleInt = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as FlexibleInt; foreach (AnimatedInt animatedInt in flexibleInt.animations) { GenerateUnit(animatedInt); } addNewUnitButton.GetComponent().SetAsLastSibling(); addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new AnimatedInt(0, 0)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); ApplyParameters = () => { FlexibleInt newFlexibleInt = new FlexibleInt(); foreach (var unit in unitList) { newFlexibleInt.animations.Add((unit as DynamicUIAnimatedIntUnit).GetValue()); } connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, newFlexibleInt); }; return this; } public CompositeParameterWindow SetAsFlexibleBool() { void GenerateUnit(AnimatedBool content) { DynamicUIAnimatedBoolUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.animatedBoolUnit; FlexibleBool flexibleBool = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as FlexibleBool; foreach (AnimatedBool animatedBool in flexibleBool.animations) { GenerateUnit(animatedBool); } addNewUnitButton.GetComponent().SetAsLastSibling(); addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new AnimatedBool(0, false)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); ApplyParameters = () => { FlexibleBool newFlexibleBool = new FlexibleBool(); foreach (var unit in unitList) { newFlexibleBool.animations.Add((unit as DynamicUIAnimatedBoolUnit).GetValue()); } connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, newFlexibleBool); }; return this; } public CompositeParameterWindow SetAsCustomCurve() { void GenerateUnit(Keyframe content) { DynamicUICustomCurveKeyframeUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.customCurveKeyframeUnit; AnimationCurve curve = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as AnimationCurve; List keyframes = curve.keys.ToList(); WarpModes warpModes = new WarpModes(curve.preWrapMode, curve.postWrapMode); //生成warpModes的Unit DynamicUICustomCurveWrapModeUnit warpModesUnit = Instantiate(EditorManager.instance.basePrefabs.customCurveWrapModeUnit, windowRect).GetComponent(); unitList.Add(warpModesUnit); warpModesUnit.SetUnit(this, warpModes); foreach (Keyframe keyframe in keyframes) { GenerateUnit(keyframe); } addNewUnitButton.GetComponent().SetAsLastSibling(); addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new Keyframe(0, 0, 0, 0)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); ApplyParameters = () => { AnimationCurve newCurve = new AnimationCurve(); DynamicUICustomCurveWrapModeUnit warpModesUnit = unitList[0] as DynamicUICustomCurveWrapModeUnit; newCurve.preWrapMode = warpModesUnit.GetValue().preWrapMode; newCurve.postWrapMode = warpModesUnit.GetValue().postWrapMode; for (int i = 1; i < unitList.Count; i++) { DynamicUICustomCurveKeyframeUnit unit = unitList[i] as DynamicUICustomCurveKeyframeUnit; newCurve.AddKey(unit.GetValue()); } connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, newCurve); }; return this; } public CompositeParameterWindow SetAsGradientColorKeys() { void GenerateUnit(GradientColorKey content) { DynamicUIGradientColorKeyUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.gradientColorKeyUnit; Gradient gradient = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as Gradient; List colorKeys = gradient.colorKeys.ToList(); foreach (GradientColorKey colorKey in colorKeys) { GenerateUnit(colorKey); } addNewUnitButton.GetComponent().SetAsLastSibling(); addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new GradientColorKey(Color.white, 1)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); ApplyParameters = () => { List newColorKeys = new List(); foreach (var unit in unitList) { newColorKeys.Add((unit as DynamicUIGradientColorKeyUnit).GetValue()); } (connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as Gradient).colorKeys = newColorKeys.ToArray(); }; return this; } public CompositeParameterWindow SetAsGradientAlphaKeys() { void GenerateUnit(GradientAlphaKey content) { DynamicUIGradientAlphaKeyUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.gradientAlphaKeyUnit; Gradient gradient = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as Gradient; List alphaKeys = gradient.alphaKeys.ToList(); foreach (GradientAlphaKey alphaKey in alphaKeys) { GenerateUnit(alphaKey); } addNewUnitButton.GetComponent().SetAsLastSibling(); addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new GradientAlphaKey(1, 1)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); ApplyParameters = () => { List newAlphaKeys = new List(); foreach (var unit in unitList) { newAlphaKeys.Add((unit as DynamicUIGradientAlphaKeyUnit).GetValue()); } (connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as Gradient).alphaKeys = newAlphaKeys.ToArray(); }; return this; } public CompositeParameterWindow SetAsStringIntDictionary() { //生成Unit void GenerateUnit(KeyValuePair content) { DynamicUIStringIntPairUnit unit = Instantiate(unitPrefab, windowRect).GetComponent(); unitList.Add(unit); unit.SetUnit(this, content); } unitPrefab = EditorManager.instance.basePrefabs.stringIntPairUnit; Dictionary dictionary = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement) as Dictionary; foreach (var pair in dictionary) { GenerateUnit(pair); } addNewUnitButton.GetComponent().SetAsLastSibling(); //为添加新的Unit的按钮设置点击事件 addNewUnitButton.onClick.AddListener(() => { GenerateUnit(new KeyValuePair("New Variable", 0)); addNewUnitButton.GetComponent().SetAsLastSibling(); }); //将当前所有Unit的值应用到对应的变量中 ApplyParameters = () => { Dictionary dictionaryList = new Dictionary(); foreach (var unit in unitList) { KeyValuePair pair = (unit as DynamicUIStringIntPairUnit).GetValue(); dictionaryList.Add(pair.Key, pair.Value); } connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, dictionaryList); }; return this; } } }