public bool CanRendering(int atlasId)
        {
#if UNITY_EDITOR && !EMOJI_RUNTIME
            if (_unityallAtlases != null)
            {
                for (int i = 0; i < _unityallAtlases.Count; ++i)
                {
                    SpriteAsset asset = _unityallAtlases[i];
                    if (asset.ID == atlasId)
                    {
                        return(true);
                    }
                }
            }

            return(false);
#else
            for (int i = 0; i < _sharedAtlases.Count; ++i)
            {
                SpriteAsset asset = _sharedAtlases[i];
                if (asset.ID == atlasId)
                {
                    return(true);
                }
            }
            return(false);
#endif
        }
        SpriteGraphic FindGraphic(InlineText text, int atlasID, out SpriteAsset matchAsset)
        {
            matchAsset = null;
            for (int i = 0; i < allatlas.Count; ++i)
            {
                SpriteAsset asset = allatlas[i];
                if (asset != null && asset.ID == atlasID)
                {
                    matchAsset = asset;
                    break;
                }
            }

            if (matchAsset && matchAsset.texSource != null)
            {
                List <SpriteGraphic> list   = null;
                SpriteGraphic        target = FindGraphic(text, matchAsset, out list);
                if (!target)
                {
                    target = CreateSpriteRender(text.transform);
                    list.Add(target);
                }
                return(target);
            }
            return(null);
        }
        SpriteGraphic FindGraphic(InlineText text, SpriteAsset matchAsset, out List <SpriteGraphic> list)
        {
            EmojiTools.BeginSample("Emoji_UnitFindGraphic");
            if (textGraphics == null)
            {
                textGraphics = new Dictionary <InlineText, List <SpriteGraphic> >();
            }

            if (!textGraphics.TryGetValue(text, out list))
            {
                list = ListPool <SpriteGraphic> .Get();

                textGraphics[text] = list;
            }

            SpriteGraphic target = null;

            for (int i = 0; i < list.Count; ++i)
            {
                SpriteGraphic graphic = list[i];
                if (graphic && UnityEngine.Object.ReferenceEquals(graphic.mainTexture, matchAsset.texSource))
                {
                    target = graphic;
                    break;
                }
            }
            EmojiTools.EndSample();
            return(target);
        }
 public bool isRendingAtlas(SpriteAsset asset)
 {
     if (allatlas != null)
     {
         return(allatlas.Contains(asset));
     }
     return(false);
 }
        void RefreshSubUIMesh(InlineText text, SpriteGraphic target, SpriteAsset matchAsset, Vector3[] Pos, Vector2[] UV)
        {
            // set mesh
            tempMesh.SetAtlas(matchAsset);
            tempMesh.SetUVLen(UV.Length);
            tempMesh.SetVertLen(Pos.Length);

            for (int i = 0; i < Pos.Length; ++i)
            {
                //text object pos
                Vector3 value    = Pos[i];
                Vector3 worldpos = text.transform.TransformPoint(value);
                Vector3 localpos = target.transform.InverseTransformPoint(worldpos);
                tempMesh.SetVert(i, localpos);
            }

            for (int i = 0; i < UV.Length; ++i)
            {
                Vector2 value = UV[i];
                tempMesh.SetUV(i, value);
            }

            //rendermesh
            UnitMeshInfo currentMesh = null;

            if (!this.renderData.TryGetValue(target, out currentMesh))
            {
                currentMesh        = new UnitMeshInfo();
                renderData[target] = currentMesh;
            }

            if (!currentMesh.Equals(tempMesh))
            {
                if (target.isDirty)
                {
                    currentMesh.AddCopy(tempMesh);
                    tempMesh.Clear();
                }
                else
                {
                    currentMesh.Copy(tempMesh);
                }
            }

            if (currentMesh.VertCnt() > 3 && currentMesh.UVCnt() > 3)
            {
                target.Draw(this);
                target.SetDirtyMask();
                target.SetVerticesDirty();
            }
            else
            {
                target.Draw(null);
                target.SetDirtyMask();
                target.SetVerticesDirty();
            }
        }
 void PreLoad()
 {
     for (int i = 0; i < PreparedAtlas.Count; ++i)
     {
         string      atlasname    = PreparedAtlas[i];
         string      fixname      = System.IO.Path.GetFileNameWithoutExtension(atlasname);
         SpriteAsset _spriteAsset = FindAtlas(fixname);
         PushRenderAtlas(_spriteAsset);
     }
 }
        void OnEnable()
        {
            spriteAsset = (SpriteAsset)target;

            playSpeed = 6;

            Reset();

            EditorApplication.update += UpdateFrame;
        }
