概述(Overview)
ChangeTransparent 是一个用于控制物体材质透明和高亮显示的 Unity 组件。它支持将非聚焦物体透明化,并恢复指定结构的原始材质,适合教学拆解展示、设备结构聚焦等场景。
依赖(Dependencies)
- UnityEngine
- UnityEngine.UI
- Renderer
- Material
公共成员(Public Fields)
| 名称 | 类型 | 说明 |
|---|
Transform root | Transform | 父物体根节点,作为查找范围起点 |
List<Transform> allList | List<Transform> | 所有可操作物体缓存列表 |
List<ChangeMat> changeMats | List<ChangeMat> | 需要显示的结构列表,含按钮和子物体 |
Material transparentMaterial | Material | 用于透明化的材质 |
事件(Events)
| 名称 | 类型 | 说明 |
|---|
ChangeMat | Action<string> | 用于请求显示指定结构 |
RecoveryMat | Action | 恢复所有结构原始材质 |
方法一览(API Index)
| 方法名 | 访问级别 | 说明 |
|---|
AddMaterialToDictionary() | private | 缓存所有物体的原始材质 |
Recovery() | private | 恢复所有结构材质 |
GetItem(string itemName) | private | 显示指定结构,透明其他 |
RecoveryTransparent(Transform tran, Dictionary<string, Material[]> matDict) | private static | 恢复指定物体的原始材质 |
ModTransparent(Transform tran, Material transparentMaterial) | private static | 应用透明材质到指定物体 |
GetGameObjectPath(Transform obj) | private static | 获取物体层级路径 |
GetChild(Transform father) | private static | 获取指定父物体所有带 Renderer 的子物体 |
DemoTest() | private | 演示用,恢复材质测试 |
Transparent() | private (ContextMenu) | 编辑器初始化所有角色材质缓存 |
方法详情(Methods)
AddMaterialToDictionary
private void AddMaterialToDictionary()
{
foreach (var child in allList)
{
var path = GetGameObjectPath(child);
if (child.GetComponent<Renderer>() == null) continue;
var materials = child.GetComponent<Renderer>().materials;
_materials.Add(path, materials);
}
}
Recovery
private void Recovery()
{
changeMats.ForEach(x =>
{
x.child.ForEach(o => { RecoveryTransparent(o, _materials); });
});
}
GetItem
private void GetItem(string itemName)
{
var item = changeMats.First(x => x.root.name == itemName);
foreach (var child in allList)
{
ModTransparent(child, transparentMaterial);
}
item.child.ForEach(o =>
{
RecoveryTransparent(o, _materials);
});
}
RecoveryTransparent
private static void RecoveryTransparent(
Transform tran,
Dictionary<string, Material[]> matDict)
{
var path = GetGameObjectPath(tran);
tran.GetComponent<Renderer>().materials = matDict[path];
}
ModTransparent
private static void ModTransparent(Transform tran, Material transparentMaterial)
{
var mat = new Material[tran.GetComponent<Renderer>().materials.Length];
for (var i = 0; i < mat.Length; i++)
{
mat[i] = transparentMaterial;
}
tran.GetComponent<Renderer>().materials = mat;
}
GetGameObjectPath
private static string GetGameObjectPath(Transform obj)
{
var path = "/" + obj.name;
while (obj.parent != null)
{
obj = obj.parent;
path = "/" + obj.name + path;
}
return path;
}
GetChild
private static List<Transform> GetChild(Transform father)
{
return (from show in father.GetComponentsInChildren<Transform>()
let temp = GetGameObjectPath(show)
where show.GetComponent<Renderer>() != null
select show).ToList();
}
DemoTest
private void DemoTest()
{
foreach (var child in allList)
{
var path = GetGameObjectPath(child);
if (child.GetComponent<Renderer>() == null) continue;
var materials = child.GetComponent<Renderer>().materials;
_materials.Add(path, materials);
}
var item = changeMats.First(x => x.root.name == "itemName");
foreach (var child in allList)
{
ModTransparent(child, transparentMaterial);
}
item.child.ForEach(o =>
{
RecoveryTransparent(o, _materials);
});
}
Transparent
#if UNITY_EDITOR
[ContextMenu("初始化所有角色")]
private void Transparent()
{
allList.Clear();
foreach (var t in GetChild(root))
{
allList.Add(t);
}
changeMats.ForEach(x => { x.child = GetChild(x.root.transform); });
}
#endif