如何统计C#中特定枚举成员对应的对象数量?
统计Unity中不同Size枚举的对象数量
核心思路是遍历所有带有BallSizes组件的对象,按枚举值分组计数。Enum.GetName()/Enum.GetValue()仅用于处理枚举本身的属性,和对象实例的统计无关,下面是几种实用的实现方案:
1. 先修正BallSizes类的访问权限
你的size字段是private,外部类无法直接读取,需要添加公共 getter 暴露这个值:
using UnityEngine; public enum Size { Small = 0, Medium, Large } public class BallSizes : MonoBehaviour { [SerializeField] private Size size; // 提供公共方法获取尺寸枚举值 public Size GetBallSize() { return size; } }
2. 手动遍历计数(直观易读)
适合枚举成员固定、无需扩展的场景,直接声明计数变量,遍历所有对象累加:
using UnityEngine; public class SizeCounter : MonoBehaviour { // 调用此方法执行统计 public void CountBallSizes() { int smallCount = 0; int mediumCount = 0; int largeCount = 0; // 获取场景中所有带有BallSizes组件的对象(true表示包含非激活对象) BallSizes[] allBalls = FindObjectsOfType<BallSizes>(true); foreach (var ball in allBalls) { switch (ball.GetBallSize()) { case Size.Small: smallCount++; break; case Size.Medium: mediumCount++; break; case Size.Large: largeCount++; break; } } // 输出统计结果到控制台 Debug.Log($"小球数量:{smallCount},中球数量:{mediumCount},大球数量:{largeCount}"); } }
3. 用Dictionary自动适配所有枚举成员(扩展性强)
如果以后要给Size枚举新增成员,这种方式无需修改计数逻辑,自动适配所有枚举值:
using System.Collections.Generic; using UnityEngine; public class SizeCounter : MonoBehaviour { public void CountBallSizes() { // 初始化字典,每个枚举成员的初始计数为0 Dictionary<Size, int> sizeCountDict = new Dictionary<Size, int>(); foreach (Size size in System.Enum.GetValues(typeof(Size))) { sizeCountDict[size] = 0; } BallSizes[] allBalls = FindObjectsOfType<BallSizes>(true); foreach (var ball in allBalls) { Size currentSize = ball.GetBallSize(); sizeCountDict[currentSize]++; } // 遍历字典输出所有结果 foreach (var kvp in sizeCountDict) { Debug.Log($"{kvp.Key}:{kvp.Value}"); } } }
4. 用Linq简化代码(简洁高效)
需要引入System.Linq命名空间,一行代码完成分组统计,适合追求代码简洁的场景:
using System.Linq; using UnityEngine; public class SizeCounter : MonoBehaviour { public void CountBallSizes() { BallSizes[] allBalls = FindObjectsOfType<BallSizes>(true); // 按Size分组并统计数量 var sizeGroups = allBalls.GroupBy(ball => ball.GetBallSize()) .Select(group => new { SizeType = group.Key, Count = group.Count() }); foreach (var group in sizeGroups) { Debug.Log($"{group.SizeType}:{group.Count}"); } // 单独获取某一类的数量,比如Small: int smallCount = allBalls.Count(ball => ball.GetBallSize() == Size.Small); Debug.Log($"小球数量:{smallCount}"); } }
注意事项
FindObjectsOfType<BallSizes>(true)会统计场景中所有已加载的对象(包括非激活状态),预制体本身不会被统计,只有实例化到场景中的对象才会被计入。- 如果对象是动态生成的(比如通过
Instantiate),需要在生成完成后调用统计方法,或者在需要统计的时机(如按钮点击、帧更新)触发计数。
内容的提问来源于stack exchange,提问作者lovelyladder
相关产品推荐
相关产品推荐

