private static ReferenceFile GetSceneReference(string scenePath, PropertyFilter filter,
                                                       bool containsEmpty = false)
        {
            var scene            = UnityApi.MakeSureSceneOpened(scenePath);
            var referenceObjects = scene.GetRootGameObjects()
                                   .SelectMany(go => UnityApi.GetAllComponentsInChildren(go)
                                               .Select(t => t.component == null
                        ? containsEmpty
                            ? ReferenceObject.EmptyComponent(
                                                           UnityApi.GetTransformPath(t.gameObject))
                            : null
                        : GetReferenceObject(t.component, filter, true))
                                               .Append(go == null
                        ? containsEmpty
                            ? ReferenceObject.EmptyGameObject
                            : null
                        : GetReferenceObject(go, filter, true))
                                               )
                                   .Where(refObj => refObj != null)
                                   .ToArray();

            return(referenceObjects.Length > 0
                ? new ReferenceFile {
                ReferenceFilePath = scenePath,
                ReferenceObjects = referenceObjects,
            }
                : null);
        }
        private static ReferenceFile GetResourceReference(string path,
                                                          PropertyFilter filter, bool containsEmpty = false)
        {
            // AssetDatabase.LoadAllAssetsAtPath(path) can not find parent object
            var obj = AssetDatabase.LoadAssetAtPath <Object>(path);

            ReferenceObject[] referenceObjects = null;
            if (obj == null)
            {
                if (containsEmpty)
                {
                    referenceObjects = new[] { ReferenceObject.Empty };
                }
            }
            else if (obj is GameObject go)
            {
                referenceObjects = UnityApi.GetAllComponentsInChildren(go)
                                   .Select(t => t.component == null
                        ? containsEmpty
                            ? ReferenceObject.EmptyComponent(
                                               UnityApi.GetTransformPath(t.gameObject))
                            : null
                        : GetReferenceObject(t.component, filter))
                                   .Where(refObj => refObj != null)
                                   .ToArray();
            }
            else
            {
                referenceObjects = AssetDatabase.LoadAllAssetsAtPath(path)
                                   .Select(t => t == null
                        ? containsEmpty ? ReferenceObject.Empty : null
                        : GetReferenceObject(t, filter))
                                   .Where(refObj => refObj != null)
                                   .ToArray();
            }
            return(referenceObjects?.Length > 0
                ? new ReferenceFile {
                ReferenceFilePath = path,
                ReferenceObjects = referenceObjects,
            }
                : null);
        }