public Material Clone(AssetCabinet file, bool cloneTextures) { Component mat = file != this.file ? file.Bundle != null && !file.Bundle.m_IsStreamedSceneAssetBundle ? file.Bundle.FindComponent(m_Name, UnityClassID.Material) : file.Components.Find ( delegate(Component asset) { return(asset.classID() == UnityClassID.Material && (asset is NotLoaded ? ((NotLoaded)asset).Name : ((Material)asset).m_Name) == m_Name); } ) : null; if (mat == null) { file.MergeTypeDefinition(this.file, UnityClassID.Material); mat = new Material(file); if (file.Bundle != null && this.file.Bundle != null) { List <Component> externals = new List <Component>(); AssetBundle.AddExternalAssetsFromPreloadTable(this, this.file.Bundle, externals); for (int i = 0; i < externals.Count; i++) { ExternalAsset ext = (ExternalAsset)externals[i]; string assetPath = this.file.References[ext.FileID - 1].assetPath; int cabPos = assetPath.LastIndexOf("/") + 1; if (!AssetCabinet.LoadedCabinets.ContainsKey(assetPath.Substring(cabPos))) { ext.FileID = file.MergeReference(this.file, ext.FileID); } else { externals.RemoveAt(i--); } } file.Bundle.AddComponent(m_Name, mat, externals); } CopyTo((Material)mat, cloneTextures); } else if (mat is NotLoaded) { NotLoaded notLoaded = (NotLoaded)mat; if (notLoaded.replacement != null) { mat = notLoaded.replacement; } else { mat = file.LoadComponent(file.SourceStream, notLoaded); } } return((Material)mat); }