StatDisplay(统计显示)

StatDisplay 系统为 realvirtual 仿真提供全面的实时性能监控和生产统计,支持对自动化系统性能进行详细分析。

⚠️

仅 Professional 版本:StatDisplay 仅在 realvirtual Professional 中可用。不包含在 Starter 版本中。

要求

需要 TextMeshPro:StatDisplay 需要 Unity 的 TextMeshPro 进行文本渲染。TextMeshPro 随 Unity 一起提供,可通过 Window 菜单访问。

设置 TextMeshPro

TextMeshPro 已随 Unity 包含。要访问 TextMeshPro 资源:

  1. 访问 TextMeshPro 菜单:Window → TextMeshPro
  2. 导入必要资源:如果提示,选择"Import TMP Essential Resources"
  3. 导入示例(可选):选择"Import TMP Examples and Extras"获取额外资源
通过 Unity 的 Window 菜单访问 TextMeshPro 资源
ℹ️

注意:TextMeshPro 预装在 Unity 中。您只需在项目中首次使用 TextMeshPro 组件时导入必要资源。

概述

StatDisplay 由多个专业组件组成,它们协同工作,提供对仿真性能和生产指标的完整可见性。系统追踪产出率、周期时间、状态利用率和操作效率,帮助在虚拟调试期间优化自动化系统。

主要优势包括:

  • 仿真期间的实时生产监控
  • 用于性能优化的周期时间分析
  • 用于效率分析的状态利用率追踪
  • 最少设置的自动化统计收集
  • 与 realvirtual 的 LogicStep 系统集成
  • Unity Inspector 中带 StatDisplayOutput 组件的 StatDisplay 系统
💡 提示 StatDisplay 组件在仿真开发过程中尽早集成效果最佳,允许在系统开发和优化过程中持续监控。

组件架构

StatDisplay 系统由五个专业组件组成,它们协同工作:


StatController(中央协调器)
├── StatDisplayOutput(视觉显示)
├── StatCycleTime(时序分析) 
├── StatStates(利用率追踪)
└── StatOutput(生产计数)

组件角色

StatController:统计管理和重置计时的中央协调器

StatDisplayOutput:使用 TextMeshPro 将实时统计渲染到屏幕显示

StatCycleTime:追踪生产周期时序,进行最小/最大/平均分析

StatStates:监控操作状态并计算利用率百分比

StatOutput:计算生产产出并计算速率(每小时/每天件数)

运行时显示

系统提供所有统计数据的全面运行时可视化:

完整的 StatDisplay 系统运行时视图,显示输出统计、循环时间和状态利用率

快速开始

基本设置(5 分钟)

  1. 创建统计游戏对象
    • 在层级中右键单击 → Create Empty
    • 命名为 "ProductionStats"
    • 添加核心组件
    • 添加 StatController 组件
    • 添加 StatOutput 组件用于生产计数
    • 添加 StatDisplayOutput 组件用于视觉显示
    • 配置显示
    • 如果不存在,创建 UI Canvas
    • 将 TextMeshPro 组件分配给 StatDisplayOutput
    • 在 StatController 中设置重置间隔(默认:60 秒)
    • 连接到生产
    • 使用 LogicStep 组件或直接 API 调用触发统计
    • 当零件生产出来时调用 StatOutput.IncrementCount()

StatDisplayOutput 组件

属性

显示配置

统计显示(Stat Displays)(数组)用于显示不同统计数据的显示元素集合。

  • 类型:StatDisplayElement 数组
  • 默认:空数组
  • 使用场景:定义要显示的统计数据及其格式

Text Mesh Pro 设置

背景(Background) 统计显示的视觉背景组件。

  • 类型:UI Image 组件引用
  • 默认:无
  • 使用场景:提供视觉背景以获得更好的文本可读性

内边距(Padding) 文本布局的显示内边距设置。

  • 类型:Vector2(X 和 Y 值)
  • 默认:(10, 10)
  • 范围:0 到 100 像素
  • 使用场景:调整显示背景内的文本间距