Пример #8
0
        public void Copy(UnitMeshInfo mesh)
        {
            atlas = mesh.atlas;

            if (_Vertices.Count < mesh._Vertices.Count)
            {
                for (int i = 0; i < _Vertices.Count; ++i)
                {
                    _Vertices[i] = mesh._Vertices[i];
                }

                for (int i = _Vertices.Count; i < mesh._Vertices.Count; ++i)
                {
                    _Vertices.Add(mesh._Vertices[i]);
                }
            }
            else
            {
                for (int i = 0; i < mesh._Vertices.Count; ++i)
                {
                    _Vertices[i] = mesh._Vertices[i];
                }

                for (int i = _Vertices.Count - 1; i >= mesh._Vertices.Count; --i)
                {
                    _Vertices.RemoveAt(i);
                }
            }


            if (_UV.Count < mesh._UV.Count)
            {
                for (int i = 0; i < _UV.Count; ++i)
                {
                    _UV[i] = mesh._UV[i];
                }

                for (int i = _UV.Count; i < mesh._UV.Count; ++i)
                {
                    _UV.Add(mesh._UV[i]);
                }
            }
            else
            {
                for (int i = 0; i < mesh._UV.Count; ++i)
                {
                    _UV[i] = mesh._UV[i];
                }

                for (int i = _UV.Count - 1; i >= mesh._UV.Count; --i)
                {
                    _UV.RemoveAt(i);
                }
            }
        }
        void MarkDirtyStaticEmoji()
        {
            if (alltexts != null && alltexts.Count > 0)
            {
                if (listeners == null)
                {
                    listeners = new Dictionary <InlineText, ListenerData>();
                }

                for (int i = 0; i < alltexts.Count; ++i)
                {
                    InlineText       text      = alltexts[i];
                    List <IFillData> emojidata = text.PopEmojiData();
                    if (text != null && emojidata != null && emojidata.Count > 0 && allatlas != null && allatlas.Count > 0)
                    {
                        bool         isdirty = false;
                        ListenerData data    = null;
                        if (listeners.TryGetValue(text, out data))
                        {
                            isdirty = data.Dirty(text);
                            if (isdirty)
                            {
                                data.Set(text);
                            }
                        }
                        else
                        {
                            data = new ListenerData();
                            data.Set(text);

                            listeners.Add(text, data);
                        }

                        int staticcnt = 0;
                        for (int j = 0; j < emojidata.Count; ++j)
                        {
                            IFillData       taginfo   = emojidata[j];
                            SpriteAsset     asset     = null;
                            SpriteInfoGroup groupinfo = manager.FindSpriteGroup(taginfo.Tag, out asset);
                            if (groupinfo != null && groupinfo.spritegroups.Count == 1)
                            {
                                staticcnt++;
                            }
                        }

                        if (staticcnt > 0 && isdirty)
                        {
                            this.TryRendering(text);
                        }
                    }
                }
            }
        }
        public void PrepareAtlas(SpriteAsset asset)
        {
            if (allatlas == null)
            {
                allatlas = ListPool <SpriteAsset> .Get();
            }

            if (!allatlas.Contains(asset))
            {
                allatlas.Add(asset);
            }
        }
        public SpriteAsset FindAtlas(string atlasname)
        {
            EmojiTools.BeginSample("FindAtlas");
#if UNITY_EDITOR && !EMOJI_RUNTIME
            SpriteAsset result = null;
            if (_unityallAtlases != null)
            {
                for (int i = 0; i < _unityallAtlases.Count; ++i)
                {
                    SpriteAsset asset = _unityallAtlases[i];
                    if (asset.AssetName.Equals(atlasname))
                    {
                        result = asset;
                        break;
                    }
                }
            }

            if (_lostAssets == null)
            {
                _lostAssets = new List <string>();
            }

            if (!PreparedAtlas.Contains(atlasname))
            {
                if (!_lostAssets.Contains(atlasname))
                {
                    _lostAssets.Add(atlasname);
                }
            }
            EmojiTools.EndSample();
            return(result);
#else
            for (int i = 0; i < _sharedAtlases.Count; ++i)
            {
                SpriteAsset asset = _sharedAtlases[i];
                if (asset.AssetName.Equals(atlasname))
                {
                    EmojiTools.EndSample();
                    return(asset);
                }
            }

            SpriteAsset newasset = InstantiateSpriteAsset(atlasname);
            if (newasset != null)
            {
                _sharedAtlases.Add(newasset);
            }
            EmojiTools.EndSample();
            return(newasset);
#endif
        }
        void RefreshSubUIMesh(InlineText text, CanvasGraphicGroup group, SpriteAsset matchAsset, Vector3[] Pos, Vector2[] UV, List <string> joblist)
        {
            // set mesh
            tempMesh.SetAtlas(matchAsset);
            tempMesh.SetUVLen(UV.Length);
            tempMesh.SetVertLen(Pos.Length);

            SpriteGraphic graphic = group.graphic;

            //think about culling and screen coordinate.......
            for (int i = 0; i < Pos.Length; ++i)
            {
                //text object pos
                Vector3 value    = Pos[i];
                Vector3 worldpos = text.transform.TransformPoint(value);
                Vector3 localpos = group.graphic.transform.InverseTransformPoint(worldpos);
                tempMesh.SetVert(i, localpos);
            }

            for (int i = 0; i < UV.Length; ++i)
            {
                Vector2 value = UV[i];
                tempMesh.SetUV(i, value);
            }

            //rendermesh
            UnitMeshInfo currentMesh = group.mesh;

            if (!currentMesh.Equals(tempMesh))
            {
                if (joblist != null && joblist.Count > 0)
                {
                    currentMesh.AddCopy(tempMesh);
                    tempMesh.Clear();
                }
                else
                {
                    currentMesh.Copy(tempMesh);
                }
            }

            if (currentMesh.VertCnt() > 3 && currentMesh.UVCnt() > 3)
            {
                graphic.Draw(this);
            }
            else
            {
                graphic.Draw(null);
            }

            group.isDirty = true;
        }
        public SpriteInfoGroup FindSpriteGroup(string TagName, out SpriteAsset resultatlas)
        {
            EmojiTools.BeginSample("Emoji_FindSpriteGroup");
#if UNITY_EDITOR && !EMOJI_RUNTIME
            resultatlas = null;
            SpriteInfoGroup result = null;
            if (_unityallAtlases != null)
            {
                for (int i = 0; i < _unityallAtlases.Count; ++i)
                {
                    SpriteAsset asset = _unityallAtlases[i];
                    for (int j = 0; j < asset.listSpriteGroup.Count; ++j)
                    {
                        SpriteInfoGroup group = asset.listSpriteGroup[j];
                        if (group.tag.Equals(TagName))
                        {
                            result      = group;
                            resultatlas = asset;
                            break;
                        }
                    }
                }
            }

            if (_lostAssets == null)
            {
                _lostAssets = new List <string>();
            }

            if (resultatlas != null && !PreparedAtlas.Contains(resultatlas.AssetName))
            {
                if (!_lostAssets.Contains(resultatlas.AssetName))
                {
                    _lostAssets.Add(resultatlas.AssetName);
                }
            }
            EmojiTools.EndSample();
            return(result);
#else
            resultatlas = null;
            SpriteInfoGroup result = null;
            KeyValuePair <SpriteAsset, SpriteInfoGroup> data;
            if (_spritemap.TryGetValue(TagName, out data))
            {
                result      = data.Value;
                resultatlas = data.Key;
            }
            EmojiTools.EndSample();
            return(result);
#endif
        }
        public void PushRenderAtlas(SpriteAsset _spriteAsset)
        {
            EmojiTools.BeginSample("Emoji_PushRenderAtlas");
            if (!isRendering(_spriteAsset) && _spriteAsset != null)
            {
                _render.PrepareAtlas(_spriteAsset);

                if (!_sharedAtlases.Contains(_spriteAsset))
                {
                    _sharedAtlases.Add(_spriteAsset);
                }
            }
            EmojiTools.EndSample();
        }
        Graphic ParsePosAndUV(InlineText text, int ID, Vector3[] Pos, Vector2[] UV, List <string> joblist)
        {
            EmojiTools.BeginSample("Emoji_GroupParsePosAndUV");
            SpriteAsset matchAsset = null;

            for (int i = 0; i < allatlas.Count; ++i)
            {
                SpriteAsset asset = allatlas[i];
                if (asset != null && asset.ID == ID)
                {
                    matchAsset = asset;
                    break;
                }
            }

            if (matchAsset && matchAsset.texSource != null)
            {
                CanvasGraphicGroup group = FindGraphicGroup(text.canvas, matchAsset.ID);
                if (group == null)
                {
                    group         = new CanvasGraphicGroup();
                    group.AtlasID = matchAsset.ID;
                    group.canvas  = text.canvas;
                    group.mesh    = UnitMeshInfoPool.Get();
                    group.isDirty = false;
                    group.graphic = CreateSpriteRender();

                    if (GraphicTasks == null)
                    {
                        GraphicTasks = new List <CanvasGraphicGroup>();
                    }

                    GraphicTasks.Add(group);
                }

                RefreshSubUIMesh(text, group, matchAsset, Pos, UV, joblist);

                EmojiTools.EndSample();
                return(group.graphic);
            }
            else
            {
                Debug.LogErrorFormat("missing {0} atlas", ID);
            }
            EmojiTools.EndSample();
            return(null);
        }
