Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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;
            }
        }
    }