场景元数据使用示例
适用于医疗培训、分阶段工业演练、博物馆导览以及运行时对象包含/排除的完整 Scene Metadata 设置。
最后更新于
这有帮助吗?
这有帮助吗?
using Convai.Runtime.SceneMetadata;
using UnityEngine;
public class SafetyDrillController : MonoBehaviour
{
[SerializeField] private ConvaiSceneMetadataCollector _metadataCollector;
[SerializeField] private ConvaiObjectMetadata[] _phase1Props;
[SerializeField] private ConvaiObjectMetadata[] _phase2Props;
private ConvaiObjectMetadata[] _allProps;
void Awake()
{
_allProps = GetComponentsInChildren<ConvaiObjectMetadata>(includeInactive: true);
}
public void LoadPhase(int phase)
{
// 排除所有道具
foreach (var prop in _allProps)
prop.IncludeInMetadata = false;
// 仅启用当前阶段的道具
ConvaiObjectMetadata[] activeProps = phase == 1 ? _phase1Props : _phase2Props;
foreach (var prop in activeProps)
prop.IncludeInMetadata = true;
// 发送更新后的有效负载
if (_metadataCollector.IsReadyToSendMetadata())
_metadataCollector.CollectAndSendSceneMetadata();
}
}public void OnHazardCleared(ConvaiObjectMetadata hazardMetadata)
{
// 从 AI 上下文中移除,而不销毁 GameObject
hazardMetadata.IncludeInMetadata = false;
if (_collector.IsReadyToSendMetadata())
_collector.CollectAndSendSceneMetadata();
}public void OnToolDelivered(GameObject toolObject, string toolName, string toolDescription)
{
// 在运行时添加元数据组件
var metadata = toolObject.AddComponent<ConvaiObjectMetadata>();
metadata.ObjectName = toolName;
metadata.ObjectDescription = toolDescription;
// 组件会在 OnEnable 时自动注册
if (_collector.IsReadyToSendMetadata())
_collector.CollectAndSendSceneMetadata();
}