运行时显示功能

屏幕显示显示:

  • 产出率:当前每小时件数(例如,"308"、"334")
  • 总数:累积生产计数
  • 实时更新:仿真期间更新的实时统计

StatController 组件

属性

核心设置

重置统计(Reset Statistics) 跨所有组件自动重置统计的时间间隔。

  • 类型:Float
  • 默认:60 秒
  • 范围:1 到 3600 秒(1 秒到 1 小时)
  • 使用场景:定义统计数据清除以进行新测量的频率

组件管理

统计组件(Stat Components) 场景中自动检测到的统计组件。

  • 类型:组件数组(只读)
  • 默认:自动填充
  • 使用场景:显示由该控制器管理的组件

功能

StatController 通过以下方式协调所有统计组件:

  • 在所有统计之间同步重置计时
  • 提供集中管理界面
  • 自动检测场景中兼容的组件

StatCycleTime 组件

属性

周期追踪

自动开始检测(Auto Start Detection) 从连接的组件自动检测周期开始事件。

  • 类型:Boolean
  • 默认:true
  • 使用场景:启用以自动检测周期,禁用以手动控制

周期超时(Cycle Timeout) 将周期视为未完成之前的最大时间。

  • 类型:Float
  • 默认:300 秒(5 分钟)
  • 范围:10 到 3600 秒
  • 使用场景:防止不完整周期影响统计

运行时统计

组件追踪和显示:

  • 最小周期时间:记录的最短周期(秒)
  • 最大周期时间:记录的最长周期(秒)
  • 平均周期时间:监控期间的平均周期时间
  • 当前周期时间:最近完成的周期
  • 周期计数:自上次重置以来的总完成周期
💡 提示 在 LogicStep 组件中使用 StartCycle()EndCycle() 方法精确控制时序测量。

StatStates 组件

属性

状态配置

默认状态(Default States) 用于追踪的预定义操作状态。

  • 类型:字符串数组
  • 默认:["Moving", "Waiting", "MoveBack", "Error"]
  • 使用场景:自定义状态以匹配自动化系统

显示利用率(Show Utilization) 在运行时统计中显示总体利用率百分比。

  • 类型:Boolean
  • 默认:true
  • 使用场景:切换总体利用率显示

运行时分析

组件提供详细的操作分析:

总体利用率:基于生产与空闲时间比的系统效率百分比

状态细分:每个操作状态中的时间和百分比:

  • Moving:活动生产操作
  • Waiting:操作之间的空闲时间
  • MoveBack:返回或定位运动
  • Error:错误或维护状态
💡 提示 调用 State("StateName") 方法追踪状态更改。状态区分大小写,必须与配置的状态名称匹配。

StatOutput 组件

属性

生产设置

每天小时数(Hours Per Day) 用于每日生产率计算的工作小时数。

  • 类型:Float
  • 默认:24 小时
  • 范围:1 到 24 小时
  • 使用场景:设置实际操作时间表(例如,单班制 8 小时)

零件描述(Parts Description) 对正在计数的项目类型的自定义标签。

  • 类型:String
  • 默认:"Parts"
  • 使用场景:指定产品类型("Bottles"、"Assemblies"、"Packages")

显示选项

显示每天件数(Show Parts Per Day) 在显示中包含每日生产预测。

  • 类型:Boolean
  • 默认:true
  • 使用场景:为短期分析切换每日速率计算

运行时统计

显示实时生产指标:

  • 总数:自上次重置以来的累积生产项目数
  • 每小时件数:基于最近活动的当前生产率
  • 每天件数:基于当前速率和运行时间预测的每日产出
💡 提示 使用 IncrementCount()IncrementCount(int amount) 追踪生产。系统会根据时序自动计算速率。

编辑器工具

检视器功能

组件自动检测:StatController 自动查找和管理场景中兼容的统计组件。

实时预览:统计数据显示在播放模式下实时更新,提供即时反馈。