Пример #16
0
        public void AddCopy(UnitMeshInfo mesh)
        {
            if (atlas != null && atlas != mesh.atlas)
            {
                throw new ArgumentException();
            }
            atlas = mesh.atlas;

            for (int i = 0; i < mesh._Vertices.Count; ++i)
            {
                _Vertices.Add(mesh._Vertices[i]);
            }

            for (int i = 0; i < mesh._UV.Count; ++i)
            {
                _UV.Add(mesh._UV[i]);
            }
        }
        public int Init(ref TextCotext context)
        {
#if UNITY_EDITOR
            string[] result = AssetDatabase.FindAssets(string.Format("t:{0}", typeof(SpriteAsset).FullName));

            if (result.Length > 0)
            {
                for (int i = 0; i < result.Length; ++i)
                {
                    string      path  = AssetDatabase.GUIDToAssetPath(result[i]);
                    SpriteAsset asset = AssetDatabase.LoadAssetAtPath <SpriteAsset>(path);
                    if (asset)
                    {
                        context.Refercens.Add(asset);
                    }
                }
            }
#endif

            InlineManager[] managers = GameObject.FindObjectsOfType <InlineManager>();
            foreach (var manager in managers)
            {
                foreach (var asset in manager.SharedAssets)
                {
                    if (context.Refercens.Contains(asset) == false)
                    {
                        context.Refercens.Add(asset);
                    }
                }
            }

            Debug.LogFormat("find :{0} atlas resource", result.Length);

            foreach (var asset in context.Refercens)
            {
                foreach (var gp in asset.listSpriteGroup)
                {
                    context.GroupMapper[gp.tag] = gp;
                }
            }


            return(0);
        }
        void RebuildTagList()
        {
            EmojiTools.BeginSample("Emoji_rebuildTags");
            _alltags.Clear();
            _spritemap.Clear();
#if UNITY_EDITOR && !EMOJI_RUNTIME
            if (_unityallAtlases != null)
            {
                for (int i = 0; i < _unityallAtlases.Count; ++i)
                {
                    SpriteAsset asset = _unityallAtlases[i];
                    for (int j = 0; j < asset.listSpriteGroup.Count; ++j)
                    {
                        SpriteInfoGroup infogroup = asset.listSpriteGroup[j];
                        SpriteInfoGroup group;
                        if (_alltags.TryGetValue(infogroup.tag, out group))
                        {
                            Debug.LogErrorFormat("already exist :{0} ", infogroup.tag);
                        }

                        _alltags[infogroup.tag] = infogroup;
                    }
                }
            }
#else
            for (int i = 0; i < _sharedAtlases.Count; ++i)
            {
                SpriteAsset asset = _sharedAtlases[i];
                for (int j = 0; j < asset.listSpriteGroup.Count; ++j)
                {
                    SpriteInfoGroup infogroup = asset.listSpriteGroup[j];
                    SpriteInfoGroup group;
                    if (_alltags.TryGetValue(infogroup.tag, out group))
                    {
                        Debug.LogErrorFormat("already exist :{0} ", infogroup.tag);
                    }

                    _alltags[infogroup.tag]   = infogroup;
                    _spritemap[infogroup.tag] = new KeyValuePair <SpriteAsset, SpriteInfoGroup>(asset, infogroup);
                }
            }
#endif
            EmojiTools.EndSample();
        }
