網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
一、前言
這個(gè)問(wèn)題還是比較簡(jiǎn)單的,無(wú)非就是一個(gè)for循環(huán)就可以全部獲取到了,但是我喜歡簡(jiǎn)單直達(dá),有沒(méi)有直接就能獲取到所有的子對(duì)象函數(shù)呢,搜了好久都沒(méi)有,所以我準(zhǔn)備寫(xiě)一個(gè)擴(kuò)展函數(shù),來(lái)自己補(bǔ)充這個(gè)函數(shù),一起來(lái)看一下吧。
二、如何獲取所有子對(duì)象
第一種方法
使用foreach循環(huán),找到transform下所有的子物體
foreach(Transform child in transform)
{
Debug.Log(child.gameObject.name);
}
比如說(shuō),我有一個(gè)父物體:m_ParObj,我如何獲取到所有的子對(duì)象呢:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SplitTest : MonoBehaviour
{
public GameObject m_ParObj;
private void Start()
{
List<GameObject> m_Child = new List<GameObject>();
foreach (Transform child in m_ParObj.transform)
{
//Debug.Log(child.gameObject.name);
m_Child.Add(child.gameObject);
}
}
}
這樣就將所有的子對(duì)象保存了下來(lái)。
第二種方法
通過(guò)transform.GetChild(i)來(lái)獲取到所有的子對(duì)象:
for (int i = 0; i < transform.childCount; i++)
{
Debug.Log(transform.GetChild(i).name);
}
比如說(shuō),我有一個(gè)父物體:m_ParObj,我如何獲取到所有的子對(duì)象呢:
using UnityEngine;
public class SplitTest : MonoBehaviour
{
public GameObject m_ParObj;
private void Start()
{
GameObject[] m_Child = new GameObject[m_ParObj.transform.childCount];
for (int i = 0; i < m_Child.Length; i++)
{
m_Child[i] = m_ParObj.transform.GetChild(i).gameObject;
}
}
}
這樣就將所有的子對(duì)象保存了下來(lái)。
三、使用擴(kuò)展方法獲取所有子對(duì)象
總感覺(jué)獲取個(gè)子對(duì)象還要用for循環(huán)有點(diǎn)麻煩,那么咱們就可以寫(xiě)一個(gè)擴(kuò)展方法,直接獲取到所有的子對(duì)象
1、首先新建一個(gè)MyExtensions.cs腳本
using System.Collections.Generic;
using UnityEngine;
public static class MyExtensions
{
}
2、編寫(xiě)腳本
using System.Collections.Generic;
using UnityEngine;
public static class MyExtensions
{
public static List<GameObject> GetChild(this GameObject obj)
{
List<GameObject> tempArrayobj = new List<GameObject>();
foreach (Transform child in obj.transform)
{
tempArrayobj.Add(child.gameObject);
}
return tempArrayobj;
}
public static GameObject[] GetChildArray(this GameObject obj)
{
GameObject[] tempArrayobj = new GameObject[obj.transform.childCount];
for (int i = 0; i < obj.transform.childCount; i++)
{
tempArrayobj[i] = obj.transform.GetChild(i).gameObject;
}
return tempArrayobj;
}
}
這有兩個(gè)函數(shù),一個(gè)是獲取所有子對(duì)象的List集合,一個(gè)是獲取所有子對(duì)象的數(shù)組集合,按需使用。
擴(kuò)展方法的使用可以參考文末補(bǔ)充內(nèi)容
3、使用擴(kuò)展方法
使用m_ParObj.GetChild()就可以調(diào)用擴(kuò)展方法:
using System.Collections.Generic;
using UnityEngine;
public class SplitTest : MonoBehaviour
{
public GameObject m_ParObj;
private void Start()
{
List<GameObject> m_Child = m_ParObj.GetChild();
for (int i = 0; i < m_Child.Count; i++)
{
Debug.Log(m_Child[i].gameObject.name);
}
}
}
這樣就可以通過(guò)一個(gè)函數(shù)就可以獲取到所有的子對(duì)象了。
知識(shí)補(bǔ)充
Unity3D日常開(kāi)發(fā)之?dāng)U展方法的使用
在程序開(kāi)發(fā)中,可能會(huì)遇到現(xiàn)有類型的方法中沒(méi)有我們想要的方法,這時(shí)候就可以使用擴(kuò)展方法給已有類型添加新的方法,而無(wú)需創(chuàng)建新的派生類、重新編譯或者其他方式修改原始類型的代碼。
擴(kuò)展方法需要定義成靜態(tài)方法,通過(guò)實(shí)例方法語(yǔ)法進(jìn)行調(diào)用,參數(shù)類型就是制定方法作用于哪個(gè)類型,該參數(shù)使用this修飾符為前綴
為System.String類添加擴(kuò)展方法
下面的示例演示為 System.String 類定義的一個(gè)擴(kuò)展方法。 請(qǐng)注意,它是在非嵌套的、非泛型靜態(tài)類內(nèi)部定義的:
public static class MyExtensions
{
public static int ReturnWordCount(this string str)
{
return str.Split(new char[] { ' ', '.', '?' }, System.StringSplitOptions.RemoveEmptyEntries).Length;
}
}
調(diào)用該擴(kuò)展方法:
using UnityEngine;
public class Test_Extend : MonoBehaviour
{
void Start()
{
string str = "Hello Extension Methods";
int count = str.ReturnWordCount();
Debug.Log(count);
}
}
編譯結(jié)果:
為UnityEngine.GameObject類添加擴(kuò)展方法
為游戲?qū)ο笠淮翁砑觾蓚€(gè)組件
public static class MyExtensions
{
public static void AddBRComponent(this GameObject obj)
{
obj.AddComponent<BoxCollider>();
obj.AddComponent<Rigidbody>();
}
}
調(diào)用該擴(kuò)展方法:
using UnityEngine;
public class Test_Extend : MonoBehaviour
{
void Start()
{
GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
obj.AddBRComponent();
}
}
原文鏈接:https://itmonon.blog.csdn.net/article/details/110849582
相關(guān)推薦
- 2022-04-15 windows+vscode穿越跳板機(jī)調(diào)試遠(yuǎn)程代碼的圖文教程_python
- 2022-11-23 一文教會(huì)你用正則表達(dá)式校驗(yàn)日期時(shí)間格式_正則表達(dá)式
- 2022-06-16 golang?beego框架環(huán)境搭建過(guò)程_Golang
- 2021-12-19 C語(yǔ)言?八大排序算法的過(guò)程圖解及實(shí)現(xiàn)代碼_C 語(yǔ)言
- 2023-05-21 C#?Replace替換的具體使用_C#教程
- 2022-09-25 Django 遷移錯(cuò)誤 Cannot add foreign key constraint,字段類型
- 2024-07-13 IDEA無(wú)法使用@WebServlet()注解
- 2022-07-16 結(jié)構(gòu)體通過(guò)成員變量獲取主結(jié)構(gòu)體地址(struct)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支