Skip to content
This repository was archived by the owner on Jul 11, 2023. It is now read-only.

Commit 8d43a84

Browse files
committed
optimize emoji
主要优化了静态表情和动态表情,还有代码结构和不合理的对象分配,大量减少内存开销,支持unit和group模式切换,少量优化了其他
1 parent 8e8d8d8 commit 8d43a84

40 files changed

+6614
-5063
lines changed

Assets/TextInlineSprite/Editor/CreateSpriteAsset.cs

Lines changed: 60 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,83 +3,89 @@
33
using UnityEditor;
44
using System.IO;
55
using System.Collections.Generic;
6+
using EmojiUI;
67

78
public static class CreateSpriteAsset
89
{
910
[MenuItem("Assets/Create/Sprite Asset",false,10)]
10-
static void main()
11+
static void CreateSpriteAssets()
1112
{
12-
Object target = Selection.activeObject;
13-
if (target == null || target.GetType() != typeof(Texture2D))
14-
return;
13+
string[] guids = Selection.assetGUIDs;
14+
for(int i =0; i < guids.Length;++i)
15+
{
16+
string guid = guids[i];
17+
string filepath = AssetDatabase.GUIDToAssetPath(guid);
18+
GenerateSpriteInfo(filepath);
19+
}
1520

16-
Texture2D sourceTex = target as Texture2D;
17-
//整体路径
18-
string filePathWithName = AssetDatabase.GetAssetPath(sourceTex);
19-
//带后缀的文件名
20-
string fileNameWithExtension = Path.GetFileName(filePathWithName);
21-
//不带后缀的文件名
22-
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(filePathWithName);
23-
//不带文件名的路径
24-
string filePath = filePathWithName.Replace(fileNameWithExtension, "");
21+
AssetDatabase.Refresh();
22+
}
2523

26-
SpriteAsset spriteAsset = AssetDatabase.LoadAssetAtPath(filePath + fileNameWithoutExtension + ".asset", typeof(SpriteAsset)) as SpriteAsset;
27-
bool isNewAsset = spriteAsset == null ? true : false;
28-
if (isNewAsset)
24+
static void GenerateSpriteInfo(string unitypath)
25+
{
26+
Texture2D sourceTex = AssetDatabase.LoadAssetAtPath<Texture2D>(unitypath);
27+
if(sourceTex != null)
2928
{
29+
string Extensionname = Path.GetExtension(unitypath);
30+
string filePath = unitypath.Replace(Extensionname, ".asset");
31+
32+
SpriteAsset spriteAsset = AssetDatabase.LoadAssetAtPath(filePath, typeof(SpriteAsset)) as SpriteAsset;
33+
int tag = 0;
34+
if (spriteAsset != null)
35+
{
36+
tag = spriteAsset.ID;
37+
}
38+
39+
//replace
3040
spriteAsset = ScriptableObject.CreateInstance<SpriteAsset>();
31-
spriteAsset.TexSource = sourceTex;
32-
spriteAsset.ListSpriteGroup = GetAssetSpriteInfor(sourceTex);
33-
AssetDatabase.CreateAsset(spriteAsset, filePath + fileNameWithoutExtension + ".asset");
41+
spriteAsset.ID = tag;
42+
spriteAsset.AssetName = sourceTex.ToString();
43+
spriteAsset.texSource = sourceTex;
44+
spriteAsset.listSpriteGroup = GetAssetSpriteInfor(sourceTex);
45+
AssetDatabase.CreateAsset(spriteAsset, filePath);
3446
}
47+
3548
}
3649

37-
public static List<SpriteInforGroup> GetAssetSpriteInfor(Texture2D tex)
50+
static List<SpriteInfoGroup> GetAssetSpriteInfor(Texture2D tex)
3851
{
39-
List<SpriteInforGroup> _listGroup = new List<SpriteInforGroup>();
40-
string filePath = UnityEditor.AssetDatabase.GetAssetPath(tex);
52+
string filePath = AssetDatabase.GetAssetPath(tex);
53+
Object[] objects = AssetDatabase.LoadAllAssetsAtPath(filePath);
4154

42-
Object[] objects = UnityEditor.AssetDatabase.LoadAllAssetsAtPath(filePath);
55+
List<SpriteInfoGroup> _listGroup = new List<SpriteInfoGroup>();
56+
List<SpriteInfo> allSprites = new List<SpriteInfo>();
4357

44-
List<SpriteInfor> _tempSprite = new List<SpriteInfor>();
45-
46-
Vector2 _texSize = new Vector2(tex.width, tex.height);
58+
Vector2 texelSize = new Vector2(tex.width, tex.height);
4759
for (int i = 0; i < objects.Length; i++)
4860
{
49-
if (objects[i].GetType() != typeof(Sprite))
50-
continue;
51-
SpriteInfor temp = new SpriteInfor();
52-
Sprite sprite = objects[i] as Sprite;
53-
temp.Id = i;
54-
temp.Name = sprite.name;
55-
temp.Pivot = sprite.pivot;
56-
temp.Rect = sprite.rect;
57-
temp.Sprite = sprite;
58-
temp.Tag = sprite.name;
59-
temp.Uv = GetSpriteUV(_texSize, sprite.rect);
60-
_tempSprite.Add(temp);
61-
}
61+
Sprite sprite = objects[i] as Sprite;
6262

63-
for (int i = 0; i < _tempSprite.Count; i++)
64-
{
65-
SpriteInforGroup _tempGroup = new SpriteInforGroup();
66-
_tempGroup.Tag = _tempSprite[i].Tag;
67-
//_tempGroup.Size = 24.0f;
68-
//_tempGroup.Width = 1.0f;
69-
_tempGroup.ListSpriteInfor = new List<SpriteInfor>();
70-
_tempGroup.ListSpriteInfor.Add(_tempSprite[i]);
71-
for (int j = i+1; j < _tempSprite.Count; j++)
63+
if (sprite != null)
7264
{
73-
if ( _tempGroup.Tag == _tempSprite[j].Tag)
65+
SpriteInfo seeked = allSprites.Find(p => p.tag == sprite.name);
66+
if(seeked == null)
7467
{
75-
_tempGroup.ListSpriteInfor.Add(_tempSprite[j]);
76-
_tempSprite.RemoveAt(j);
77-
j--;
68+
SpriteInfo temp = new SpriteInfo();
69+
temp.sprite = sprite;
70+
temp.tag = sprite.name;
71+
temp.uv = GetSpriteUV(texelSize, sprite.rect);
72+
allSprites.Add(temp);
7873
}
7974
}
75+
76+
}
77+
78+
for (int i = 0; i < allSprites.Count; i++)
79+
{
80+
SpriteInfo info = allSprites[i];
81+
82+
SpriteInfoGroup _tempGroup = new SpriteInfoGroup();
83+
_tempGroup.tag = info.tag;
84+
_tempGroup.size = Mathf.Max(info.sprite.rect.size.x, info.sprite.rect.size.y);
85+
_tempGroup.width =1;
86+
_tempGroup.spritegroups.Add(info);
87+
8088
_listGroup.Add(_tempGroup);
81-
_tempSprite.RemoveAt(i);
82-
i--;
8389
}
8490

8591
return _listGroup;

Assets/TextInlineSprite/Editor/CreateSpriteAsset.cs.meta

Lines changed: 12 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
using UnityEditor;
5+
6+
namespace EmojiUI
7+
{
8+
[CustomEditor(typeof(InlineManager),true)]
9+
[CanEditMultipleObjects]
10+
public class InlineManagerEditor : Editor
11+
{
12+
SerializedProperty m_Script;
13+
14+
private bool foldout =true;
15+
16+
private Dictionary<string, SpriteAsset> assetDic = new Dictionary<string, SpriteAsset>();
17+
18+
protected virtual void OnEnable()
19+
{
20+
m_Script = serializedObject.FindProperty("m_Script");
21+
}
22+
23+
public override void OnInspectorGUI()
24+
{
25+
InlineManager manager = target as InlineManager;
26+
EditorGUILayout.PropertyField(m_Script);
27+
28+
EditorGUILayout.Space();
29+
serializedObject.Update();
30+
31+
manager.OpenDebug =EditorGUILayout.Toggle("Debug", manager.OpenDebug);
32+
manager.renderType = (EmojiRenderType)EditorGUILayout.EnumPopup("Rendetype", manager.renderType);
33+
manager.AnimationSpeed = EditorGUILayout.Slider("AnimationSpeed", manager.AnimationSpeed, 0, 100);
34+
35+
foldout = EditorGUILayout.Foldout(foldout, "prepared:"+manager.PreparedAtlas.Count);
36+
if(foldout)
37+
{
38+
EditorGUI.indentLevel++;
39+
for (int i =0; i < manager.PreparedAtlas.Count;++i)
40+
{
41+
string resName = manager.PreparedAtlas[i];
42+
SpriteAsset asset = null;
43+
if(!string.IsNullOrEmpty(resName))
44+
{
45+
if (!assetDic.ContainsKey(resName))
46+
{
47+
48+
string fixname = System.IO.Path.GetFileNameWithoutExtension(resName);
49+
string[] allassets = AssetDatabase.FindAssets(string.Format("t:{0}", typeof(SpriteAsset).FullName));
50+
for (int j = 0; j < allassets.Length;++j)
51+
{
52+
string path = AssetDatabase.GUIDToAssetPath( allassets[j]);
53+
string subname = System.IO.Path.GetFileNameWithoutExtension(path);
54+
if(subname.Equals(fixname))
55+
{
56+
asset = assetDic[resName] = AssetDatabase.LoadAssetAtPath<SpriteAsset>(path);
57+
break;
58+
}
59+
}
60+
}
61+
else
62+
{
63+
asset = assetDic[resName];
64+
}
65+
}
66+
67+
SpriteAsset newasset = (SpriteAsset)EditorGUILayout.ObjectField(i.ToString(), asset, typeof(SpriteAsset),false);
68+
if(newasset != asset)
69+
{
70+
if(newasset == null)
71+
{
72+
manager.PreparedAtlas[i] = "";
73+
}
74+
else
75+
{
76+
manager.PreparedAtlas[i] = System.IO.Path.GetFileNameWithoutExtension(AssetDatabase.GetAssetPath(newasset));
77+
assetDic[manager.PreparedAtlas[i]] = newasset;
78+
}
79+
EditorUtility.SetDirty(manager);
80+
}
81+
82+
}
83+
84+
EditorGUI.indentLevel--;
85+
86+
EditorGUILayout.BeginHorizontal();
87+
88+
if(GUILayout.Button("add",GUILayout.Width(100)))
89+
{
90+
manager.PreparedAtlas.Add("");
91+
}
92+
93+
if (GUILayout.Button("remove", GUILayout.Width(100)))
94+
{
95+
if (manager.PreparedAtlas.Count > 0)
96+
manager.PreparedAtlas.RemoveAt(manager.PreparedAtlas.Count - 1);
97+
}
98+
EditorGUILayout.EndHorizontal();
99+
}
100+
101+
serializedObject.ApplyModifiedProperties();
102+
}
103+
}
104+
}
105+
106+

Assets/TextInlineSprite/Editor/InlineManagerEditor.cs.meta

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)