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 title, string parameterName) { transform.localScale = Vector3.zero; this.connectedBaseElement = baseElement; this.parameterName = parameterName; this.title.text = title; unitList = new List(); closeButton.onClick.AddListener(Quit); StartCoroutine(WindowAnim.ShowPanel(gameObject)); } public void RemoveUnit(DynamicUICompositeUnit unit) { unitList.Remove(unit); Destroy(unit.gameObject); } } public partial class CompositeParameterWindow { public void 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); }; } public void 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); }; } public void 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); }; } public void 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); }; } public void 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); }; } public void Quit() { ApplyParameters(); //StartCoroutine(WindowAnim.HidePanel(gameObject, true)); Destroy(gameObject); } } }