重置按钮:StatController 检视器中的手动重置按钮,用于在测试期间清除统计。

辅助图标和视觉辅助

状态可视化:StatStates 组件在选中时显示当前状态于场景视图中。

连接指示器:视觉线条显示 StatController 与管理的组件之间的关系。

高级配置

多工位设置

  1. 独立控制器:为每个生产工位使用单独的 StatController 组件
  2. 组件分组:将相关统计组件分组到特定工位的游戏对象下
  3. 显示协调:为不同的查看区域配置多个 StatDisplayOutput 组件
  4. 同步重置:根据需求使用全局重置计时或独立的工位重置

使用示例

基本生产监控

简单产出计数


// 在生产逻辑中
public class ProductionStation : MonoBehaviour
{
    public StatOutput outputCounter;
    
    public void OnPartCompleted()
    {
        outputCounter.IncrementCount();
        Debug.Log($"Total parts: {outputCounter.TotalCount}");
    }
}

周期时间测量


// 追踪完整生产周期
public class CycleController : MonoBehaviour
{
    public StatCycleTime cycleTimer;
    public StatStates stateTracker;
    
    public void StartProduction()
    {
        cycleTimer.StartCycle();
        stateTracker.State("Moving");
    }
    
    public void CompleteProduction()
    {
        cycleTimer.EndCycle();
        stateTracker.State("Waiting");
    }
}

与 LogicStep 系统集成

StatDisplay 组件与 realvirtual 的 LogicStep 系统无缝集成:

开始周期时间追踪


public class LogicStep_StatStartCycle : LogicStep
{
    public StatCycleTime StatCycleTimeComponent;

    #pragma warning disable 0414
    private bool signalnotnull = false;
    #pragma warning restore 0414
    
    protected new bool NonBlocking()
    {
        return true;
    }
    
    protected override void OnStarted()
    {
        State = 50;
        if (StatCycleTimeComponent != null)
            StatCycleTimeComponent.StartCycle();
        NextStep();
    }
    
    protected new void Start()
    {
        base.Start();
    }
}

为利用率追踪设置状态


public class LogicStep_StatSetState : LogicStep
{
    public StatStates StatStatesComponent;
    public string SetState = "Moving";
    
    protected override void OnStarted()
    {
        if (StatStatesComponent != null)
        {
            StatStatesComponent.State(SetState);
        }
        NextStep();
    }
    
    protected new void Start()
    {
        base.Start();
    }
}

高级 LogicStep 集成


// 具有全面统计的完整生产工作流
public class ProductionSequence : LogicStep
{
    [Header("Statistics Components")]
    public StatCycleTime cycleTimer;
    public StatStates stateTracker;
    public StatOutput outputCounter;
    
    protected override void OnStarted()
    {
        // 初始化生产周期
        cycleTimer?.StartCycle();
        stateTracker?.State("Moving");
        
        // 执行生产步骤
        ExecuteProductionSequence();
    }
    
    private void ExecuteProductionSequence()
    {
        // 此处放置生产逻辑
        
        // 完成周期
        OnProductionComplete();
    }
    
    private void OnProductionComplete()
    {
        cycleTimer?.EndCycle();
        outputCounter?.IncrementCount();
        stateTracker?.State("Waiting");
        
        NextStep();
    }
}

自定义统计管理器


// 集中统计管理
public class ProductionStatsManager : MonoBehaviour
{
    [Header("Statistics References")]
    public StatController controller;
    public StatCycleTime[] stationTimers;
    public StatOutput[] stationOutputs;
    
    public void ResetAllStatistics()
    {
        controller.ResetStatistics();
    }
    
    public void GetProductionSummary()
    {
        float totalOutput = 0;
        foreach (var output in stationOutputs)
        {
            totalOutput += output.TotalCount;
        }
        
        Debug.Log($"Total Production: {totalOutput} parts");
    }
}

显示自定义

自定义显示布局


// 程序化显示配置
public class CustomStatDisplay : MonoBehaviour
{
    public StatDisplayOutput display;
    
