/// ======================================================== /// file:InlineManager.cs /// brief: /// author: coding2233 /// date: /// version:v1.0 /// ======================================================== using System.Collections; using System.Collections.Generic; using UnityEngine; public class InlineManager : MonoBehaviour { //所有的精灵消息 public Dictionary> _IndexSpriteInfo=new Dictionary>(); //绘制图集的索引 private Dictionary _IndexSpriteGraphic = new Dictionary(); //绘制的模型数据索引 private Dictionary> _TextMeshInfo = new Dictionary>(); //静态表情 [SerializeField] private bool _IsStatic; //动画速度 [SerializeField] [Range(1,10)] private float _AnimationSpeed = 5.0f; // Use this for initialization void Start() { Initialize(); } // Update is called once per frame void Update () { //动态表情 if(!_IsStatic) DrawSpriteAnimation(); } #region 初始化 void Initialize() { SpriteGraphic[] _spriteGraphic = GetComponentsInChildren(); for (int i = 0; i < _spriteGraphic.Length; i++) { SpriteAsset _spriteAsset = _spriteGraphic[i].m_spriteAsset; if (!_IndexSpriteGraphic.ContainsKey(_spriteAsset.ID)&&!_IndexSpriteInfo.ContainsKey(_spriteAsset.ID)) { SpriteGraphicInfo _spriteGraphicInfo = new SpriteGraphicInfo() { _SpriteGraphic = _spriteGraphic[i], _Mesh = new Mesh(), }; _IndexSpriteGraphic.Add(_spriteAsset.ID, _spriteGraphicInfo); Dictionary _spriteGroup = new Dictionary(); foreach (var item in _spriteAsset.listSpriteGroup) { if (!_spriteGroup.ContainsKey(item.tag) && item .listSpriteInfor!=null&& item.listSpriteInfor.Count > 0) _spriteGroup.Add(item.tag, item); } _IndexSpriteInfo.Add(_spriteAsset.ID, _spriteGroup); _TextMeshInfo.Add(_spriteAsset.ID, new Dictionary()); } } } #endregion public void UpdateTextInfo(int _id,InlineText _key, List _value) { if (!_IndexSpriteGraphic.ContainsKey(_id)||!_TextMeshInfo.ContainsKey(_id)|| _value.Count<=0) return; int _spriteTagCount = _value.Count; Vector3 _textPos = _key.transform.position; Vector3 _spritePos = _IndexSpriteGraphic[_id]._SpriteGraphic.transform.position; Vector3 _disPos = _textPos - _spritePos; MeshInfo _meshInfo = new MeshInfo(); _meshInfo._Tag = new string[_spriteTagCount]; _meshInfo._Vertices = new Vector3[_spriteTagCount * 4]; _meshInfo._UV = new Vector2[_spriteTagCount * 4]; _meshInfo._Triangles = new int[_spriteTagCount * 6]; for (int i = 0; i < _value.Count; i++) { int m = i * 4; int n = i * 6; //标签 _meshInfo._Tag[i] = _value[i]._Tag; //顶点位置 _meshInfo._Vertices[m + 0] = _value[i]._Pos[0]+ _disPos; _meshInfo._Vertices[m + 1] = _value[i]._Pos[1] + _disPos; _meshInfo._Vertices[m + 2] = _value[i]._Pos[2] + _disPos; _meshInfo._Vertices[m + 3] = _value[i]._Pos[3] + _disPos; //uv _meshInfo._UV[m + 0] = _value[i]._UV[0]; _meshInfo._UV[m + 1] = _value[i]._UV[1]; _meshInfo._UV[m + 2] = _value[i]._UV[2]; _meshInfo._UV[m + 3] = _value[i]._UV[3]; } if (_TextMeshInfo[_id].ContainsKey(_key)) { MeshInfo _oldMeshInfo = _TextMeshInfo[_id][_key]; if (_meshInfo.Equals(_oldMeshInfo)) return; else _TextMeshInfo[_id][_key] = _meshInfo; } else _TextMeshInfo[_id].Add(_key, _meshInfo); //更新图片 DrawSprites(_id); } public void RemoveTextInfo(int _id,InlineText _key) { if (!_TextMeshInfo.ContainsKey(_id)|| _TextMeshInfo[_id].ContainsKey(_key)) return; _TextMeshInfo.Remove(_id); //更新图片 DrawSprites(_id); } #region 播放动态表情 float _animationTime = 0.0f; int _AnimationIndex = 0; private void DrawSpriteAnimation() { _animationTime += Time.deltaTime* _AnimationSpeed; if (_animationTime >= 1.0f) { _AnimationIndex++; //绘制表情 foreach (var item in _IndexSpriteGraphic) { if (item.Value._SpriteGraphic.m_spriteAsset._IsStatic) continue; if (!_TextMeshInfo.ContainsKey(item.Key) || _TextMeshInfo[item.Key].Count <= 0) continue; SpriteGraphic _spriteGraphic = _IndexSpriteGraphic[item.Key]._SpriteGraphic; //Mesh _mesh = _IndexSpriteGraphic[item.Key]._Mesh; Dictionary _data = _TextMeshInfo[item.Key]; foreach (var item02 in _data) { for (int i = 0; i < item02.Value._Tag.Length; i++) { List _listSpriteInfo = _IndexSpriteInfo[item.Key][item02.Value._Tag[i]].listSpriteInfor; if (_listSpriteInfo.Count <= 1) continue; int _index = _AnimationIndex % _listSpriteInfo.Count; int m = i * 4; item02.Value._UV[m + 0] = _listSpriteInfo[_index].uv[0]; item02.Value._UV[m + 1] = _listSpriteInfo[_index].uv[1]; item02.Value._UV[m + 2] = _listSpriteInfo[_index].uv[2]; item02.Value._UV[m + 3] = _listSpriteInfo[_index].uv[3]; } } // _IndexSpriteGraphic[item.Key]._Mesh = _mesh; DrawSprites(item.Key); } _animationTime = 0.0f; } } #endregion #region 绘制图片 private void DrawSprites(int _id) { if (!_IndexSpriteGraphic.ContainsKey(_id) || !_TextMeshInfo.ContainsKey(_id)) return; SpriteGraphic _spriteGraphic = _IndexSpriteGraphic[_id]._SpriteGraphic; Mesh _mesh = _IndexSpriteGraphic[_id]._Mesh; Dictionary _data = _TextMeshInfo[_id]; List _vertices = new List(); List _uv = new List(); List _triangles = new List(); foreach (var item in _data) { for (int i = 0; i < item.Value._Vertices.Length; i++) { //添加顶点 _vertices.Add(item.Value._Vertices[i]); //添加uv _uv.Add(item.Value._UV[i]); } //添加顶点索引 for (int i = 0; i < item.Value._Triangles.Length; i++) _triangles.Add(item.Value._Triangles[i]); } //计算顶点绘制顺序 for (int i = 0; i < _triangles.Count; i++) { if (i % 6 == 0) { int num = i / 6; _triangles[i + 0] = 0 + 4 * num; _triangles[i + 1] = 1 + 4 * num; _triangles[i + 2] = 2 + 4 * num; _triangles[i + 3] = 0 + 4 * num; _triangles[i + 4] = 2 + 4 * num; _triangles[i + 5] = 3 + 4 * num; } } _mesh.Clear(); _mesh.vertices = _vertices.ToArray(); _mesh.uv = _uv.ToArray(); _mesh.triangles = _triangles.ToArray(); _spriteGraphic.canvasRenderer.SetMesh(_mesh); _spriteGraphic.UpdateMaterial(); } #endregion #region 精灵组信息 private class SpriteGraphicInfo { public SpriteGraphic _SpriteGraphic; public Mesh _Mesh; } #endregion #region 模型数据信息 private class MeshInfo { public string[] _Tag; public Vector3[] _Vertices; public Vector2[] _UV; public int[] _Triangles; //比较数据是否一样 public bool Equals(MeshInfo _value) { if (_Tag.Length!= _value._Tag.Length|| _Vertices.Length!= _value._Vertices.Length) return false; for (int i = 0; i < _Tag.Length; i++) if (_Tag[i] != _value._Tag[i]) return false; for (int i = 0; i < _Vertices.Length; i++) if (_Vertices[i] != _value._Vertices[i]) return false; return true; } } #endregion }