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 lemmons · Apr 25, 2020 at 02:24 AM · c#gameobjectlistlistsgroup

Return a gameObject from LINQ .GroupBy()

I've got a list of gameObjects and I want to track the unique objects in the list as well as the count of each unique object. I'm trying to accomplish this by using LINQ and doing two different things: first, return the unique gameObjects as gameObjects and second I need to keep track of the count of each type of gameObject.

More specifically, I've got a list of troops and there are many different types of troops. In the UI I want to keep track of the type of troop and the current number of them on the battlefield like so:

troop count

For the image above the gameObject list would be 100 gameObjects where 25 are soldiers, 25 are archers, and 50 are cavalry troops.

My idea is to return the unique gameObjects from that list using .Distinct() so I know how many different types of troops there are and can .GetComponent and grab their sprites. Then I need to count how many of each unique game object there are for the troop totals.

Every time a troop is added or removed from the list, a function in the UI manager gets called to update the totals. I'm trying to use LINQ queries and I just can't figure out how to return a gameObject when I use .GroupBy().

 // BattleManager.cs (singleton)
 
 // Gets updated every time a player troop is spawned or despawned
 public List<GameObject> playerTroops;
 
 // UITroopCounter.cs
 
     public GameObject troopCountPrefab;
     private int _uniqueTroopCount = 0;
 
     public void UpdateTroopCounts()
     {
         var _groupedTroops = BattleManager.Instance.playerTroops.Select(g => g.gameObject).GroupBy(g => g.name).ToList();
 
         if (_uniqueTroopCount != _groupedTroops.Count())
         {
             //Clean slate
             foreach (Transform child in transform)
                 Destroy(child.gameObject);
 
             //Create a troopCounter object for each unique type of troop
             foreach (var troop in _groupedTroops)
             {
                 var _newTroopCounter = Instantiate(troopCountPrefab, transform).GetComponent<UITroopCount>();
                 _newTroopCounter.icon = troop.GetComponent<TroopCore>().icon;
                 _newTroopCounter.counter = troop.Count();
             }
         }
         //Once these objects are created, I need some way to keep them attached to the count of the type of troop they are
         //Troops can be revived and new types of troops can be summoned during the battle as well
     }
 }




Even though I'm doing .Select(g => g.gameObject) it comes back in a format I can't use .GetComponent on. Seriously, if there's a better way please let me know because this is feeling pretty squirrely at this point. Thanks!

screen-shot-2020-04-24-at-94152-pm.png (148.5 kB)
Comment
Add comment
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

1 Reply

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

Answer by yummy81 · Apr 25, 2020 at 12:17 PM

I modified your code a bit. At first I rewrote _groupTroops. I will do my best to explain it. I will stick to your assumptions: 25 x soldiers, 25 x archers, 50 x cavalry. So, _groupTroops is a List of anonymous objects. The count of the _groupTroops is 3 - one unique troop. Each anonymous object have three fields, it's just like class of this sort:

 public class Troop{
     public string name;
     public int count;
     public List<GameObject> gameObject;
 }
 

  • name - is the name of the unique troop (soldier, archer, cavalry)
  • count - is the number of GameObjects (so, for soldiers it will be 25, and 50 for cavalry)
  • gameObject - is the list of references to each GameObject of the specified troop. So, if there are 25 soldiers, then you will find here 25 references to those GameObjects.

  • To iterate through _groupTroops, you have to do something like that (there is string "s". It contains the result):

         string s = string.Empty;
         
         for(int i = 0; i < _groupedTroops.Count; i++){
             
             string name = _groupedTroops[i].name;
             int count = _groupedTroops[i].count;
             
             s += name + ": " + count + "\n";
             
             for (int j = 0; j < _groupedTroops[i].gameObject.Count; j++){
                 
                 GameObject go = _groupedTroops[i].gameObject[j];
                 
                 s += "\t" + go + "\n";
             }
         }
    


    Ok. Here you have your UITroopCounter class code. I reproduced your project, and when it comes to me, I can guarantee that it works. Enjoy!

     using System.Collections;
     using System.Collections.Generic;
     using UnityEngine;
     using System.Linq;
     
     public class UITroopCounter : MonoBehaviour
     {    
         public GameObject troopCountPrefab;
         private int _uniqueTroopCount = 0;
     
         public void UpdateTroopCounts(){
     
             var _groupedTroops =
                 BattleManager.Instance.playerTroops
                 .GroupBy(troop => troop.name)
                 .Select(troop =>
                     new {
                         name = troop.Key,
                         count = troop.Count(),
                         gameObject = troop
                     }
                 )
                 .Select(troop =>
                     new{
                         name = troop.name,
                         count = troop.count,
                         gameObject = troop.gameObject.ToList()
                     }
                 )
                 .ToList();
                 
             int _groupedTroopsCount = _groupedTroops.Count;
             
             if (_uniqueTroopCount != _groupedTroopsCount){
                 
                 foreach (Transform child in transform)
                     Destroy(child.gameObject);
                     
                 foreach(var troop in _groupedTroops){
                     
                     var _newTroopCounter = Instantiate<GameObject>(troopCountPrefab, transform).GetComponent<UITroopCount>();
                     
                     _newTroopCounter.icon = troop.gameObject.First().GetComponent<TroopCore>().icon;
                     
                     _newTroopCounter.counter = troop.count;
                     
                 }
             }
     
         }
     }
    
    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 lemmons · Apr 27, 2020 at 06:19 PM 0
    Share

    Thanks! Your solution totally works, but while working on it I changed it up a bit so the Troop class contains more info like the transform.position of each troop. The only thing I didn't totally understand is why you needed to use .Select twice when creating _groupedTroops?

    avatar image yummy81 lemmons · Apr 27, 2020 at 06:57 PM 0
    Share

    You are right! I overcomplicated it. I turned it into something cleaner. Works fine:

             var _groupedTroops =
                 Battle$$anonymous$$anager.Instance.playerTroops
                 .GroupBy(troop => troop.name)
                 .Select(troop =>
                     new {
                         name = troop.Key,
                         count = troop.Count(),
                         gameObject = troop.ToList()
                     }
                 )
                 .ToList();
    

    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

    739 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 avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image 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

    Keep list of GameObjects between scenes 2 Answers

    Grab a specific item from a list 3 Answers

    C# - How to get only Distinct values (with threshold) and a specific count? 0 Answers

    List is created correctly in Start() but returns size 0 in play mode 3 Answers

    How to add elements from a List of another class to another List (C#) 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