首页 > 解决方案 > AR Foundation - TrackedPoseDriver 组件未缓存在更新循环中

问题描述

下面的片段引用自 ARFoundation 包 2.0.0-preview.22 中的 ARSessionOrigin.cs

#if !UNITY_WEBGL
        Pose GetCameraOriginPose()
        {
            var trackedPoseDriver = camera.GetComponent<TrackedPoseDriver>();
            if (trackedPoseDriver != null)
            {
                var localOriginPose = trackedPoseDriver.originPose;
                var parent = camera.transform.parent;

                if (parent == null)
                    return localOriginPose;

                return parent.TransformPose(localOriginPose);
            }

            return Pose.identity;
        }

        void Update()
        {
            if (camera != null)
            {
                // Make sure the trackables has the same local transform as the camera's origin
                var pose = GetCameraOriginPose();
                trackablesParent.position = pose.position;
                trackablesParent.rotation = pose.rotation;
            }
        }
#endif

显然GetComponent每个更新循环都会调用以更新相机姿势。为什么不将组件缓存为字段值?如果有人告诉我确切的原因,那就太好了。

标签: c#unity3d

解决方案


通过添加私有字段并引用 Awake 或 Start 方法中的值来缓存组件,对我来说多次引用同一个组件是没有意义的。

private TrackedPoseDriver _trackedPoseDriver;

private void Start()
{
    _trackedPoseDriver = camera.GetComponent<TrackedPoseDriver>();
}

推荐阅读