使用MediapipeUnityPlugins获取手部追踪关键点遇代码报错求助
解决MediapipeUnityPlugins中PoseTrackingGraph事件绑定的报错问题
错误原因分析
- CS0079错误:
PoseTrackingGraph.OnPoseLandmarksOutput是标准.NET事件,并非Unity的UnityEvent,因此不能使用Unity的AddListener方法,必须用+=运算符绑定事件处理器。 - CS0123错误:该事件对应的委托类型是
EventHandler<OutputEventArgs<NormalizedLandmarkList>>,要求回调方法必须包含两个参数:object sender(事件触发源)和OutputEventArgs<NormalizedLandmarkList> args(携带输出数据的参数),原方法签名不匹配导致报错。
修正后的完整代码
using UnityEngine; using Mediapipe.Unity.PoseTracking; using Mediapipe; using System; public class LandmarkProcessor : MonoBehaviour { public GameObject poseTrackingPrefab; private PoseTrackingGraph poseTrackingGraph; void Start() { poseTrackingGraph = poseTrackingPrefab.GetComponent<PoseTrackingGraph>(); // 用+=绑定符合委托签名的事件处理器 poseTrackingGraph.OnPoseLandmarksOutput += OnPoseLandmarksReceived; } // 严格匹配EventHandler<OutputEventArgs<NormalizedLandmarkList>>的委托签名 void OnPoseLandmarksReceived(object sender, OutputEventArgs<NormalizedLandmarkList> args) { NormalizedLandmarkList landmarkList = args.Value; if (landmarkList == null) return; Debug.Log($"获取到{landmarkList.Landmark.Count}个姿态关键点"); // 遍历并处理每个关键点坐标 for (int i = 0; i < landmarkList.Landmark.Count; i++) { var landmark = landmarkList.Landmark[i]; Debug.Log($"关键点[{i}]:X={landmark.X:F3}, Y={landmark.Y:F3}, Z={landmark.Z:F3}"); } } void OnDestroy() { // 对象销毁时解绑事件,避免内存泄漏 if (poseTrackingGraph != null) { poseTrackingGraph.OnPoseLandmarksOutput -= OnPoseLandmarksReceived; } } }
关键注意事项
- 必须导入
System命名空间,因为EventHandler<T>委托定义在此命名空间下。 - 需通过
args.Value获取实际的关键点数据,不能直接将NormalizedLandmarkList作为回调参数。 - 务必在
OnDestroy中解绑事件,防止对象销毁后事件触发引发空引用异常。
内容的提问来源于stack exchange,提问作者0x5916
相关产品推荐
相关产品推荐

