public void Start()
    {
        SimpleAnimator animator = this.gameObject.AddComponent <SimpleAnimator>();
        ECS_Provider   provider = this.GetComponent <ECS_Provider>();

        animator.InitData(provider);
        animator.PlayAnim(0);
    }
    public void InitData(ECS_Provider pSkin)
    {
        m_subPartMF              = new MeshFilter[pSkin.AttachDatas.Length];
        m_subPartRenderer        = new Renderer[pSkin.AttachDatas.Length];
        m_subPartMaterial        = new Material[pSkin.AttachDatas.Length];
        InstancingTexFrameOffset = new int[pSkin.AnimNames.Length][];
        InstancingSmrCount       = new int[pSkin.AttachDatas.Length];
        InstancingData           = new Vector4[pSkin.AttachDatas.Length];

        for (int i = 0; i < pSkin.AttachDatas.Length; i++)
        {
            GameObject attach = new GameObject(i.ToString(), typeof(MeshFilter), typeof(MeshRenderer));
            attach.transform.parent        = this.transform;
            attach.transform.localPosition = Vector3.zero;

            Renderer   renderer = attach.GetComponent <MeshRenderer>();
            MeshFilter mf       = attach.GetComponent <MeshFilter>();
            Material   mat      = pSkin.AttachDatas[i].DrawMaterial;

            mf.sharedMesh           = pSkin.AttachDatas[i].LODMesh[0];
            renderer.sharedMaterial = mat;

            m_subPartRenderer[i] = renderer;
            m_subPartMF[i]       = mf;
            m_subPartMaterial[i] = mat;

            Texture2D animTex = pSkin.AttachDatas[i].AnimTexture;
            if (animTex)
            {
                InstancingData[i] = new Vector4(animTex.width, animTex.height, 0, Mathf.Min(1.0f / animTex.width, 1.0f / animTex.height));
            }

            mat.DisableKeyword("_ECS_ON");

            InstancingSmrCount[i]       = pSkin.AttachDatas[i].SMRCount;
            InstancingTexFrameOffset[i] = new int[pSkin.AnimNames.Length];
            int numPixels = 0;
            for (int j = 0; j < pSkin.AnimNames.Length; j++)
            {
                string animName          = pSkin.AnimNames[j];
                int    frameCount        = pSkin.AnimFrameCount[j];
                int    curAnimPixelStart = numPixels;
                numPixels += frameCount * pSkin.AttachDatas[i].SMRCount * 2;
                InstancingTexFrameOffset[i][j] = curAnimPixelStart;
            }

            m_Provider    = pSkin;
            m_playAnimIdx = -1;
            m_block       = new MaterialPropertyBlock();
            m_hasInited   = true;
        }
    }
        void GeneratorAttach(ref ECS_AnimatorSpawner spawnerData, EntityManager dstManager)
        {
            ECS_Provider provider = Prefab.GetComponent <ECS_Provider>();

            spawnerData.AttachCount = provider.AttachDatas.Length;

            List <Entity> LODList = new List <Entity>();

            for (int attach = 0; attach < spawnerData.AttachCount; attach++)
            {
                AttachData attachData = provider.AttachDatas[attach];
                GeneratorLOD(ref spawnerData, dstManager, LODList, attach, attachData);
            }

            spawnerData.AttachLOD = GeneratorEntityArr(LODList.ToArray());
        }
        void FillEntityWithAnimatorComponent(Entity entity, EntityManager dstManager, ECS_Provider provider)
        {
            List <int>    attachSmrCount = new List <int>();
            List <float3> attachTexData  = new List <float3>();
            List <float4> frameData      = new List <float4>();

            //动画帧间隔
            int[] frameOffsetArr = new int[provider.AnimNames.Length * provider.AttachDatas.Length];

            Dictionary <int, Material> needCreateNewMatDict = new Dictionary <int, Material>();

            for (int attach = 0; attach < provider.AttachDatas.Length; attach++)
            {
                Texture2D animTex = provider.AttachDatas[attach].AnimTexture;

                if (null != animTex)
                {
                    attachSmrCount.Add(provider.AttachDatas[attach].SMRCount);
                    attachTexData.Add(new float3(animTex.width, animTex.height, math.min(1.0f / animTex.width, 1.0f / animTex.height)));
                    frameData.Add(new float4());

                    int numPixels = 0;
                    for (int i = 0; i < provider.AnimNames.Length; i++)
                    {
                        int frameCount        = provider.AnimFrameCount[i];
                        int curAnimPixelStart = numPixels;
                        numPixels += frameCount * provider.AttachDatas[attach].SMRCount * 2;
                        frameOffsetArr[(attach * provider.AnimNames.Length) + i] = curAnimPixelStart;
                    }

                    Material m = provider.AttachDatas[attach].DrawMaterial;
                    m.SetTexture("_AnimTex", animTex);
                    m.EnableKeyword("_ECS_ON");
                }
                else
                {
                    Debug.LogErrorFormat("Missing InstancingAnimTex" + (provider as MonoBehaviour).name);
                }
            }

            var animData = default(AnimationData);

            animData.AnimationIndex          = 0;
            animData.StartTime               = 0;
            animData.AnimCount               = provider.AnimNames.Length;
            animData.AnimationFrameOffsetArr = GeneratorIntArr(frameOffsetArr);
            animData.AnimationFrameCountArr  = GeneratorIntArr(provider.AnimFrameCount);
            animData.FPS               = 1.0f / 30.0f;
            animData.AttachCount       = provider.AttachDatas.Length;
            animData.AttachSmrCountArr = GeneratorIntArr(attachSmrCount.ToArray());
            animData.AttachTexDataArr  = GeneratorFloat3Arr(attachTexData.ToArray());

            dstManager.AddComponentData(entity, animData);

            var animator = new ECS_SkinnedMatrixAnimator();

            dstManager.AddSharedComponentData(entity, animator);
        }
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            ECS_Provider provider = this.GetComponent <ECS_Provider>();

            FillEntityWithAnimatorComponent(entity, dstManager, provider);
        }