void ProcessVariants(PrefabTextureVariantSchema schema,
                         AddressableAssetGroup group,
                         AddressableAssetsBuildContext context)
    {
        m_SourceGroupList.Add(group);

        var entries = new List <AddressableAssetEntry>(group.entries);

        foreach (var entry in entries)
        {
            entry.SetLabel(schema.DefaultLabel, true, true, false);

            foreach (var variant in schema.Variants)
            {
                entry.SetLabel(variant.Label, true, true, false);
            }
        }
    }
예제 #2
0
    string ProcessVariants(PrefabTextureVariantSchema schema,
                           AddressableAssetGroup group,
                           AddressableAssetsBuildContext context)
    {
        var settings = context.Settings;

        Directory.CreateDirectory(m_BaseDirectory);

        var entries = new List <AddressableAssetEntry>(group.entries);

        foreach (var mainEntry in entries)
        {
            if (AssetDatabase.GetMainAssetTypeAtPath(mainEntry.AssetPath) != typeof(GameObject))
            {
                continue;
            }

            string fileName = Path.GetFileNameWithoutExtension(mainEntry.AssetPath);
            string ext      = Path.GetExtension(mainEntry.AssetPath);
            mainEntry.SetLabel(schema.DefaultLabel, true, true);

            string  mainAssetPath = AssetDatabase.GUIDToAssetPath(mainEntry.guid);
            Hash128 assetHash     = AssetDatabase.GetAssetDependencyHash(mainAssetPath);

            bool assetHashChanged = false;
            if (!m_AssetPathToHashCode.ContainsKey(mainAssetPath))
            {
                m_AssetPathToHashCode.Add(mainAssetPath, assetHash);
            }
            else if (m_AssetPathToHashCode[mainAssetPath] != assetHash)
            {
                assetHashChanged = true;
                m_AssetPathToHashCode[mainAssetPath] = assetHash;
            }

            foreach (var variant in schema.Variants)
            {
                string groupDirectory = Path.Combine(m_BaseDirectory, $"{group.Name}-{Path.GetFileNameWithoutExtension(mainEntry.address)}").Replace('\\', '/');
                m_DirectoriesInUse.Add(groupDirectory);
                var variantGroup = CreateTemporaryGroupCopy($"{group.Name}_VariantGroup_{variant.Label}", group.Schemas, settings);

                string baseVariantDirectory = Path.Combine(groupDirectory, variant.Label).Replace('\\', '/');
                string newPrefabPath        = mainAssetPath.Replace("Assets/", baseVariantDirectory + '/').Replace($"{fileName}{ext}", $"{fileName}_variant_{variant.Label}{ext}");

                string variantDirectory = Path.GetDirectoryName(newPrefabPath).Replace('\\', '/');
                m_DirectoriesInUse.Add(variantDirectory);
                Directory.CreateDirectory(variantDirectory);

                if (assetHashChanged || !File.Exists(newPrefabPath))
                {
                    if (!AssetDatabase.CopyAsset(mainAssetPath, newPrefabPath))
                    {
                        return($"Copying asset from {mainAssetPath} to variant path {newPrefabPath} failed.");
                    }
                }

                var dependencies = AssetDatabase.GetDependencies(newPrefabPath);
                foreach (var dependency in dependencies)
                {
                    if (AssetDatabase.GetMainAssetTypeAtPath(dependency) == typeof(GameObject))
                    {
                        var gameObject = AssetDatabase.LoadAssetAtPath <GameObject>(dependency);
                        foreach (var childRender in gameObject.GetComponentsInChildren <MeshRenderer>())
                        {
                            ConvertToVariant(childRender, variantDirectory, variant, assetHashChanged);
                        }
                    }
                }

                var entry = settings.CreateOrMoveEntry(AssetDatabase.AssetPathToGUID(newPrefabPath), variantGroup, false, false);
                entry.address = mainEntry.address;
                entry.SetLabel(variant.Label, true, true, false);
            }
        }

        if (!schema.IncludeSourcePrefabInBuild)
        {
            group.GetSchema <BundledAssetGroupSchema>().IncludeInBuild = false;
            m_SourceGroupList.Add(group);
        }

        return(string.Empty);
    }