miduo_client/Assets/LuaFramework/Scripts/OwnTools/InLine/InlineManager.cs

255 lines
9.0 KiB
C#
Raw Normal View History

2020-05-09 13:31:21 +08:00
/// ========================================================
/// fileInlineManager.cs
/// brief
/// author coding2233
/// date
/// versionv1.0
/// ========================================================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InlineManager : MonoBehaviour {
//所有的精灵消息
public Dictionary<int, Dictionary<string, SpriteInforGroup>> _IndexSpriteInfo=new Dictionary<int, Dictionary<string, SpriteInforGroup>>();
//绘制图集的索引
private Dictionary<int, SpriteGraphicInfo> _IndexSpriteGraphic = new Dictionary<int, SpriteGraphicInfo>();
//绘制的模型数据索引
private Dictionary<int, Dictionary<InlineText, MeshInfo>> _TextMeshInfo = new Dictionary<int, Dictionary<InlineText, MeshInfo>>();
//静态表情
[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<SpriteGraphic>();
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<string, SpriteInforGroup> _spriteGroup = new Dictionary<string, SpriteInforGroup>();
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<InlineText, MeshInfo>());
}
}
}
#endregion
public void UpdateTextInfo(int _id,InlineText _key, List<SpriteTagInfo> _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<InlineText, MeshInfo> _data = _TextMeshInfo[item.Key];
foreach (var item02 in _data)
{
for (int i = 0; i < item02.Value._Tag.Length; i++)
{
List<SpriteInfor> _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<InlineText, MeshInfo> _data = _TextMeshInfo[_id];
List<Vector3> _vertices = new List<Vector3>();
List<Vector2> _uv = new List<Vector2>();
List<int> _triangles = new List<int>();
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
}