Пример #19
0
        SpriteGraphic ParsePosAndUV(InlineText text, int ID, Vector3[] Pos, Vector2[] UV)
        {
            EmojiTools.BeginSample("Emoji_UnitParsePosAndUV");
            SpriteAsset matchAsset = null;

            for (int i = 0; i < allatlas.Count; ++i)
            {
                SpriteAsset asset = allatlas[i];
                if (asset != null && asset.ID == ID)
                {
                    matchAsset = asset;
                    break;
                }
            }

            if (matchAsset && matchAsset.texSource != null)
            {
                List <SpriteGraphic> list   = null;
                SpriteGraphic        target = FindGraphic(text, matchAsset, out list);
                if (!target)
                {
                    target = CreateSpriteRender(text.transform);
                    list.Add(target);
                }

                RefreshSubUIMesh(text, target, matchAsset, Pos, UV);

                EmojiTools.EndSample();
                return(target);
            }
            else
            {
                Debug.LogErrorFormat("missing {0} atlas", ID);
            }
            EmojiTools.EndSample();
            return(null);
        }
        void Initialize()
        {
            HasInit = true;
#if UNITY_EDITOR
            string[] result = AssetDatabase.FindAssets(string.Format("t:{0}", typeof(SpriteAsset).FullName));

            if (result.Length > 0 && _unityallAtlases == null)
            {
                _unityallAtlases = new List <SpriteAsset>(result.Length);
                for (int i = 0; i < result.Length; ++i)
                {
                    string      path  = AssetDatabase.GUIDToAssetPath(result[i]);
                    SpriteAsset asset = AssetDatabase.LoadAssetAtPath <SpriteAsset>(path);
                    if (asset)
                    {
                        _unityallAtlases.Add(asset);
                    }
                }
            }
            Debug.LogFormat("find :{0} atlas resource", result.Length);
            Debug.LogWarning("if your asset not in the resources please override InstantiateSpriteAsset");
#endif


            EmojiTools.BeginSample("Emoji_Init");
            InitRender();
            EmojiTools.EndSample();

            EmojiTools.BeginSample("Emoji_preLoad");
            PreLoad();
            EmojiTools.EndSample();

            RebuildTagList();

            ForceRebuild();
        }
