113 lines
3.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 partial class UISliderAnim : UIPanel
{
protected override void OnInit(IUIData uiData = null)
{
mData = uiData as UISliderAnimData ?? new UISliderAnimData();
// please add init code here
}
protected override void OnOpen(IUIData uiData = null)
{
Connet.RemoveAllChildren();
mData = uiData as UISliderAnimData ?? new UISliderAnimData();
if (mData != null)
{
// 解析标题列表
List<string> Objs = mData.title.Split('|')?.ToList();
List<Slider> sliders = new List<Slider>();
// 查找目标对象并获取SkinnedMeshRenderer
GameObject obj = Utility.FindObj(mData.targetObj.ToString());
SkinnedMeshRenderer skinnedRenderer = obj.GetComponent<SkinnedMeshRenderer>();
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 = blendShapeName;
// 设置Slider标题
sliderItemObj.transform.Find("TitleText").GetComponent<Text>().text = Objs[i];
// 获取Slider组件并设置初始值
Slider slider = sliderItemObj.GetComponent<Slider>();
if (slider != null)
{
slider.minValue = 0f;
slider.maxValue = 100f;
slider.value = skinnedRenderer.GetBlendShapeWeight(i);
// 添加值变化事件
int blendShapeIndex = i; // 避免闭包捕获问题
slider.onValueChanged.AddListener((value) =>
{
skinnedRenderer.SetBlendShapeWeight(blendShapeIndex, value);
});
sliders.Add(slider);
}
}
}
}
else
{
Debug.LogError($"物体 {obj.name} 上没有SkinnedMeshRenderer组件!");
}
}
}
protected override void OnShow()
{
}
protected override void OnHide()
{
}
protected override void OnClose()
{
}
}
}