private Material[] GetSourceMaterials(KitbashSourceConfig config)
 {
     Material[] result = new Material[config.Materials.Length];
     for (int i = 0; i < config.Materials.Length; i++)
     {
         result[i] = (Material)PrefabManager.Cache.GetPrefab(typeof(Material), config.Materials[i]);
     }
     return(result);
 }
        private bool Kitbash(GameObject kitbashedPrefab, KitbashSourceConfig config)
        {
            // Try to load a custom prefab
            GameObject sourcePrefab = PrefabManager.Instance.GetPrefab(config.SourcePrefab);

            // If no prefab is found, warn and return
            if (!sourcePrefab)
            {
                Logger.LogWarning($"No prefab found for {config}");
                return(false);
            }
            GameObject sourceGameObject = sourcePrefab.transform.Find(config.SourcePath).gameObject;

            Transform parentTransform = config.TargetParentPath != null?kitbashedPrefab.transform.Find(config.TargetParentPath) : kitbashedPrefab.transform;

            if (parentTransform == null)
            {
                Logger.LogWarning($"Target parent not found for {config}");
                return(false);
            }
            GameObject kitbashObject = Object.Instantiate(sourceGameObject, parentTransform);

            kitbashObject.name = config.Name ?? sourceGameObject.name;
            kitbashObject.transform.localPosition = config.Position;
            kitbashObject.transform.localRotation = config.Rotation;
            kitbashObject.transform.localScale    = config.Scale;

            if (config.Materials != null)
            {
                Material[] sourceMaterials = GetSourceMaterials(config);

                if (sourceMaterials == null)
                {
                    Logger.LogWarning($"No materials found for {config}");
                    return(false);
                }

                SkinnedMeshRenderer[] targetSkinnedMeshRenderers = kitbashObject.GetComponentsInChildren <SkinnedMeshRenderer>();

                foreach (SkinnedMeshRenderer targetSkinnedMeshRenderer in targetSkinnedMeshRenderers)
                {
                    targetSkinnedMeshRenderer.sharedMaterials = sourceMaterials;
                    targetSkinnedMeshRenderer.materials       = sourceMaterials;
                }

                MeshRenderer[] targetMeshRenderers = kitbashObject.GetComponentsInChildren <MeshRenderer>();
                foreach (MeshRenderer targetMeshRenderer in targetMeshRenderers)
                {
                    targetMeshRenderer.sharedMaterials = sourceMaterials;
                    targetMeshRenderer.materials       = sourceMaterials;
                }
            }
            return(true);
        }