Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Raja-Unity · Feb 18, 2018 at 06:16 PM · c#scripting problemeditorgameobjectsgetcomponentsinchildren

Use GetComponentsInChildren but don't access grand children

I have a script and it uses the GetComponentsInChildren function on a game object but when the function is executed, it returns all the children including the grandchildren. alt text

How do I make the GetComponentsInChildren function only access the first children in yellow and not access the grandchildren?

getchildquestion.png (20.2 kB)
Comment
Add comment · Show 1
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Bunny83 · Feb 18, 2018 at 08:48 PM 1
Share

Note that Unity's GetComponentsInChildren does also return components on the given object, not only on children. The name is actually badly choosen. Something like GetComponentRecursive probably would have been better ^^.

2 Replies

· Add your reply
  • Sort: 
avatar image
3
Best Answer

Answer by yummy81 · Feb 18, 2018 at 07:11 PM

I wrote that script for you on the fly. Attach it to your "Parent" gameobject and check whether it works as you want. I created the "GetComponentsInDirectChildren" extension method which returns the list of desired components in direct children (in gameobjects you marked in yellow). Additionally, I created "GetComponentsRecursive" extension method which returns the list of desired components in direct children and the parent. Here's the code:

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class Raja : MonoBehaviour
 {
     private void Awake()
     {
         var children = gameObject.GetComponentsInDirectChildren<Transform>();
         
         foreach (var child in children)
         {
             Debug.Log(child.name);
         }
     }
 }
 
 public static class Extensions
 {
     public static List<T> GetComponentsRecursive<T>(this GameObject gameObject) where T : Component
     {
         int length = gameObject.transform.childCount;
         List<T> components = new List<T>(length + 1);
         T comp = gameObject.transform.GetComponent<T>();
         if (comp != null) components.Add(comp);
         for (int i = 0; i < length; i++)
         {
             comp = gameObject.transform.GetChild(i).GetComponent<T>();
             if (comp != null) components.Add(comp);
         }
         return components;
     }
     
     public static List<T> GetComponentsInDirectChildren<T>(this GameObject gameObject) where T : Component
     {
         int length = gameObject.transform.childCount;
         List<T> components = new List<T>(length);
         for (int i = 0; i < length; i++)
         {
             T comp = gameObject.transform.GetChild(i).GetComponent<T>();
             if (comp != null) components.Add(comp);
         }
         return components;
     }
 }
 
 
Comment
Add comment · Show 2 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Bunny83 · Feb 18, 2018 at 08:45 PM 1
Share

You may want to rename the method to something like GetComponentsInDirectChildren ^^. If you get back to that project in 3 years or if multiple people work on the same project you / they wouldn't have any idea what "GetComponentsInChildren2" does ^^. Also since you are creating a List anyways i would return the list directly. There's no need to return an array if you already have a list. In many cases a list would be more useful and it actually prevents the additional array creation. Also you may want to set the list capacity to "length". This will avoid unnecessary resizing if there are many childs. There is a List constructor that takes an int value for the initial capacity.


Also such helpers probably should be extension methods ^^. Also another version that takes a list as parameter might be a good idea especially for mobile (a GC friendly variant).

avatar image yummy81 Bunny83 · Feb 18, 2018 at 10:39 PM 0
Share

Thank you @Bunny83 for your remarks. I modified my code. The reason why I initially chose to convert list into array was that I wanted my method to resemble the Unity's GetComponentsInChildren - the Unity's one returns array. Now, both of them return list. You are also right that the Unity's GetComponentsInChildren also returns the component on the parent object, but OP wanted only those marked in yellow, so, while being aware of that, I created my method to suit his needs. There's also one more difference - my methods do not care whether component is on active or inactive gameobject. And, of course, I know that these na$$anonymous$$g things are terrible :)

avatar image
0

Answer by Szkeptik · May 13, 2021 at 01:31 PM

With System.Linq you can do:

  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  using System.Linq;
  
  public class MyClass : MonoBehaviour{
 
  Component[] directChildren;
 
  void Start{
    directChildren =  (from directChild in GameObject.Find("Parent").transform.
                       GetComponentsInChildren<Component>() 
                       where directChild.transform.name == "Child" 
                       select directChild).ToArray();
           }
 }

Or if you don't want to rely on the naming:

     public GameObject parentGO; // drag into field in editor
 
     Component[] directChildren =  (from directChild in parentGO.
                                    GetComponentsInChildren<Component>() 
                                    where directChild.transform.parent == parentGO.transform 
                                    select directChild).ToArray();

Or if you don't want to use Linq:

 List<Component> directChildren = new List<Component>();
 foreach(Transform go in parentGO.transform){  // This will only find direct children
        Component c = go.gameObject.GetComponent<Component>();
        directChildren.Add(c);
 }




Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

476 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Initialising List array for use in a custom Editor 1 Answer

Confused about custom GameObjects,Custom GameObject confusion 0 Answers

myObjetc..GetType().GetCustomAttributes(typeof(RequireComponent) not working correctly 1 Answer

Get callback when assets loading or deserialization finished? 1 Answer

Build problem 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges