private Vector4 GetSpriteModeUv(int index, float frameProgress) { var textureSheetAnimationFrames = GetTextureSheetAnimationFrames(); var startFrame = GetTextureSheetAnimationStartFrame(index); var frame = Mathf.RoundToInt(frameProgress * textureSheetAnimationFrames); frame = Mathf.Clamp(startFrame + frame, 0, textureSheetAnimationFrames - 1); var sprite = textureSheetAnimation.GetSprite(frame); var textureSize = new Vector2(sprite.texture.width, sprite.texture.height); var textureRect = sprite.textureRect; var result = new Vector4() { x = textureRect.xMin / textureSize.x, y = textureRect.yMin / textureSize.y, z = textureRect.xMax / textureSize.x, w = textureRect.yMax / textureSize.y }; textureSheetAnimationCurrentFrame = frame; return(result); }
public override void GetDepsFrom(object obj, GetDepsFromContext context) { base.GetDepsFrom(obj, context); if (obj == null) { return; } ParticleSystem.TextureSheetAnimationModule o = (ParticleSystem.TextureSheetAnimationModule)obj; for (int i = 0; i < o.spriteCount; ++i) { AddDep(o.GetSprite(i), context); } }
public override void ReadFrom(object obj) { base.ReadFrom(obj); if (obj == null) { return; } ParticleSystem.TextureSheetAnimationModule o = (ParticleSystem.TextureSheetAnimationModule)obj; m_sprites = new TID[o.spriteCount]; for (int i = 0; i < o.spriteCount; ++i) { m_sprites[i] = ToID(o.GetSprite(i)); } }
/// <summary> /// 分析显示相关数据 /// </summary> private void ParseRendererInfo(GameObject go) { // 获取所有的粒子系统组件 _cloneObject.GetComponentsInChildren <ParticleSystem>(true, _allParticles); // 获取所有唯一的材质球 _allMaterials.Clear(); Renderer[] rendererList = go.GetComponentsInChildren <Renderer>(true); foreach (var rd in rendererList) { if (rd.enabled == false) { ParticleSystem ps = rd.gameObject.GetComponent <ParticleSystem>(); if (ps.emission.enabled) { _errors.Add($"{rd.gameObject.name} 粒子系统组件:Renderer未启用,请关闭Emission发射器!"); } } foreach (var mat in rd.sharedMaterials) { if (mat == null) { if (rd.enabled) { _errors.Add($"{rd.gameObject.name} 粒子系统组件:Renderer已启用,但是缺少材质球!"); } continue; } if (_allMaterials.Contains(mat) == false) { _allMaterials.Add(mat); } } } // 获取所有唯一的纹理 _allTextures.Clear(); foreach (var mat in _allMaterials) { int count = ShaderUtil.GetPropertyCount(mat.shader); for (int i = 0; i < count; i++) { ShaderUtil.ShaderPropertyType propertyType = ShaderUtil.GetPropertyType(mat.shader, i); if (propertyType == ShaderUtil.ShaderPropertyType.TexEnv) { string propertyName = ShaderUtil.GetPropertyName(mat.shader, i); Texture tex = mat.GetTexture(propertyName); if (tex != null) { if (_allTextures.Contains(tex) == false) { _allTextures.Add(tex); } } } } } foreach (var ps in _allParticles) { ParticleSystem.TextureSheetAnimationModule tm = ps.textureSheetAnimation; if (tm.mode == ParticleSystemAnimationMode.Sprites) { for (int i = 0; i < tm.spriteCount; i++) { Sprite sprite = tm.GetSprite(i); if (sprite != null && sprite.texture != null) { if (_allTextures.Contains(sprite.texture) == false) { _allTextures.Add(sprite.texture); } } } } } // 获取所有唯一的网格 _allMeshs.Clear(); MeshFilter[] list1 = go.GetComponentsInChildren <MeshFilter>(); foreach (var meshFilter in list1) { if (meshFilter.sharedMesh != null) { if (_allMeshs.Contains(meshFilter.sharedMesh) == false) { _allMeshs.Add(meshFilter.sharedMesh); } } } SkinnedMeshRenderer[] list2 = go.GetComponentsInChildren <SkinnedMeshRenderer>(); foreach (var skinMesh in list2) { if (skinMesh.sharedMesh != null) { if (_allMeshs.Contains(skinMesh.sharedMesh) == false) { _allMeshs.Add(skinMesh.sharedMesh); } } } foreach (var ps in _allParticles) { var psr = ps.GetComponent <ParticleSystemRenderer>(); if (psr != null && psr.renderMode == ParticleSystemRenderMode.Mesh) { if (psr.mesh != null) { if (_allMeshs.Contains(psr.mesh) == false) { _allMeshs.Add(psr.mesh); } } } } // 计算材质数量 MaterialCount = _allMaterials.Count; // 计算纹理数量和所需内存大小 TextureCount = _allTextures.Count; TextureMemory = 0; foreach (var tex in _allTextures) { TextureMemory += GetStorageMemorySize(tex); } // 计算特效生命周期 CurveSampleTime = 1f; foreach (var ps in _allParticles) { float playingTime = ps.main.duration; float delayTime = GetMaxTime(ps.main.startDelay); float lifeTime = GetMaxTime(ps.main.startLifetime); if ((delayTime + lifeTime) > playingTime) { playingTime = delayTime + lifeTime; } if (playingTime > CurveSampleTime) { CurveSampleTime = playingTime; } } }