public void Process(Component @object) { var label = (UILabel)@object; // 图片字体! 打包字 if (label.bitmapFont != null) { string uiFontPath = KDepBuild_NGUI.BuildUIFont(label.bitmapFont); //CResourceDependencies.Create(label, CResourceDependencyType.BITMAP_FONT, uiFontPath); KAssetDep.Create <KBitmapFontDep>(label, uiFontPath); label.bitmapFont = null; } else if (label.trueTypeFont != null) { string fontPath = KDependencyBuild.BuildFont(label.trueTypeFont); //CResourceDependencies.Create(label, CResourceDependencyType.FONT, fontPath); KAssetDep.Create <KUILabelDep>(label, fontPath); label.trueTypeFont = null; // 挖空依赖的数据 } else { Logger.LogWarning("找不到Label的字体: {0}, 场景: {1}", label.name, EditorApplication.currentScene); } }
public void Process(Component @object) { var image = @object as Image; if (image.sprite != null) { string spritePath = KDepBuild_UGUI.BuildSprite(image.sprite); KAssetDep.Create <KImageDep>(image, spritePath); image.sprite = null; } }
public void Process(Component @object) { var text = @object as Text; if (text.font != null) { var fontPath = KDependencyBuild.BuildFont(text.font); KAssetDep.Create <KTextDep>(text, fontPath); text.font = null; // 挖空依赖的数据 } else { Logger.LogWarning("UISprite null Atlas: {0}", text.name); }; }
public void Process(Component @object) { var renderer = @object as SpriteRenderer; if (renderer.sprite != null) { var spritePath = KDepBuild_UGUI.BuildSprite(renderer.sprite); KAssetDep.Create <KSpriteRendererDep>(renderer, spritePath); renderer.sprite = null; // 挖空依赖的数据 } else { Logger.LogWarning("SpriteRenderer null sprite: {0}", renderer.name); } }
public void Process(Component @object) { var audioSource = @object as AudioSource; if (audioSource.clip != null) { string audioPath = BuildAudioClip(audioSource.clip); KAssetDep.Create <KAudioSourceDep>(audioSource, audioPath); audioSource.clip = null; } else { Logger.LogWarning("找不到AudioClip在AudioSource... {0}", audioSource.name); } }
public void Process(Component @object) { var sprite = (UISprite)@object; if (sprite.atlas != null) { string atlasPath = KDepBuild_NGUI.BuildUIAtlas(sprite.atlas); //CResourceDependencies.Create(sprite, CResourceDependencyType.UI_SPRITE, atlasPath); KAssetDep.Create <KUISpriteDep>(sprite, atlasPath); sprite.atlas = null; } else { Logger.LogWarning("UISprite null Atlas: {0}, Scene: {1}", sprite.name, EditorApplication.currentScene); } }
public void OnLoadedDepCallback(KAssetDep assetDep, UnityEngine.Object obj) { count--; // AssetDeps.Remove(assetDep); //if UNITY_EDITOR //if (Application.isEditor) // Log.Assert(count == AssetDeps.Count); //endif if (count <= 0) { if (DepCallback != null) { DepCallback(); } } }
public void Process(Component @object) { var particleCom = (ParticleSystem)@object; var particle = particleCom; if (particle.renderer.sharedMaterial != null) { string matPath = KDepBuild_Material.BuildDepMaterial(particle.renderer.sharedMaterial); //CResourceDependencies.Create(particle, CResourceDependencyType.PARTICLE_SYSTEM, matPath); KAssetDep.Create <KParticleSystemDep>(particle, matPath); particle.renderer.sharedMaterial = null; } else { Logger.LogWarning("没有Material的粒子: {0}", particle.gameObject.name); } }
public void Process(Component @object) { var tex = (UITexture)@object; if (tex.mainTexture != null) { string texPath = KDependencyBuild.BuildDepTexture(tex.mainTexture, 1f); //CResourceDependencies.Create(tex, CResourceDependencyType.UI_TEXTURE, texPath); KAssetDep.Create <KUITextureDep>(tex, texPath); tex.mainTexture = null; // 挖空依赖的数据 // UITexture的有bug,强行缩放有问题的! tex.border *= KResourceModule.TextureScale; } else { //Logger.Log("缺少Texture的UiTexture: {0}", tex.name); } }
static CDepCollectInfo ProcessSkeletonAnimation(SkeletonAnimation sa) { if (sa.skeletonDataAsset == null) { Log.Error("SkeletonAnimation {0}缺少DataAsset,无法打包", sa.gameObject.name); return(null); } else { if (sa.skeletonDataAsset.spriteCollection == null) { Log.Error("SkeletonDataAsset {0}缺少SpriteCollection,无法打包", sa.skeletonDataAsset.name); return(null); } if (sa.skeletonDataAsset.skeletonJSON == null) { Log.Error("SkeletonDataAsset {0}缺少Json,无法打包", sa.skeletonDataAsset.name); return(null); } var spineDataResult = GetBuildSpineData(sa.skeletonDataAsset); // 依赖SpineData //CResourceDependencies.Create(sa, CResourceDependencyType.SPINE_ANIMATION, spineDataPath); spineDataResult.AssetDep = KAssetDep.Create <CSpineAnimationDep>(sa, spineDataResult.Path); sa.skeletonDataAsset = null; // 挖空依赖的数据 // 如果存在MeshFilter和MeshRenderer也挖空... 理论上skeletonDataAsset变空会改变,但这里可能存在对象为disable导致无法自动挖空 var mesh = sa.gameObject.GetComponent <MeshFilter>(); if (mesh != null) { mesh.sharedMesh = null; } var meshRend = sa.gameObject.GetComponent <MeshRenderer>(); if (meshRend != null) { meshRend.sharedMaterial = null; // 挖空 } return(spineDataResult); } }
static void ProcessBaseSprite(tk2dSprite baseSprite) { if (baseSprite.Collection == null) { Log.Error("Null sprite Collection: {0}", baseSprite.gameObject.name); return; } string spriteCollectionPath = BuildSpriteCollection(baseSprite.Collection); if (!string.IsNullOrEmpty(spriteCollectionPath)) { //CResourceDependencies.Create(sprite, CResourceDependencyType.TK2D_SPRITE, spriteCollectionPath); KAssetDep.Create <CTk2dSpriteDep>(baseSprite, spriteCollectionPath); } baseSprite.Collection = null; foreach (Renderer rend in baseSprite.gameObject.GetComponents <Renderer>()) // 挖空材质 { rend.sharedMaterials = new Material[0]; } }
/// <summary> /// NGUI 的字体集 /// </summary> public static string BuildUIFont(UIFont uiFont) { CDepCollectInfo result; if (KDepCollectInfoCaching.HasCache(uiFont)) { result = KDepCollectInfoCaching.GetCache(uiFont); return(result.Path); } if (uiFont.atlas == null) { Logger.LogError("[BuildUIFont]uiFont Null Atlas: {0}, Scene: {1}", uiFont.name, EditorApplication.currentScene); return(""); } string uiFontPrefabPath = AssetDatabase.GetAssetPath(uiFont.gameObject); bool needBuild = KAssetVersionControl.TryCheckNeedBuildWithMeta(uiFontPrefabPath); if (needBuild) { KAssetVersionControl.TryMarkBuildVersion(uiFontPrefabPath); } var copyUIFontObj = GameObject.Instantiate(uiFont.gameObject) as GameObject; var copyUIFont = copyUIFontObj.GetComponent <UIFont>(); var uiAtlas = BuildUIAtlas(copyUIFont.atlas); // 依赖的UI Atlas copyUIFont.atlas = null; // 清空依赖 copyUIFont.material = null; //CResourceDependencies.Create(copyUIFont, CResourceDependencyType.NGUI_UIFONT, uiAtlas); KAssetDep.Create <KUIFontDep>(copyUIFont, uiAtlas); result = KDependencyBuild.DoBuildAssetBundle("UIFont/UIFont_" + uiFont.name, copyUIFontObj, needBuild); GameObject.DestroyImmediate(copyUIFontObj); KDepCollectInfoCaching.SetCache(uiFont, result); return(result.Path); }
/// <summary> /// 不停的检查AssetDep状态是否正常, Editor Only /// </summary> /// <returns></returns> private static IEnumerator CheckErrorUpdate() { while (true) { // const int maxShowCount = 30; LinkedListNode <KAssetDep> depNode = AssetDepsContainer.First; if (depNode == null) { yield return(null); continue; } do { KAssetDep dep = null; try { dep = depNode.Value; } catch { // ignored // prevent exeption when stop editor playing } if (dep != null && dep.IsFinishDependency) { if (dep.DependencyObject == null) { Debug.LogError(string.Format("加载完的依赖对象: {0}, 加载完成对象 {1} 却被销毁", dep.ResourcePath, dep.name), dep); } } yield return(null); } while ((depNode = depNode.Next) != null); } }
// Prefab build, 单次build缓存 public static string BuildSpriteCollection(tk2dSpriteCollectionData data) { if (data == null) { Log.Error("[BuildSpriteColleccion]Null SpriteCol Data!!!"); return(""); } GameObject spriteColPrefab = PrefabUtility.FindPrefabRoot(data.gameObject) as GameObject; Log.Assert(spriteColPrefab); string path = AssetDatabase.GetAssetPath(spriteColPrefab); // prefab只用来获取路径,不打包不挖空 if (string.IsNullOrEmpty(path)) { Log.Info("Null Sprite Collection {0}", path); return(""); // !!! SpriteCollection可能动态生成的,不打包它 } bool needBuild = BuildTools.CheckNeedBuild(path); if (needBuild) { BuildTools.MarkBuildVersion(path); } path = __GetPrefabBuildPath(path); GameObject copySpriteColObj = GameObject.Instantiate(spriteColPrefab) as GameObject; tk2dSpriteCollectionData spriteColData = copySpriteColObj.GetComponent <tk2dSpriteCollectionData>(); foreach (Material mat in spriteColData.materials) // many materials { string matPath = BuildDepMaterial(mat, GameDef.PictureScale); if (!string.IsNullOrEmpty(matPath)) // 材质可能动态创建的,无需打包 //CResourceDependencies.Create(spriteColData, CResourceDependencyType.SPRITE_COLLECTION, matPath); { KAssetDep.Create <CTk2dSpriteCollectionDep>(spriteColData, matPath); } } spriteColData.materials = new Material[0]; // 挖空spriteCollections spriteColData.textures = new Texture[0]; foreach (var def in spriteColData.spriteDefinitions) { def.material = null; // 进行缩放! //if (def.positions != null) //{ // // position! size! // for (var ip = 0; ip < def.positions.Length; ip++) // { // def.positions[ip] = def.positions[ip] / GameDef.PictureScale; // } // for (var ip = 0; ip < def.untrimmedBoundsData.Length; ip++) // { // def.untrimmedBoundsData[ip] = def.untrimmedBoundsData[ip] / GameDef.PictureScale; // } // for (var ip = 0; ip < def.boundsData.Length; ip++) // { // def.boundsData[ip] = def.boundsData[ip] / GameDef.PictureScale; // } //} } var result = DoBuildAssetBundle(DepBuildToFolder + "/Col_" + path, copySpriteColObj, needBuild); // Build主对象, 被挖空Material了的 GameObject.DestroyImmediate(copySpriteColObj); return(result.Path); }
/// <summary> /// 图集 打包结果缓存起来加速 /// </summary> /// <param name="atlas"></param> /// <returns></returns> public static string BuildUIAtlas(UIAtlas atlas) { CDepCollectInfo result; // 使用缓存,确保Atlas不会重复处理,浪费性能 if (KDepCollectInfoCaching.HasCache(atlas)) { result = KDepCollectInfoCaching.GetCache(atlas); return(result.Path); } var scale = 1f; // TODO: scale read GameObject atlasPrefab = PrefabUtility.FindPrefabRoot(atlas.gameObject) as GameObject; Logger.Assert(atlasPrefab); string path = AssetDatabase.GetAssetPath(atlasPrefab); // prefab只用来获取路径,不打包不挖空 bool needBuild = KAssetVersionControl.TryCheckNeedBuildWithMeta(path); if (needBuild) { KAssetVersionControl.TryMarkBuildVersion(path); } Logger.Assert(path); path = KDependencyBuild.__GetPrefabBuildPath(path); GameObject copyAtlasObj = GameObject.Instantiate(atlasPrefab) as GameObject; UIAtlas copyAtlas = copyAtlasObj.GetComponent <UIAtlas>(); if (BeforeBuildUIAtlasFilter != null) { BeforeBuildUIAtlasFilter(copyAtlas); } Material cacheMat = copyAtlas.spriteMaterial; string matPath = KDepBuild_Material.BuildDepMaterial(cacheMat, scale); // 缩放 // 缩放 copyAtlas.pixelSize = 1 / PictureScale; foreach (var spriteData in copyAtlas.spriteList) { spriteData.x = Mathf.FloorToInt(spriteData.x * PictureScale); spriteData.y = Mathf.FloorToInt(spriteData.y * PictureScale); spriteData.width = Mathf.FloorToInt(spriteData.width * PictureScale); spriteData.height = Mathf.FloorToInt(spriteData.height * PictureScale); spriteData.borderLeft = Mathf.FloorToInt(spriteData.borderLeft * PictureScale); spriteData.borderRight = Mathf.FloorToInt(spriteData.borderRight * PictureScale); spriteData.borderTop = Mathf.FloorToInt(spriteData.borderTop * PictureScale); spriteData.borderBottom = Mathf.FloorToInt(spriteData.borderBottom * PictureScale); // padding 不变, ngui bug spriteData.paddingBottom = Mathf.FloorToInt(spriteData.paddingBottom * PictureScale); spriteData.paddingTop = Mathf.FloorToInt(spriteData.paddingTop * PictureScale); spriteData.paddingLeft = Mathf.FloorToInt(spriteData.paddingLeft * PictureScale); spriteData.paddingRight = Mathf.FloorToInt(spriteData.paddingRight * PictureScale); } KAssetDep.Create <KUIAtlasDep>(copyAtlas, matPath); copyAtlas.spriteMaterial = null; // 挖空atlas result = KDependencyBuild.DoBuildAssetBundle("UIAtlas/UIAtlas_" + path, copyAtlasObj, needBuild); // Build主对象, 被挖空Material了的 if (AfterBuildUIAtlasFilter != null) { AfterBuildUIAtlasFilter(copyAtlas); } GameObject.DestroyImmediate(copyAtlasObj); KDepCollectInfoCaching.SetCache(atlas, result); return(result.Path); }