113 lines
3.8 KiB
C#
113 lines
3.8 KiB
C#
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()
|
||
{
|
||
}
|
||
}
|
||
}
|