GetComponentsInChildren<Transform>(true)

本文介绍了Unity中使用GetComponentsInChildren方法的不同参数设置来获取游戏对象下子物体组件的细节,包括如何选择是否包含未激活的游戏对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GetComponentsInChildren<Transform>(true);//游戏对象下的子物体激活的没激活的都会被拿到,包括游戏对象本身
GetComponentsInChildren<Transform>(false);//游戏对象下的子物体激活的会被拿到,包括游戏对象本身;没激活的不会被拿到
另外,()不写的活默认为false.

转载于:https://www.cnblogs.com/mcyushao/p/11225071.html

using System.Collections.Generic; using UnityEngine; public class AdvancedMaterialSwitcher : MonoBehaviour { [System.Serializable] public class MaterialConfiguration { public Renderer targetRenderer; // 目标渲染器 public Material[] switchMaterials; // 要切换的材质数组 public Transform targetParent; // 新增目标父物体 public bool includeParent = true; // 新增包含父物体设置 } [Header("树木隐藏")] public GameObject Tree; public bool TreeBool = true; [Header("材质配置")] public List<MaterialConfiguration> materialConfigs = new List<MaterialConfiguration>(); [Header("状态管理")] private bool isOriginal = true; private Dictionary<Renderer, Material[]> materialArchive = new Dictionary<Renderer, Material[]>(); void Start() { foreach (var config in materialConfigs) { if (config.targetRenderer == null && config.targetParent == null) { Debug.LogError("配置项必须指定渲染器或父物体!", this); continue; } List<Renderer> renderers = new List<Renderer>(); // 收集所有目标渲染器 if (config.targetParent != null) { // 获取子物体(可选择是否包含父物体自身) renderers.AddRange(config.targetParent.GetComponentsInChildren<Renderer>(includeParent)); } else if (config.targetRenderer != null) { renderers.Add(config.targetRenderer); } // 备份材质 foreach (var rend in renderers) { materialArchive[rend] = rend.sharedMaterials; } } } public void ToggleMaterials() { foreach (var config in materialConfigs) { List<Renderer> targetRenderers = new List<Renderer>(); if (config.targetParent != null) { targetRenderers.AddRange(config.targetParent.GetComponentsInChildren<Renderer>(config.includeParent)); } else if (config.targetRenderer != null) { targetRenderers.Add(config.targetRenderer); } foreach (var rend in targetRenderers) { rend.sharedMaterials = isOriginal ? config.switchMaterials : materialArchive.ContainsKey(rend) ? materialArchive[rend] : rend.sharedMaterials; } } isOriginal = !isOriginal; } public void UnTree() { TreeBool = Tree.activeSelf; if(TreeBool == true) { Tree.SetActive(false); } else { Tree.SetActive(true); } } }严重性 代码 说明 项目 文件 行 禁止显示状态 详细信息 错误 CS0103 当前上下文中存在名称“includeParent” Assembly-CSharp E:\Unity3DWrok\NanNing\Assets\Script\测试\AdvancedMaterialSwitcher.cs 49 活动
03-14
using System.Collections.Generic; using UnityEngine; public class AdvancedMaterialSwitcher : MonoBehaviour { [System.Serializable] public class MaterialConfiguration { public Renderer targetRenderer; // 目标渲染器 public Material[] switchMaterials; // 要切换的材质数组 public Transform targetParent; // 新增目标父物体 public bool includeParent = true; // 新增包含父物体设置 } [Header("树木隐藏")] public GameObject Tree; public bool TreeBool = true; [Header("材质配置")] public List<MaterialConfiguration> materialConfigs = new List<MaterialConfiguration>(); [Header("状态管理")] private bool isOriginal = true; private Dictionary<Renderer, Material[]> materialArchive = new Dictionary<Renderer, Material[]>(); void Start() { foreach (var config in materialConfigs) { if (config.targetRenderer == null && config.targetParent == null) { Debug.LogError("配置项必须指定渲染器或父物体!", this); continue; } List<Renderer> renderers = new List<Renderer>(); // 收集所有目标渲染器 if (config.targetParent != null) { // 获取子物体(可选择是否包含父物体自身) renderers.AddRange(config.targetParent.GetComponentsInChildren<Renderer>(config.includeParent)); } else if (config.targetRenderer != null) { renderers.Add(config.targetRenderer); } // 备份材质 foreach (var rend in renderers) { materialArchive[rend] = rend.sharedMaterials; } } } public void ToggleMaterials2() { foreach (var config in materialConfigs) { List<Renderer> targetRenderers = new List<Renderer>(); if (config.targetParent != null) { targetRenderers.AddRange(config.targetParent.GetComponentsInChildren<Renderer>(config.includeParent)); } else if (config.targetRenderer != null) { targetRenderers.Add(config.targetRenderer); } foreach (var rend in targetRenderers) { rend.sharedMaterials = isOriginal ? config.switchMaterials : materialArchive.ContainsKey(rend) ? materialArchive[rend] : rend.sharedMaterials; } } isOriginal = !isOriginal; } public void UnTree() { TreeBool = Tree.activeSelf; if(TreeBool == true) { Tree.SetActive(false); } else { Tree.SetActive(true); } } }这个代码的材质配置无法生效,只有element0能生效,其他的换了对应材质还是无法切换
最新发布
03-19
public class DottedLine : MonoBehaviour { /// <summary> /// 存放虚线中的每个线段 /// </summary> public List<GameObject> gameObjects; /// <summary> /// 存放每个码头的名字 /// </summary> public List<string> wharfId; public bool showBerthingArea = true; public bool showNotifyArea = true; public string currentId=""; /// <summary> /// 将每个线段添加到List /// </summary> void Start() { Transform[] transforms = GetComponentsInChildren<Transform>();//获取当前游戏对象及其所有子对象上的Transform组件,并将它们存储在一个数据组中。 foreach (Transform tf in transforms) { GameObject go = tf.gameObject; if (go != gameObject)//将所有子对象的GameObject对象存储到一个列表中,并排除了当前游戏对对象本身。也就是说,如果go指向的是当前游戏对象本身,那么它会被添加到gameObjects列表中。 { gameObjects.Add(go); } }public void UpdateHeightLight(string id, bool berthingArea=true, bool notifyArea = false) { foreach (GameObject go in gameObjects) { if (id == "" || go.name.Contains(id)) { LineRenderer line = go.GetComponent<LineRenderer>(); if (line != null) { bool show = false; if (go.name.Contains("BerthingArea")) { show = berthingArea; } else if (go.name.Contains("NotifyArea")) { show = notifyArea; } line.TrySetActive(show); } } } } public void ShowAssignId(string id) { currentId = id; Debug.LogError($"current:{ currentId}"); UpdateHeightLight(id, showBerthingArea, showNotifyArea); }
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值