Unity MARS人体追踪丢失时无法禁用游戏对象问题求助
Unity MARS人体追踪丢失时无法禁用对象的问题修复
你的代码存在两个关键问题,导致人体追踪丢失时无法禁用球体对象:
- 未订阅人体移除事件:仅在
OnEnable中订阅了人体添加的回调,没有订阅人体移除的回调,所以追踪丢失时OnBodyRemoved永远不会被触发。 - 取消订阅方法调用错误:
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
相关产品推荐
相关产品推荐

