using UnityEngine; using UnityEngine.UI; using QFramework; using System.Collections.Generic; using System; using System.Linq; namespace QFramework.Example { public class UISliderAnimData : UIPanelData { public string title; public string targetObj; public string HideObject; } public partial class UISliderAnim : UIPanel { List sliders=new List { }; protected override void OnInit(IUIData uiData = null) { mData = uiData as UISliderAnimData ?? new UISliderAnimData(); // please add init code here TypeEventSystem.Global.Register((arg) => Hide()).UnRegisterWhenGameObjectDestroyed(gameObject); } Transform[] childsTransforms; protected override void OnOpen(IUIData uiData = null) { sliders?.Clear(); Connet.RemoveAllChildren(); mData = uiData as UISliderAnimData ?? new UISliderAnimData(); if (mData != null) { // 解析标题列表 List Objs = mData.title.Split('|')?.ToList(); // 查找目标对象并获取SkinnedMeshRenderer GameObject obj = Utility.FindObj(mData.targetObj.ToString()); SkinnedMeshRenderer skinnedRenderer = obj.GetComponent(); //childsTransforms = transform.GetComponentsInChildren(true); //foreach (var objChild in childsTransforms) { // objChild.gameObject.SetActive(false); //} if (skinnedRenderer != null) { // 获取共享网格(包含BlendShapes数据) Mesh mesh = skinnedRenderer.sharedMesh; // 获取BlendShape数量 int blendShapeCount = mesh.blendShapeCount; // Debug.Log($"物体 {obj.name} 有 {blendShapeCount} 个BlendShapes"); // 遍历所有BlendShapes并输出信息 //for (int i = 0; i < blendShapeCount; i++) //{ // string blendShapeName = mesh.GetBlendShapeName(i); // float currentWeight = skinnedRenderer.GetBlendShapeWeight(i); // Debug.Log($"BlendShape #{i}: {blendShapeName}, 当前权重: {currentWeight}"); //} // 为每个BlendShape创建对应的Slider for (int i = 0; i < Objs.Count; i++) { if (i < blendShapeCount) // 确保BlendShape索引有效 { string blendShapeName = mesh.GetBlendShapeName(i); // 实例化Slider预制体 GameObject sliderItemObj = GameObject.Instantiate(Slider.gameObject, Connet); sliderItemObj.name = Objs[i]; // 设置Slider标题 //Debug.Log(sliderItemObj+"??"); Slider slider = sliderItemObj.GetComponent(); slider.transform.Find("Title").transform.Find("TitleText").GetComponent().text = Objs[i]; // 获取Slider组件并设置初始值 sliders.Add(slider); if (slider != null) { slider.minValue = 0f; slider.maxValue = 100f; slider.value = skinnedRenderer.GetBlendShapeWeight(i); // 添加值变化事件 int blendShapeIndex = i; // 避免闭包捕获问题 slider.onValueChanged.AddListener((value) => { //Debug.Log("滑动Slider的值???"+ value); skinnedRenderer.SetBlendShapeWeight(blendShapeIndex, value); CheckSliderValues(); }); } } } } else { Debug.LogError($"物体 {obj.name} 上没有SkinnedMeshRenderer组件!"); } } } private void CheckSliderValues() { foreach (Slider slider in sliders) { if (slider.value != 0) { UIKit.GetPanel()?.Hide(); GameObject obj = Utility.FindObj(mData.HideObject.ToString()); obj.gameObject.SetActive(false); break; } else if(slider.value == 0) { //foreach (var objChild in childsTransforms) //{ // objChild.gameObject.SetActive(true); //} GameObject obj = Utility.FindObj(mData.HideObject.ToString()); obj.gameObject.SetActive(true); var v= UIKit.GetPanel(); var Data = UIKit.GetPanel().Data; UIKit.OpenPanelAsync(uiData: Data, canvasLevel: UILevel.Common).ToAction().StartGlobal(() => { }); v.Show(); v.isUpdate = true; } } } protected override void OnShow() { } protected override void OnHide() { } protected override void OnClose() { } } }