    void Start()
    {
        ConfigureDisplay();
    }
    
    void ConfigureDisplay()
    {
        // 自定义显示外观
        display.Background.color = Color.black;
        display.Padding = new Vector2(15, 15);
        
        // 添加自定义格式
        display.ShowDecimalPlaces = 1;
    }
}

故障排除

统计数据不更新

症状:显示显示静态值、零或过时信息

常见原因和解决方案

缺失组件引用

  • 检查所有 StatDisplay 组件的脚本引用是否正确分配
  • 验证 StatController 能否在场景中找到并管理统计组件
  • 确保包含统计组件的游戏对象处于活动状态

时序配置问题

  • 验证 StatController 重置间隔是否符合您的分析需求
  • 检查自动重置是否过于频繁清除数据
  • 确保生产事件确实触发了统计更新

集成问题

  • 确认 LogicStep 组件正确调用了统计方法
  • 验证 API 调用如 IncrementCount()StartCycle() 是否被执行
  • 检查 Unity 控制台是否有统计组件错误消息

周期时间不准确

症状:周期时间测量不反映实际生产时序

诊断步骤

  1. 验证周期边界

   // 确保 StartCycle() 和 EndCycle() 在正确的时间调用
   Debug.Log($"Starting cycle at: {Time.time}");
   cycleTimer.StartCycle();

   // ... 生产逻辑 ...

   Debug.Log($"Ending cycle at: {Time.time}");
   cycleTimer.EndCycle();
  1. 检查时序冲突
    • 多个组件同时调用周期方法
    • 重置操作中断活动周期测量
    • LogicStep 时序与手动周期控制冲突
    • 检查重置设置
    • StatController 重置间隔对于完成周期测量来说太短
    • 活动生产周期期间的手动重置

显示格式问题

症状:统计数据格式、位置不正确或难以辨认

视觉显示问题

  • 文本重叠:增加 StatDisplayOutput 中的内边距值
  • 背景问题:验证 UI Image 组件已分配且正确配置
  • 布局问题:检查 Canvas 缩放和 StatDisplayOutput 定位
  • 缺失统计:确保 StatDisplayOutput 数组包含所有所需的显示元素

UI 集成问题

  • Canvas 设置:验证 UI Canvas 是否正确配置为您的显示方法
  • TextMeshPro 配置:检查字体、大小和颜色设置
  • Z 轴排序:确保统计数据显示在其他 UI 元素之上

性能问题

症状:统计激活时帧率下降或卡顿

优化解决方案

降低更新频率

  • 增加 StatController 重置间隔以减少计算频率
  • 在大型场景中使用更少的并发统计组件
  • 考虑为不同生产区域使用单独的 StatController

显示优化

  • 限制显示中显示的小数位数
  • 对动态统计显示使用对象池
  • 在不需要时禁用统计可视化

集成调试

症状:统计在隔离中工作但在完整仿真中失败

系统集成检查

  1. 组件依赖

   // 验证所有必需组件是否存在
   if (cycleTimer == null) Debug.LogError("Missing StatCycleTime component");
   if (stateTracker == null) Debug.LogError("Missing StatStates component");
  1. 事件时序
    • 确保统计事件按正确顺序发生
    • 检查复杂自动化序列中的竞态条件
    • 验证 LogicStep 执行顺序与统计没有冲突
    • 多场景问题
    • StatDisplay 组件可能不会跨场景加载持久存在
    • 重新加载场景时统计引用可能断裂
    • 考虑使用 DontDestroyOnLoad() 实现持久统计
⚠️

性能提示:在具有许多统计组件的大型仿真中,考虑为不同生产区域使用单独的 StatController,以优化性能并逻辑地组织统计。

另请参见


© 2025 realvirtual GmbH https://realvirtual.io - 保留所有权利。未经出版商事先书面许可,不得以任何形式或任何方式(包括打印、保存、影印、录制或其他电子或机械方法)复制、分发或传播本出版物的任何部分。