You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:50:29