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

Unity MARS人体追踪丢失时无法禁用游戏对象问题求助

Unity MARS人体追踪丢失时无法禁用对象的问题修复

你的代码存在两个关键问题,导致人体追踪丢失时无法禁用球体对象:

  1. 未订阅人体移除事件:仅在OnEnable中订阅了人体添加的回调,没有订阅人体移除的回调,所以追踪丢失时OnBodyRemoved永远不会被触发。
  2. 取消订阅方法调用错误:OnDisable中错误地使用UnsubscribeBodyAdded来取消OnBodyRemoved的订阅,方法与回调不匹配,同时也遗漏了对OnBodyAdded的取消订阅。

修正后的完整代码如下:

using System;
using System.Collections.Generic;
using Unity.MARS.Data;
using Unity.MARS.Providers;
using Unity.XRTools.ModuleLoader;
using UnityEngine;
using UnityEngine.UI;

public class BodyTrackManager : MonoBehaviour, IUsesMarsBodyTracking, IUsesFunctionalityInjection
{
    IProvidesMarsBodyTracking IFunctionalitySubscriber<IProvidesMarsBodyTracking>.provider { get; set; }
    IProvidesFunctionalityInjection IFunctionalitySubscriber<IProvidesFunctionalityInjection>.provider { get; set; }

    [SerializeField] GameObject testObject;

    void Awake()
    {
        this.EnsureFunctionalityInjected();
    }

    private void OnEnable()
    {
        this.SubscribeBodyAdded(OnBodyAdded);
        // 添加人体移除事件的订阅
        this.SubscribeBodyRemoved(OnBodyRemoved);
    }

    void OnDisable()
    {
        // 对应取消人体添加事件的订阅
        this.UnsubscribeBodyAdded(OnBodyAdded);
        // 对应取消人体移除事件的订阅
        this.UnsubscribeBodyRemoved(OnBodyRemoved);
    }

    void OnBodyAdded(IMarsBody body)
    {
        testObject.SetActive(true);
    }

    void OnBodyRemoved(IMarsBody body)
    {
        testObject.SetActive(false);
    }
}

关键修改说明:

  • 在OnEnable方法中新增this.SubscribeBodyRemoved(OnBodyRemoved);,确保人体移除事件能触发对应的回调。
  • 在OnDisable方法中,分别调用UnsubscribeBodyAdded和UnsubscribeBodyRemoved来取消对应的事件订阅,保证方法与回调一一对应,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Omkar P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:31:21