Пример #21
0
 public void Clear()
 {
     atlas = null;
     _Vertices.Clear();
     _UV.Clear();
 }
Пример #22
0
 public void SetAtlas(SpriteAsset data)
 {
     atlas = data;
 }
        public override void OnInspectorGUI()
        {
            InlineManager manager = target as InlineManager;

            EditorGUILayout.PropertyField(m_Script);

            EditorGUILayout.Space();
            serializedObject.Update();

            manager.OpenDebug      = EditorGUILayout.Toggle("Debug", manager.OpenDebug);
            manager.RenderType     = (EmojiRenderType)EditorGUILayout.EnumPopup("Rendetype", manager.RenderType);
            manager.AnimationSpeed = EditorGUILayout.Slider("AnimationSpeed", manager.AnimationSpeed, 0, 100);

            foldout = EditorGUILayout.Foldout(foldout, "prepared:" + manager.PreparedAtlas.Count);
            if (foldout)
            {
                EditorGUI.indentLevel++;
                for (int i = 0; i < manager.PreparedAtlas.Count; ++i)
                {
                    string      resName = manager.PreparedAtlas[i];
                    SpriteAsset asset   = null;
                    if (!string.IsNullOrEmpty(resName))
                    {
                        if (!assetDic.ContainsKey(resName))
                        {
                            string   fixname   = System.IO.Path.GetFileNameWithoutExtension(resName);
                            string[] allassets = AssetDatabase.FindAssets(string.Format("t:{0}", typeof(SpriteAsset).FullName));
                            for (int j = 0; j < allassets.Length; ++j)
                            {
                                string path    = AssetDatabase.GUIDToAssetPath(allassets[j]);
                                string subname = System.IO.Path.GetFileNameWithoutExtension(path);
                                if (subname.Equals(fixname))
                                {
                                    asset = assetDic[resName] = AssetDatabase.LoadAssetAtPath <SpriteAsset>(path);
                                    break;
                                }
                            }
                        }
                        else
                        {
                            asset = assetDic[resName];
                        }
                    }

                    SpriteAsset newasset = (SpriteAsset)EditorGUILayout.ObjectField(i.ToString(), asset, typeof(SpriteAsset), false);
                    if (newasset != asset)
                    {
                        if (newasset == null)
                        {
                            manager.PreparedAtlas[i] = "";
                        }
                        else
                        {
                            manager.PreparedAtlas[i]           = System.IO.Path.GetFileNameWithoutExtension(AssetDatabase.GetAssetPath(newasset));
                            assetDic[manager.PreparedAtlas[i]] = newasset;
                        }
                        EditorUtility.SetDirty(manager);
                    }
                }

                EditorGUI.indentLevel--;

                EditorGUILayout.BeginHorizontal();

                if (GUILayout.Button("add", GUILayout.Width(100)))
                {
                    manager.PreparedAtlas.Add("");
                }

                if (GUILayout.Button("remove", GUILayout.Width(100)))
                {
                    if (manager.PreparedAtlas.Count > 0)
                    {
                        manager.PreparedAtlas.RemoveAt(manager.PreparedAtlas.Count - 1);
                    }
                }
                EditorGUILayout.EndHorizontal();
            }

            serializedObject.ApplyModifiedProperties();
        }
        void PlayAnimation()
        {
            EmojiTools.BeginSample("Emoji_GroupAnimation");
            if (alltexts != null)
            {
                if (_time == null)
                {
                    _time = Time.timeSinceLevelLoad;
                }
                else
                {
                    float deltatime = Time.timeSinceLevelLoad - _time.Value;

                    int framecnt = Mathf.RoundToInt(deltatime * Speed);
                    if (framecnt > 0)
                    {
                        List <string> joblist = ListPool <string> .Get();

                        for (int i = 0; i < alltexts.Count; ++i)
                        {
                            InlineText       text      = alltexts[i];
                            List <IFillData> emojidata = text.PopEmojiData();
                            if (emojidata != null && emojidata.Count > 0 && allatlas != null && allatlas.Count > 0)
                            {
                                for (int j = 0; j < emojidata.Count; ++j)
                                {
                                    IFillData taginfo = emojidata[j];
                                    if (taginfo == null || taginfo.ignore)
                                    {
                                        continue;
                                    }
                                    SpriteAsset     asset     = null;
                                    SpriteInfoGroup groupinfo = manager.FindSpriteGroup(taginfo.Tag, out asset);
                                    if (groupinfo != null && groupinfo.spritegroups.Count > 1)
                                    {
                                        int        index   = framecnt % groupinfo.spritegroups.Count;
                                        SpriteInfo sprInfo = groupinfo.spritegroups[index];
                                        taginfo.uv = sprInfo.uv;

                                        //render next
                                        CanvasGraphicGroup group = FindGraphicGroup(text.canvas, asset.ID);

                                        if (group != null)
                                        {
                                            if (tempMesh == null)
                                            {
                                                tempMesh = UnitMeshInfoPool.Get();
                                            }

                                            RefreshSubUIMesh(text, group, asset, taginfo.pos, taginfo.uv, joblist);

                                            if (group.isDirty)
                                            {
                                                group.graphic.SetVerticesDirty();
                                            }
                                            joblist.Add(taginfo.Tag);
                                        }
                                    }
                                }
                            }
                        }
                        ListPool <string> .Release(joblist);
                    }
                }
            }

            EmojiTools.EndSample();
        }
 public bool isRendering(SpriteAsset _spriteAsset)
 {
     return(_spriteAsset != null && _render != null && _render.isRendingAtlas(_spriteAsset));
 }
        void InitRender()
        {
            if (_render == null || _render.renderType != RenderType)
            {
                if (RenderType == EmojiRenderType.RenderGroup)
                {
                    EmojiRenderGroup newRender = new EmojiRenderGroup(this);
                    newRender.Speed = AnimationSpeed;

                    if (_render != null)
                    {
                        List <InlineText> list = _render.GetAllRenders();
                        if (list != null)
                        {
                            for (int i = 0; i < list.Count; ++i)
                            {
                                InlineText text = list[i];
                                if (text != null)
                                {
                                    newRender.TryRendering(text);
                                }
                            }
                        }

                        List <SpriteAsset> atlaslist = _render.GetAllRenderAtlas();
                        if (atlaslist != null)
                        {
                            for (int i = 0; i < atlaslist.Count; ++i)
                            {
                                SpriteAsset atlas = atlaslist[i];
                                if (atlas != null)
                                {
                                    newRender.PrepareAtlas(atlas);
                                }
                            }
                        }
                        _render.Dispose();
                    }

                    _render = newRender;
                }
                else if (RenderType == EmojiRenderType.RenderUnit)
                {
                    UnitRender newRender = new UnitRender(this);
                    newRender.Speed = AnimationSpeed;

                    if (_render != null)
                    {
                        List <InlineText> list = _render.GetAllRenders();
                        if (list != null)
                        {
                            for (int i = 0; i < list.Count; ++i)
                            {
                                InlineText text = list[i];
                                if (text != null)
                                {
                                    newRender.TryRendering(text);
                                }
                            }
                        }

                        List <SpriteAsset> atlaslist = _render.GetAllRenderAtlas();
                        if (atlaslist != null)
                        {
                            for (int i = 0; i < atlaslist.Count; ++i)
                            {
                                SpriteAsset atlas = atlaslist[i];
                                if (atlas != null)
                                {
                                    newRender.PrepareAtlas(atlas);
                                }
                            }
                        }

                        _render.Dispose();
                    }

                    _render = newRender;
                }
                else
                {
                    Debug.LogError("not support yet");
                    this.enabled = false;
                }
            }
        }
