コード例 #1
0
        void CreateAssetBundleCommand(string bundleName, string internalName, List <GUID> assets)
        {
            var abOp = new AssetBundleWriteOperation();

            var fileObjects = m_WriteData.FileToObjects[internalName];

            abOp.Command = CreateWriteCommand(internalName, fileObjects, m_PackingMethod);

            abOp.UsageSet = new BuildUsageTagSet();
            m_WriteData.FileToUsageSet.Add(internalName, abOp.UsageSet);

            abOp.ReferenceMap = new BuildReferenceMap();
            abOp.ReferenceMap.AddMappings(internalName, abOp.Command.serializeObjects.ToArray());
            m_WriteData.FileToReferenceMap.Add(internalName, abOp.ReferenceMap);

            {
                abOp.Info              = new AssetBundleInfo();
                abOp.Info.bundleName   = bundleName;
                abOp.Info.bundleAssets = assets.Select(x => m_DependencyData.AssetInfo[x]).ToList();
                abOp.Info.bundleAssets.Sort(AssetLoadInfoCompare);
                foreach (var loadInfo in abOp.Info.bundleAssets)
                {
                    loadInfo.address = m_BuildContent.Addresses[loadInfo.asset];
                }
            }

            m_WriteData.WriteOperations.Add(abOp);
        }
        public void OneTimeSetUp()
        {
            WriteOperations    = new IWriteOperation[5];
            WriteOperations[0] = new AssetBundleWriteOperation();
#pragma warning disable CS0618 // Type or member is obsolete
            WriteOperations[1] = new RawWriteOperation();
#pragma warning restore CS0618 // Type or member is obsolete
            WriteOperations[2] = new SceneBundleWriteOperation();
            WriteOperations[3] = new SceneDataWriteOperation();
#pragma warning disable CS0618 // Type or member is obsolete
            WriteOperations[4] = new SceneRawWriteOperation();
#pragma warning restore CS0618 // Type or member is obsolete

            var command = new WriteCommand
            {
                fileName     = GUID.Generate().ToString(),
                internalName = GUID.Generate().ToString()
            };
            var usageSet     = new BuildUsageTagSet();
            var referenceMap = new BuildReferenceMap();

            for (int i = 0; i < WriteOperations.Length; i++)
            {
                WriteOperations[i].Command      = command;
                WriteOperations[i].UsageSet     = usageSet;
                WriteOperations[i].ReferenceMap = referenceMap;
            }
        }
コード例 #3
0
        private IWriteOperation CreateAssetBundleWriteOperation(string bundleName, List <GUID> assets, BuildDependencyInfo buildInfo)
        {
            var dependencies     = new HashSet <string>();
            var serializeObjects = new HashSet <ObjectIdentifier>();

            var op = new AssetBundleWriteOperation();

            op.command.fileName     = GenerateInternalFileName(bundleName);
            op.command.internalName = string.Format("archive:/{0}/{0}", op.command.fileName);

            op.info.bundleName   = bundleName;
            op.info.bundleAssets = new List <AssetLoadInfo>();
            foreach (var asset in assets)
            {
                AssetLoadInfo assetInfo;
                if (!buildInfo.assetInfo.TryGetValue(asset, out assetInfo))
                {
                    BuildLogger.LogWarning("Could not find info for asset '{0}'.", asset);
                    continue;
                }

                op.info.bundleAssets.Add(assetInfo);

                dependencies.UnionWith(buildInfo.assetToBundles[asset]);
                serializeObjects.UnionWith(assetInfo.includedObjects);
                foreach (var reference in assetInfo.referencedObjects)
                {
                    if (reference.filePath == kUnityDefaultResourcePath)
                    {
                        continue;
                    }

                    if (buildInfo.assetInfo.ContainsKey(reference.guid))
                    {
                        continue;
                    }

                    serializeObjects.Add(reference);
                }
            }
            dependencies.Remove(bundleName); // Don't include self as dependency

            op.info.bundleDependencies  = dependencies.OrderBy(x => x).ToList();
            op.command.dependencies     = op.info.bundleDependencies.Select(x => string.Format("archive:/{0}/{0}", GenerateInternalFileName(x))).ToList();
            op.command.serializeObjects = serializeObjects.Select(x => new SerializationInfo
            {
                serializationObject = x,
                serializationIndex  = SerializationIndexFromObjectIdentifier(x)
            }).ToList();

            return(op);
        }
コード例 #4
0
        void CreateAssetBundleCommand(string bundleName, string internalName, List <GUID> assets)
        {
            var command          = CreateWriteCommand(internalName, m_WriteData.FileToObjects[internalName], m_PackingMethod);
            var usageSet         = new BuildUsageTagSet();
            var referenceMap     = new BuildReferenceMap();
            var dependencyHashes = new List <Hash128>();
            var bundleAssets     = new List <AssetLoadInfo>();


            referenceMap.AddMappings(command.internalName, command.serializeObjects.ToArray());
            foreach (var asset in assets)
            {
                usageSet.UnionWith(m_DependencyData.AssetUsage[asset]);
                if (m_DependencyData.DependencyHash.TryGetValue(asset, out var hash))
                {
                    dependencyHashes.Add(hash);
                }
                AssetLoadInfo assetInfo = m_DependencyData.AssetInfo[asset];
                assetInfo.address = m_BuildContent.Addresses[asset];
                bundleAssets.Add(assetInfo);
            }
            bundleAssets.Sort(AssetLoadInfoCompare);


            var operation = new AssetBundleWriteOperation();

            operation.Command           = command;
            operation.UsageSet          = usageSet;
            operation.ReferenceMap      = referenceMap;
            operation.DependencyHash    = !dependencyHashes.IsNullOrEmpty() ? HashingMethods.Calculate(dependencyHashes).ToHash128() : new Hash128();
            operation.Info              = new AssetBundleInfo();
            operation.Info.bundleName   = bundleName;
            operation.Info.bundleAssets = bundleAssets;


            m_WriteData.WriteOperations.Add(operation);
            m_WriteData.FileToUsageSet.Add(command.internalName, usageSet);
            m_WriteData.FileToReferenceMap.Add(command.internalName, referenceMap);
        }
コード例 #5
0
    /// <summary>
    /// This callback is what remove the unwanted AssetBundle writing operation from being processed with the WriteSerializedFiles
    /// and ArchiveAndCompressBundles taskes
    /// </summary>
    /// <param name="buildParams"></param>
    /// <param name="dependencyData"></param>
    /// <param name="writeData"></param>
    /// <returns></returns>
    private static ReturnCode PostPackingCallback(IBuildParameters buildParams, IDependencyData dependencyData, IWriteData writeData)
    {
        if (includedBundles != null && includedBundles.Count > 0)
        {
            for (int i = writeData.WriteOperations.Count - 1; i >= 0; --i)
            {
                // get the AssetBundle name that the writeOperation is for
                AssetBundleWriteOperation op = writeData.WriteOperations[i] as AssetBundleWriteOperation;
                string bundleName            = null;
                if (op != null)
                {
                    bundleName = op.Info.bundleName;
                }
                else
                {
                    // scene bundles are also different
                    if (writeData.WriteOperations[i] is SceneBundleWriteOperation s_op)
                    {
                        bundleName = s_op.Info.bundleName;
                    }
                    else
                    {
                        Debug.LogError("Unexpected write operation");
                        return(ReturnCode.Error);
                    }
                }

                // if we do not want to build that bundle, remove the write operation from the list
                if (includedBundles.Contains(bundleName) == false)
                {
                    writeData.WriteOperations.RemoveAt(i);
                }
            }
        }

        return(ReturnCode.Success);
    }