150 lines
4.7 KiB
C#
150 lines
4.7 KiB
C#
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.IO;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 当前脚本的引用路径
|
|||
|
|
/*****************************************************************
|
|||
|
|
ForScripts
|
|||
|
|
|
|||
|
|
*****************************************************************/
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
public class ProcessModelMatData : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
//string regionMatDir = @"Assets\Resources\Models\Mat\Brain\";
|
|||
|
|
//string organMatDir = @"Assets\Resources\Models\Mat\BodyAndOrgans\";
|
|||
|
|
public List<Material> regionMat = new List<Material>();
|
|||
|
|
public List<Material> organMat = new List<Material>();
|
|||
|
|
|
|||
|
|
private void Awake()
|
|||
|
|
{
|
|||
|
|
InitModelMatDict(ModelType.brain, regionMat);
|
|||
|
|
InitModelMatDict(ModelType.organ, organMat);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Start()
|
|||
|
|
{
|
|||
|
|
SetMatColor();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void InitModelMatDict(ModelType type, List<Material> matList)
|
|||
|
|
{
|
|||
|
|
Dictionary<string, Material> tempDict = new Dictionary<string, Material>();
|
|||
|
|
foreach (Material mat in matList)
|
|||
|
|
{
|
|||
|
|
string matName = mat.name;
|
|||
|
|
tempDict[matName] = mat;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (type == ModelType.brain)
|
|||
|
|
DataSource.regionMatDict = tempDict;
|
|||
|
|
else
|
|||
|
|
DataSource.organMatDict = tempDict;
|
|||
|
|
|
|||
|
|
//Debug.Log(tempDict.Count);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SetMatColor()
|
|||
|
|
{
|
|||
|
|
// 设置脑区材质颜色
|
|||
|
|
float brainAlpha = 0.75f;
|
|||
|
|
foreach (Material mat in regionMat)
|
|||
|
|
{
|
|||
|
|
string matName = mat.name;
|
|||
|
|
if (DataSource.regionColorDict.ContainsKey(matName))
|
|||
|
|
{
|
|||
|
|
Vector3 matRGB = DataSource.regionColorDict[matName];
|
|||
|
|
Color matColor = new Color(matRGB.x, matRGB.y, matRGB.z, brainAlpha);
|
|||
|
|
mat.color = matColor;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.Log("material name: " + matName + " is not contained in keys list of " + "regionColorDict.");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置器官材质颜色
|
|||
|
|
foreach (Material mat in organMat)
|
|||
|
|
{
|
|||
|
|
string matName = mat.name;
|
|||
|
|
if (DataSource.organColorDict.ContainsKey(matName))
|
|||
|
|
{
|
|||
|
|
// 为每个器官设置独立的透明度
|
|||
|
|
float organAlpha = 1.0f; // 默认不透明
|
|||
|
|
if (matName == "Body")
|
|||
|
|
{
|
|||
|
|
organAlpha = 0.6f; // Body设置为60%透明度,比原来的40%更清晰
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Vector3 matRGB = DataSource.organColorDict[matName];
|
|||
|
|
Color matColor = new Color(matRGB.x, matRGB.y, matRGB.z, organAlpha);
|
|||
|
|
mat.color = matColor;
|
|||
|
|
|
|||
|
|
// 根据材质名称设置合适的渲染模式
|
|||
|
|
if (matName == "Body")
|
|||
|
|
{
|
|||
|
|
// Body使用特殊的渲染模式,确保单独显示时也能看到
|
|||
|
|
MaterialRenderModeHelper.SetBodyRenderMode(mat, organAlpha);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 其他器官使用标准渲染模式
|
|||
|
|
MaterialRenderModeHelper.AutoSetRenderMode(mat, organAlpha);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
Debug.Log("material name: " + matName + " is not contained in keys list of " + "organColorDict.");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 动态调整Body材质的透明度
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="alpha">透明度值,范围0-1,0为完全透明,1为完全不透明</param>
|
|||
|
|
public void SetBodyAlpha(float alpha)
|
|||
|
|
{
|
|||
|
|
alpha = Mathf.Clamp01(alpha); // 确保值在0-1范围内
|
|||
|
|
|
|||
|
|
foreach (Material mat in organMat)
|
|||
|
|
{
|
|||
|
|
string matName = mat.name;
|
|||
|
|
if (matName == "Body" && DataSource.organColorDict.ContainsKey(matName))
|
|||
|
|
{
|
|||
|
|
Vector3 matRGB = DataSource.organColorDict[matName];
|
|||
|
|
Color currentColor = mat.color;
|
|||
|
|
// 保持当前颜色,只更改透明度
|
|||
|
|
mat.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
|
|||
|
|
|
|||
|
|
// 为Body使用特殊的渲染模式,确保单独显示时也能看到
|
|||
|
|
MaterialRenderModeHelper.SetBodyRenderMode(mat, alpha);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取当前Body材质的透明度
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns>当前Body的透明度值</returns>
|
|||
|
|
public float GetBodyAlpha()
|
|||
|
|
{
|
|||
|
|
foreach (Material mat in organMat)
|
|||
|
|
{
|
|||
|
|
string matName = mat.name;
|
|||
|
|
if (matName == "Body")
|
|||
|
|
{
|
|||
|
|
return mat.color.a;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return 1.0f; // 如果未找到Body材质,返回默认值
|
|||
|
|
}
|
|||
|
|
}
|