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); } } }
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); }