Пример #27
0
        void PlayAnimation()
        {
            EmojiTools.BeginSample("Emoji_UnitAnimation");
            if (alltexts != null)
            {
                if (_time == null)
                {
                    _time = Time.timeSinceLevelLoad;
                }
                else
                {
                    float deltatime = Time.timeSinceLevelLoad - _time.Value;
                    //at least one frame
                    int framecnt = Mathf.RoundToInt(deltatime * Speed);
                    if (framecnt > 0)
                    {
                        for (int i = 0; i < alltexts.Count; ++i)
                        {
                            InlineText       text      = alltexts[i];
                            List <IFillData> emojidata = text.PopEmojiData();
                            if (emojidata != null && emojidata.Count > 0 && allatlas != null && allatlas.Count > 0)
                            {
                                for (int j = 0; j < emojidata.Count; ++j)
                                {
                                    IFillData taginfo = emojidata[j];
                                    if (taginfo == null || taginfo.ignore)
                                    {
                                        continue;
                                    }

                                    SpriteAsset     asset     = null;
                                    SpriteInfoGroup groupinfo = manager.FindSpriteGroup(taginfo.Tag, out asset);
                                    if (groupinfo != null && groupinfo.spritegroups.Count > 1)
                                    {
                                        int        index   = framecnt % groupinfo.spritegroups.Count;
                                        SpriteInfo sprInfo = groupinfo.spritegroups[index];
                                        taginfo.uv = sprInfo.uv;

                                        List <SpriteGraphic> list   = null;
                                        SpriteGraphic        target = FindGraphic(text, asset, out list);
                                        if (target)
                                        {
                                            if (tempMesh == null)
                                            {
                                                tempMesh = UnitMeshInfoPool.Get();
                                            }

                                            if (renderData == null)
                                            {
                                                renderData = new Dictionary <Graphic, UnitMeshInfo>(emojidata.Count);
                                            }

                                            RefreshSubUIMesh(text, target, asset, taginfo.pos, taginfo.uv);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            EmojiTools.EndSample();
        }