日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity美术字体教程--BMFont美术字体的制作流程以及在unity中美术字体的生成

發(fā)布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity美术字体教程--BMFont美术字体的制作流程以及在unity中美术字体的生成 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在unity的開發(fā)過程中,為了實現(xiàn)更好的表現(xiàn),經(jīng)常要使用美術(shù)字體,記錄下美術(shù)字體的制作流程。

首先,美術(shù)的同學會給一張制作好的美術(shù)字的圖片,當然如果能直接給fnt文件就更省事了。

拿到圖片后,將圖片的spriteMode設(shè)置為Multiple,然后Sprite Editor進行圖片區(qū)域的劃分,把圖片分成寬度高度一致的小圖,

分享一個在unity中使用的圖片切割的工具腳本:

/** * UnityVersion: 2018.3.10f1 * FileName: ImageSlicer.cs * Author: TYQ * CreateTime: 2019/04/19 00:04:26 * Description: */ /* * Author: * Date:2019/01/30 10:24:22 * Desc:圖集切割器 (針對Multiple格式的圖片) * 操作方式:選中圖片,選擇編輯器的 Assets/ImageSlicer/Process to Sprites菜單 */ using UnityEngine; using System.Collections; using UnityEditor; using System.IO; using System.Collections.Generic; public static class ImageSlicer {[MenuItem("Assets/ImageSlicer/Process to Sprites")]static void ProcessToSprite(){Texture2D image = Selection.activeObject as Texture2D;//獲取旋轉(zhuǎn)的對象string rootPath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(image));//獲取路徑名稱string path = rootPath + "/" + image.name + ".PNG";//圖片路徑名稱TextureImporter texImp = AssetImporter.GetAtPath(path) as TextureImporter;//獲取圖片入口AssetDatabase.CreateFolder(rootPath, image.name);//創(chuàng)建文件夾foreach (SpriteMetaData metaData in texImp.spritesheet)//遍歷小圖集{Texture2D myimage = new Texture2D((int)metaData.rect.width, (int)metaData.rect.height);//abc_0:(x:2.00, y:400.00, width:103.00, height:112.00)for (int y = (int)metaData.rect.y; y < metaData.rect.y + metaData.rect.height; y++)//Y軸像素{for (int x = (int)metaData.rect.x; x < metaData.rect.x + metaData.rect.width; x++)myimage.SetPixel(x - (int)metaData.rect.x, y - (int)metaData.rect.y, image.GetPixel(x, y));}//轉(zhuǎn)換紋理到EncodeToPNG兼容格式if (myimage.format != TextureFormat.ARGB32 && myimage.format != TextureFormat.RGB24){Texture2D newTexture = new Texture2D(myimage.width, myimage.height);newTexture.SetPixels(myimage.GetPixels(0), 0);myimage = newTexture;}var pngData = myimage.EncodeToPNG();//AssetDatabase.CreateAsset(myimage, rootPath + "/" + image.name + "/" + metaData.name + ".PNG");File.WriteAllBytes(rootPath + "/" + image.name + "/" + metaData.name + ".PNG", pngData);// 刷新資源窗口界面AssetDatabase.Refresh();}} }

然后在同目錄就能拿到切割好的小圖了,這個圖片可以在BMFont字體工具中導出fnt文件。

接下來,下載BMFont,BMFont下載地址:http://www.angelcode.com/products/bmfont/

字符ID:選中字符后可以看到字符id

點擊Edit/openImage,可以選擇導入圖片,編輯圖片,刪除圖片等。

字符編碼可以直接查詢,地址為:http://www.mytju.com/classcode/tools/encode_utf8.asp

在options中可以預覽,導出設(shè)置,導出字體等,最后可以導出一張圖片和一個fnt文件,這個文件在unity中不能直接使用,要轉(zhuǎn)成fontsettings

?

在unity中新建一個CustonFont,新建一個材質(zhì),然后使用編輯器導出工具BMFontMaker進行字體的生成

將對應的4個文件填入,點生成字體,美術(shù)字就能使用了,這個編輯的拓展的代碼如下:

//---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright ? 2011-2015 Tasharen Entertainment //---------------------------------------------- using UnityEngine; using System.Collections.Generic; using System.Diagnostics; /// <summary> /// This improved version of the System.Collections.Generic.List that doesn't release the buffer on Clear(), /// resulting in better performance and less garbage collection. /// PRO: BetterList performs faster than List when you Add and Remove items (although slower if you remove from the beginning). /// CON: BetterList performs worse when sorting the list. If your operations involve sorting, use the standard List instead. /// </summary> public class BetterList<T> { #if UNITY_FLASHList<T> mList = new List<T>();/// <summary>/// Direct access to the buffer. Note that you should not use its 'Length' parameter, but instead use BetterList.size./// </summary>public T this[int i]{get { return mList[i]; }set { mList[i] = value; }}/// <summary>/// Compatibility with the non-flash syntax./// </summary>public List<T> buffer { get { return mList; } }/// <summary>/// Direct access to the buffer's size. Note that it's only public for speed and efficiency. You shouldn't modify it./// </summary>public int size { get { return mList.Count; } }/// <summary>/// For 'foreach' functionality./// </summary>public IEnumerator<T> GetEnumerator () { return mList.GetEnumerator(); }/// <summary>/// Clear the array by resetting its size to zero. Note that the memory is not actually released./// </summary>public void Clear () { mList.Clear(); }/// <summary>/// Clear the array and release the used memory./// </summary>public void Release () { mList.Clear(); }/// <summary>/// Add the specified item to the end of the list./// </summary>public void Add (T item) { mList.Add(item); }/// <summary>/// Insert an item at the specified index, pushing the entries back./// </summary>public void Insert (int index, T item){if (index > -1 && index < mList.Count) mList.Insert(index, item);else mList.Add(item);}/// <summary>/// Returns 'true' if the specified item is within the list./// </summary>public bool Contains (T item) { return mList.Contains(item); }/// <summary>/// Return the index of the specified item./// </summary>public int IndexOf (T item) { return mList.IndexOf(item); }/// <summary>/// Remove the specified item from the list. Note that RemoveAt() is faster and is advisable if you already know the index./// </summary>public bool Remove (T item) { return mList.Remove(item); }/// <summary>/// Remove an item at the specified index./// </summary>public void RemoveAt (int index) { mList.RemoveAt(index); }/// <summary>/// Remove an item from the end./// </summary>public T Pop (){if (buffer != null && size != 0){T val = buffer[mList.Count - 1];mList.RemoveAt(mList.Count - 1);return val;}return default(T);}/// <summary>/// Mimic List's ToArray() functionality, except that in this case the list is resized to match the current size./// </summary>public T[] ToArray () { return mList.ToArray(); }/// <summary>/// List.Sort equivalent./// </summary>public void Sort (System.Comparison<T> comparer) { mList.Sort(comparer); } #else/// <summary>/// Direct access to the buffer. Note that you should not use its 'Length' parameter, but instead use BetterList.size./// </summary>public T[] buffer;/// <summary>/// Direct access to the buffer's size. Note that it's only public for speed and efficiency. You shouldn't modify it./// </summary>public int size = 0;/// <summary>/// For 'foreach' functionality./// </summary>[DebuggerHidden][DebuggerStepThrough]public IEnumerator<T> GetEnumerator (){if (buffer != null){for (int i = 0; i < size; ++i){yield return buffer[i];}}}/// <summary>/// Convenience function. I recommend using .buffer instead./// </summary>[DebuggerHidden]public T this[int i]{get { return buffer[i]; }set { buffer[i] = value; }}/// <summary>/// Helper function that expands the size of the array, maintaining the content./// </summary>void AllocateMore (){T[] newList = (buffer != null) ? new T[Mathf.Max(buffer.Length << 1, 32)] : new T[32];if (buffer != null && size > 0) buffer.CopyTo(newList, 0);buffer = newList;}/// <summary>/// Trim the unnecessary memory, resizing the buffer to be of 'Length' size./// Call this function only if you are sure that the buffer won't need to resize anytime soon./// </summary>void Trim (){if (size > 0){if (size < buffer.Length){T[] newList = new T[size];for (int i = 0; i < size; ++i) newList[i] = buffer[i];buffer = newList;}}else buffer = null;}/// <summary>/// Clear the array by resetting its size to zero. Note that the memory is not actually released./// </summary>public void Clear () { size = 0; }/// <summary>/// Clear the array and release the used memory./// </summary>public void Release () { size = 0; buffer = null; }/// <summary>/// Add the specified item to the end of the list./// </summary>public void Add (T item){if (buffer == null || size == buffer.Length) AllocateMore();buffer[size++] = item;}/// <summary>/// Insert an item at the specified index, pushing the entries back./// </summary>public void Insert (int index, T item){if (buffer == null || size == buffer.Length) AllocateMore();if (index > -1 && index < size){for (int i = size; i > index; --i) buffer[i] = buffer[i - 1];buffer[index] = item;++size;}else Add(item);}/// <summary>/// Returns 'true' if the specified item is within the list./// </summary>public bool Contains (T item){if (buffer == null) return false;for (int i = 0; i < size; ++i) if (buffer[i].Equals(item)) return true;return false;}/// <summary>/// Return the index of the specified item./// </summary>public int IndexOf (T item){if (buffer == null) return -1;for (int i = 0; i < size; ++i) if (buffer[i].Equals(item)) return i;return -1;}/// <summary>/// Remove the specified item from the list. Note that RemoveAt() is faster and is advisable if you already know the index./// </summary>public bool Remove (T item){if (buffer != null){EqualityComparer<T> comp = EqualityComparer<T>.Default;for (int i = 0; i < size; ++i){if (comp.Equals(buffer[i], item)){--size;buffer[i] = default(T);for (int b = i; b < size; ++b) buffer[b] = buffer[b + 1];buffer[size] = default(T);return true;}}}return false;}/// <summary>/// Remove an item at the specified index./// </summary>public void RemoveAt (int index){if (buffer != null && index > -1 && index < size){--size;buffer[index] = default(T);for (int b = index; b < size; ++b) buffer[b] = buffer[b + 1];buffer[size] = default(T);}}/// <summary>/// Remove an item from the end./// </summary>public T Pop (){if (buffer != null && size != 0){T val = buffer[--size];buffer[size] = default(T);return val;}return default(T);}/// <summary>/// Mimic List's ToArray() functionality, except that in this case the list is resized to match the current size./// </summary>public T[] ToArray () { Trim(); return buffer; }//class Comparer : System.Collections.IComparer//{// public System.Comparison<T> func;// public int Compare (object x, object y) { return func((T)x, (T)y); }//}//Comparer mComp = new Comparer();/// <summary>/// List.Sort equivalent. Doing Array.Sort causes GC allocations./// </summary>//public void Sort (System.Comparison<T> comparer)//{// if (size > 0)// {// mComp.func = comparer;// System.Array.Sort(buffer, 0, size, mComp);// }//}/// <summary>/// List.Sort equivalent. Manual sorting causes no GC allocations./// </summary>[DebuggerHidden][DebuggerStepThrough]public void Sort (CompareFunc comparer){int start = 0;int max = size - 1;bool changed = true;while (changed){changed = false;for (int i = start; i < max; ++i){// Compare the two valuesif (comparer(buffer[i], buffer[i + 1]) > 0){// Swap the valuesT temp = buffer[i];buffer[i] = buffer[i + 1];buffer[i + 1] = temp;changed = true;}else if (!changed){// Nothing has changed -- we can start here next timestart = (i == 0) ? 0 : i - 1;}}}}/// <summary>/// Comparison function should return -1 if left is less than right, 1 if left is greater than right, and 0 if they match./// </summary>public delegate int CompareFunc (T left, T right); #endif } //---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright ? 2011-2015 Tasharen Entertainment //---------------------------------------------- using UnityEngine; using System.Collections.Generic; /// <summary> /// BMFont reader. C# implementation of http://www.angelcode.com/products/bmfont/ /// </summary> [System.Serializable] public class BMFont {[HideInInspector][SerializeField] int mSize = 16; // How much to move the cursor when moving to the next line[HideInInspector][SerializeField] int mBase = 0; // Offset from the top of the line to the base of each character[HideInInspector][SerializeField] int mWidth = 0; // Original width of the texture[HideInInspector][SerializeField] int mHeight = 0; // Original height of the texture[HideInInspector][SerializeField] string mSpriteName;// List of serialized glyphs[HideInInspector][SerializeField] List<BMGlyph> mSaved = new List<BMGlyph>();// Actual glyphs that we'll be working with are stored in a dictionary, making the lookup fasterDictionary<int, BMGlyph> mDict = new Dictionary<int, BMGlyph>();/// <summary>/// Whether the font can be used./// </summary>public bool isValid { get { return (mSaved.Count > 0); } }/// <summary>/// Size of this font (for example 32 means 32 pixels)./// </summary>public int charSize { get { return mSize; } set { mSize = value; } }/// <summary>/// Base offset applied to characters./// </summary>public int baseOffset { get { return mBase; } set { mBase = value; } }/// <summary>/// Original width of the texture./// </summary>public int texWidth { get { return mWidth; } set { mWidth = value; } }/// <summary>/// Original height of the texture./// </summary>public int texHeight { get { return mHeight; } set { mHeight = value; } }/// <summary>/// Number of valid glyphs./// </summary>public int glyphCount { get { return isValid ? mSaved.Count : 0; } }/// <summary>/// Original name of the sprite that the font is expecting to find (usually the name of the texture)./// </summary>public string spriteName { get { return mSpriteName; } set { mSpriteName = value; } }/// <summary>/// Access to BMFont's entire set of glyphs./// </summary>public List<BMGlyph> glyphs { get { return mSaved; } }/// <summary>/// Helper function that retrieves the specified glyph, creating it if necessary./// </summary>public BMGlyph GetGlyph (int index, bool createIfMissing){// Get the requested glyphBMGlyph glyph = null;if (mDict.Count == 0){// Populate the dictionary for faster accessfor (int i = 0, imax = mSaved.Count; i < imax; ++i){BMGlyph bmg = mSaved[i];mDict.Add(bmg.index, bmg);}}// Saved check is here so that the function call is not needed if it's trueif (!mDict.TryGetValue(index, out glyph) && createIfMissing){glyph = new BMGlyph();glyph.index = index;mSaved.Add(glyph);mDict.Add(index, glyph);}return glyph;}/// <summary>/// Retrieve the specified glyph, if it's present./// </summary>public BMGlyph GetGlyph (int index) { return GetGlyph(index, false); }/// <summary>/// Clear the glyphs./// </summary>public void Clear (){mDict.Clear();mSaved.Clear();}/// <summary>/// Trim the glyphs, ensuring that they will never go past the specified bounds./// </summary>public void Trim (int xMin, int yMin, int xMax, int yMax){if (isValid){for (int i = 0, imax = mSaved.Count; i < imax; ++i){BMGlyph glyph = mSaved[i];if (glyph != null) glyph.Trim(xMin, yMin, xMax, yMax);}}} } using UnityEngine; using UnityEditor; public class BMFontEditor : EditorWindow {[MenuItem("Tools/BMFont Maker")]static public void OpenBMFontMaker(){EditorWindow.GetWindow<BMFontEditor>(false, "BMFont Maker", true).Show();}[SerializeField]private Font targetFont;[SerializeField]private TextAsset fntData;[SerializeField]private Material fontMaterial;[SerializeField]private Texture2D fontTexture;private BMFont bmFont = new BMFont();public BMFontEditor(){}void OnGUI(){targetFont = EditorGUILayout.ObjectField("Target Font", targetFont, typeof(Font), false) as Font;fntData = EditorGUILayout.ObjectField("Fnt Data", fntData, typeof(TextAsset), false) as TextAsset;fontMaterial = EditorGUILayout.ObjectField("Font Material", fontMaterial, typeof(Material), false) as Material;fontTexture = EditorGUILayout.ObjectField("Font Texture", fontTexture, typeof(Texture2D), false) as Texture2D;if (GUILayout.Button("Create BMFont")){BMFontReader.Load(bmFont, fntData.name, fntData.bytes); // 借用NGUI封裝的讀取類CharacterInfo[] characterInfo = new CharacterInfo[bmFont.glyphs.Count];for (int i = 0; i < bmFont.glyphs.Count; i++){BMGlyph bmInfo = bmFont.glyphs[i];CharacterInfo info = new CharacterInfo();info.index = bmInfo.index;info.uv.x = (float)bmInfo.x / (float)bmFont.texWidth;info.uv.y = 1 - (float)bmInfo.y / (float)bmFont.texHeight;info.uv.width = (float)bmInfo.width / (float)bmFont.texWidth;info.uv.height = -1f * (float)bmInfo.height / (float)bmFont.texHeight;info.vert.x = 0;info.vert.y = -(float)bmInfo.height;info.vert.width = (float)bmInfo.width;info.vert.height = (float)bmInfo.height;info.width = (float)bmInfo.advance;characterInfo[i] = info;}targetFont.characterInfo = characterInfo;if (fontMaterial){fontMaterial.mainTexture = fontTexture;}targetFont.material = fontMaterial;fontMaterial.shader = Shader.Find("UI/Default");Debug.Log("create font <" + targetFont.name + "> success");Close();}EditorUtility.SetDirty(targetFont);} } //---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright ? 2011-2015 Tasharen Entertainment //---------------------------------------------- using UnityEngine; using UnityEditor; using System.Text; /// <summary> /// Helper class that takes care of loading BMFont's glyph information from the specified byte array. /// This functionality is not a part of BMFont anymore because Flash export option can't handle System.IO functions. /// </summary> public static class BMFontReader {/// <summary>/// Helper function that retrieves the string value of the key=value pair./// </summary>static string GetString (string s){int idx = s.IndexOf('=');return (idx == -1) ? "" : s.Substring(idx + 1);}/// <summary>/// Helper function that retrieves the integer value of the key=value pair./// </summary>static int GetInt (string s){int val = 0;string text = GetString(s); #if UNITY_FLASHtry { val = int.Parse(text); } catch (System.Exception) { } #elseint.TryParse(text, out val); #endifreturn val;}/// <summary>/// Reload the font data./// </summary>static public void Load (BMFont font, string name, byte[] bytes){font.Clear();if (bytes != null){ByteReader reader = new ByteReader(bytes);char[] separator = new char[] { ' ' };while (reader.canRead){string line = reader.ReadLine();if (string.IsNullOrEmpty(line)) break;string[] split = line.Split(separator, System.StringSplitOptions.RemoveEmptyEntries);int len = split.Length;if (split[0] == "char"){// Expected data style:// char id=13 x=506 y=62 width=3 height=3 xoffset=-1 yoffset=50 xadvance=0 page=0 chnl=15int channel = (len > 10) ? GetInt(split[10]) : 15;if (len > 9 && GetInt(split[9]) > 0){Debug.LogError("Your font was exported with more than one texture. Only one texture is supported by NGUI.\n" +"You need to re-export your font, enlarging the texture's dimensions until everything fits into just one texture.");break;}if (len > 8){int id = GetInt(split[1]);BMGlyph glyph = font.GetGlyph(id, true);if (glyph != null){glyph.x = GetInt(split[2]);glyph.y = GetInt(split[3]);glyph.width = GetInt(split[4]);glyph.height = GetInt(split[5]);glyph.offsetX = GetInt(split[6]);glyph.offsetY = GetInt(split[7]);glyph.advance = GetInt(split[8]);glyph.channel = channel;}else Debug.Log("Char: " + split[1] + " (" + id + ") is NULL");}else{Debug.LogError("Unexpected number of entries for the 'char' field (" + name + ", " + split.Length + "):\n" + line);break;}}else if (split[0] == "kerning"){// Expected data style:// kerning first=84 second=244 amount=-5if (len > 3){int first = GetInt(split[1]);int second = GetInt(split[2]);int amount = GetInt(split[3]);BMGlyph glyph = font.GetGlyph(second, true);if (glyph != null) glyph.SetKerning(first, amount);}else{Debug.LogError("Unexpected number of entries for the 'kerning' field (" +name + ", " + split.Length + "):\n" + line);break;}}else if (split[0] == "common"){// Expected data style:// common lineHeight=64 base=51 scaleW=512 scaleH=512 pages=1 packed=0 alphaChnl=1 redChnl=4 greenChnl=4 blueChnl=4if (len > 5){font.charSize = GetInt(split[1]);font.baseOffset = GetInt(split[2]);font.texWidth = GetInt(split[3]);font.texHeight = GetInt(split[4]);int pages = GetInt(split[5]);if (pages != 1){Debug.LogError("Font '" + name + "' must be created with only 1 texture, not " + pages);break;}}else{Debug.LogError("Unexpected number of entries for the 'common' field (" +name + ", " + split.Length + "):\n" + line);break;}}else if (split[0] == "page"){// Expected data style:// page id=0 file="textureName.png"if (len > 2){font.spriteName = GetString(split[2]).Replace("\"", "");font.spriteName = font.spriteName.Replace(".png", "");font.spriteName = font.spriteName.Replace(".tga", "");}}}}} } //---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright ? 2011-2015 Tasharen Entertainment //---------------------------------------------- using UnityEngine; using System.Collections.Generic; /// <summary> /// Glyph structure used by BMFont. For more information see http://www.angelcode.com/products/bmfont/ /// </summary> [System.Serializable] public class BMGlyph {public int index; // Index of this glyph (used by BMFont)public int x; // Offset from the left side of the texture to the left side of the glyphpublic int y; // Offset from the top of the texture to the top of the glyphpublic int width; // Glyph's width in pixelspublic int height; // Glyph's height in pixelspublic int offsetX; // Offset to apply to the cursor's left position before drawing this glyphpublic int offsetY; // Offset to apply to the cursor's top position before drawing this glyphpublic int advance; // How much to move the cursor after printing this characterpublic int channel; // Channel mask (in most cases this will be 15 (RGBA, 1+2+4+8)public List<int> kerning;/// <summary>/// Retrieves the special amount by which to adjust the cursor position, given the specified previous character./// </summary>public int GetKerning (int previousChar){if (kerning != null && previousChar != 0){for (int i = 0, imax = kerning.Count; i < imax; i += 2)if (kerning[i] == previousChar)return kerning[i + 1];}return 0;}/// <summary>/// Add a new kerning entry to the character (or adjust an existing one)./// </summary>public void SetKerning (int previousChar, int amount){if (kerning == null) kerning = new List<int>();for (int i = 0; i < kerning.Count; i += 2){if (kerning[i] == previousChar){kerning[i + 1] = amount;return;}}kerning.Add(previousChar);kerning.Add(amount);}/// <summary>/// Trim the glyph, given the specified minimum and maximum dimensions in pixels./// </summary>public void Trim (int xMin, int yMin, int xMax, int yMax){int x1 = x + width;int y1 = y + height;if (x < xMin){int offset = xMin - x;x += offset;width -= offset;offsetX += offset;}if (y < yMin){int offset = yMin - y;y += offset;height -= offset;offsetY += offset;}if (x1 > xMax) width -= x1 - xMax;if (y1 > yMax) height -= y1 - yMax;} } //---------------------------------------------- // NGUI: Next-Gen UI kit // Copyright ? 2011-2015 Tasharen Entertainment //---------------------------------------------- using UnityEngine; using System.Text; using System.Collections.Generic; using System.IO; /// <summary> /// MemoryStream.ReadLine has an interesting oddity: it doesn't always advance the stream's position by the correct amount: /// http://social.msdn.microsoft.com/Forums/en-AU/Vsexpressvcs/thread/b8f7837b-e396-494e-88e1-30547fcf385f /// Solution? Custom line reader with the added benefit of not having to use streams at all. /// </summary> public class ByteReader {byte[] mBuffer;int mOffset = 0;public ByteReader (byte[] bytes) { mBuffer = bytes; }public ByteReader (TextAsset asset) { mBuffer = asset.bytes; }/// <summary>/// Read the contents of the specified file and return a Byte Reader to work with./// </summary>static public ByteReader Open (string path){ #if UNITY_EDITOR || (!UNITY_FLASH && !NETFX_CORE && !UNITY_WP8 && !UNITY_WP_8_1)FileStream fs = File.OpenRead(path);if (fs != null){fs.Seek(0, SeekOrigin.End);byte[] buffer = new byte[fs.Position];fs.Seek(0, SeekOrigin.Begin);fs.Read(buffer, 0, buffer.Length);fs.Close();return new ByteReader(buffer);} #endifreturn null;}/// <summary>/// Whether the buffer is readable./// </summary>public bool canRead { get { return (mBuffer != null && mOffset < mBuffer.Length); } }/// <summary>/// Read a single line from the buffer./// </summary>static string ReadLine (byte[] buffer, int start, int count){ #if UNITY_FLASH// Encoding.UTF8 is not supported in Flash :(StringBuilder sb = new StringBuilder();int max = start + count;for (int i = start; i < max; ++i){byte byte0 = buffer[i];if ((byte0 & 128) == 0){// If an UCS fits 7 bits, its coded as 0xxxxxxx. This makes ASCII character represented by themselvessb.Append((char)byte0);}else if ((byte0 & 224) == 192){// If an UCS fits 11 bits, it is coded as 110xxxxx 10xxxxxxif (++i == count) break;byte byte1 = buffer[i];int ch = (byte0 & 31) << 6;ch |= (byte1 & 63);sb.Append((char)ch);}else if ((byte0 & 240) == 224){// If an UCS fits 16 bits, it is coded as 1110xxxx 10xxxxxx 10xxxxxxif (++i == count) break;byte byte1 = buffer[i];if (++i == count) break;byte byte2 = buffer[i];if (byte0 == 0xEF && byte1 == 0xBB && byte2 == 0xBF){// Byte Order Mark -- generally the first 3 bytes in a Windows-saved UTF-8 file. Skip it.}else{int ch = (byte0 & 15) << 12;ch |= (byte1 & 63) << 6;ch |= (byte2 & 63);sb.Append((char)ch);}}else if ((byte0 & 248) == 240){// If an UCS fits 21 bits, it is coded as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxif (++i == count) break;byte byte1 = buffer[i];if (++i == count) break;byte byte2 = buffer[i];if (++i == count) break;byte byte3 = buffer[i];int ch = (byte0 & 7) << 18;ch |= (byte1 & 63) << 12;ch |= (byte2 & 63) << 6;ch |= (byte3 & 63);sb.Append((char)ch);}}return sb.ToString(); #elsereturn Encoding.UTF8.GetString(buffer, start, count); #endif}/// <summary>/// Read a single line from the buffer./// </summary>public string ReadLine () { return ReadLine(true); }/// <summary>/// Read a single line from the buffer./// </summary>public string ReadLine (bool skipEmptyLines){int max = mBuffer.Length;// Skip empty charactersif (skipEmptyLines){while (mOffset < max && mBuffer[mOffset] < 32) ++mOffset;}int end = mOffset;if (end < max){for (; ; ){if (end < max){int ch = mBuffer[end++];if (ch != '\n' && ch != '\r') continue;}else ++end;string line = ReadLine(mBuffer, mOffset, end - mOffset - 1);mOffset = end;return line;}}mOffset = max;return null;}/// <summary>/// Assume that the entire file is a collection of key/value pairs./// </summary>public Dictionary<string, string> ReadDictionary (){Dictionary<string, string> dict = new Dictionary<string, string>();char[] separator = new char[] { '=' };while (canRead){string line = ReadLine();if (line == null) break;if (line.StartsWith("//")) continue; #if UNITY_FLASHstring[] split = line.Split(separator, System.StringSplitOptions.RemoveEmptyEntries); #elsestring[] split = line.Split(separator, 2, System.StringSplitOptions.RemoveEmptyEntries); #endifif (split.Length == 2){string key = split[0].Trim();string val = split[1].Trim().Replace("\\n", "\n");dict[key] = val;}}return dict;}static BetterList<string> mTemp = new BetterList<string>();/// <summary>/// Read a single line of Comma-Separated Values from the file./// </summary>public BetterList<string> ReadCSV (){mTemp.Clear();string line = "";bool insideQuotes = false;int wordStart = 0;while (canRead){if (insideQuotes){string s = ReadLine(false);if (s == null) return null;s = s.Replace("\\n", "\n");line += "\n" + s;}else{line = ReadLine(true);if (line == null) return null;line = line.Replace("\\n", "\n");wordStart = 0;}for (int i = wordStart, imax = line.Length; i < imax; ++i){char ch = line[i];if (ch == ','){if (!insideQuotes){mTemp.Add(line.Substring(wordStart, i - wordStart));wordStart = i + 1;}}else if (ch == '"'){if (insideQuotes){if (i + 1 >= imax){mTemp.Add(line.Substring(wordStart, i - wordStart).Replace("\"\"", "\""));return mTemp;}if (line[i + 1] != '"'){mTemp.Add(line.Substring(wordStart, i - wordStart).Replace("\"\"", "\""));insideQuotes = false;if (line[i + 1] == ','){++i;wordStart = i + 1;}}else ++i;}else{wordStart = i + 1;insideQuotes = true;}}}if (wordStart < line.Length){if (insideQuotes) continue;mTemp.Add(line.Substring(wordStart, line.Length - wordStart));}return mTemp;}return null;} }

?

總結(jié)

以上是生活随笔為你收集整理的Unity美术字体教程--BMFont美术字体的制作流程以及在unity中美术字体的生成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

爱色婷婷 | 日韩三级视频在线看 | 91在线观 | 国产三级av在线 | 国产亚洲欧美精品久久久久久 | 久久免费播放 | 欧美日韩在线电影 | 亚洲精品国偷自产在线91正片 | 久草视频一区 | 麻豆视频入口 | 国产精品一区二区 91 | 激情五月开心 | 91亚洲网| 欧美成人性战久久 | 国产第一福利 | 天天操天天操一操 | 六月天色婷婷 | 国产成人在线一区 | 91成人在线网站 | 中文字幕在线字幕中文 | 精品国产伦一区二区三区观看体验 | 精品在线一区二区三区 | 国产亚洲在线观看 | 国产精品久久99综合免费观看尤物 | 在线观看国产麻豆 | 能在线看的av | 国产精品video爽爽爽爽 | 色丁香色婷婷 | 日韩视频免费观看高清完整版在线 | 99精品在线观看视频 | 五月婷婷中文网 | 久久久久久久久久久久久久av | 亚洲人成人在线 | 狠狠干干 | 色综合久久综合中文综合网 | 韩国av电影网 | 91少妇精拍在线播放 | 国产精品一区二区在线 | 久久免费精品 | 国产一区在线精品 | 日韩三区在线 | 伊人久久av | av黄色一级片 | 国产精品亚洲精品 | 日韩视频免费观看高清完整版在线 | 一级久久精品 | 欧美一级性视频 | 五月天精品视频 | 久久免费成人精品视频 | 精品成人a区在线观看 | 精品一区二区免费 | 中文字幕精品三区 | 国产日韩欧美在线观看 | 精品亚洲在线 | 狠狠狠狠狠狠狠 | 亚洲最新视频在线播放 | 久久久久久久久久久久久9999 | 麻豆久久精品 | 一区二区三区四区精品视频 | 日本中文字幕视频 | 日本69hd| 精品国产一区二区在线 | 91chinese在线 | 国产91学生| 在线av资源| 大荫蒂欧美视频另类xxxx | 国产精品igao视频网网址 | 日韩免费一区二区在线观看 | 久草视频中文在线 | 免费视频你懂的 | 人人盈棋牌 | 免费色婷婷 | 97人人添人澡人人爽超碰动图 | 特级黄色视频毛片 | 国产成人av一区二区三区在线观看 | 婷婷激情av| 毛片视频电影 | 国产乱对白刺激视频不卡 | 在线看成人 | 黄色特一级片 | 视频在线观看亚洲 | 久久久久久久网 | av经典在线| 国产一区二区在线观看免费 | 国产又黄又猛又粗 | 91九色成人| 欧美日韩国产精品一区二区亚洲 | 国产美女精品视频 | 狠色狠色综合久久 | 久久黄色网 | 久久精品一区二区三区四区 | 超碰在线人人爱 | 蜜臀aⅴ国产精品久久久国产 | 摸阴视频 | 四虎免费在线观看视频 | 亚洲区二区 | 成人性生交大片免费看中文网站 | 久久99精品久久久久婷婷 | 免费看一及片 | 九九热免费视频在线观看 | 亚洲一区二区三区在线看 | 久久精品视 | 毛片1000部免费看 | 97国产在线视频 | 天天干天天干天天操 | 亚洲综合在线观看视频 | 狠狠干夜夜爽 | 天天激情综合网 | 色综合激情网 | 成人毛片在线观看 | 久久99欧美 | 免费观看性生活大片 | 国产黄色免费看 | 亚洲精品456在线播放乱码 | 欧美在线视频一区二区三区 | 超碰在线公开免费 | 91私密视频 | 国产高清免费av | 日韩久久精品一区二区三区下载 | 特片网久久 | 外国av网| 久久久久www | 99免费视频| 六月丁香综合 | 国产一级不卡视频 | 日韩精品免费一线在线观看 | 久久免费看毛片 | 国产精品成人在线观看 | 久久嗨| 久久久久久电影 | 天天艹天天操 | 99色精品视频 | 国产91精品一区二区绿帽 | 干 操 插| 免费看污污视频的网站 | 黄在线免费看 | 国产视频一| 日韩三级免费观看 | 中文字幕电影在线 | 久久久久久高清 | 日韩中文字幕在线观看 | 欧美一区二区精品在线 | 免费网站黄 | 人操人| 视频在线一区 | 香蕉视频在线视频 | 激情欧美一区二区三区 | 亚洲精品午夜久久久 | 一本大道久久精品懂色aⅴ 五月婷社区 | 精品在线观看一区二区三区 | 国产91成人| 日韩专区在线 | aaa免费毛片 | 美女黄频在线观看 | 一本色道久久综合亚洲二区三区 | 97电影院网| 精品亚洲成人 | 色婷婷婷 | 久久久www免费电影网 | 久久午夜色播影院免费高清 | 久久综合网色—综合色88 | 在线观看国产亚洲 | 欧美一级性生活片 | www.久久成人 | 久久久国产毛片 | 欧美综合色在线图区 | 久久成人午夜视频 | 亚洲午夜久久久影院 | 最近中文字幕免费大全 | 亚洲精品视频一二三 | 欧美一级视频在线观看 | 精品五月天 | 国产精久久久久久妇女av | 在线看黄网站 | 91久久精品一区二区三区 | 婷婷综合导航 | 国产成人l区| 绯色av一区 | 成人黄色电影在线播放 | 日韩精品一区在线观看 | 午夜电影av | 超碰97人人干 | 日韩精品欧美视频 | www.福利视频 | 美女国产免费 | 在线看成人av | 国产专区视频在线观看 | 国产免费成人 | a午夜电影| 69国产精品视频 | 精品免费一区二区三区 | 狠狠色伊人亚洲综合网站色 | 综合成人在线 | 日韩欧美视频在线免费观看 | 狠狠狠色丁香综合久久天下网 | 美女免费黄视频网站 | 亚洲精品视频在线看 | 中文字幕成人在线 | av日韩av| 久久婷婷一区二区三区 | 爱av在线网| 午夜精品av | 天天综合网入口 | 日韩精品久久久久久中文字幕8 | 国产精品第一 | 久久视 | 香蕉视频久久久 | 正在播放国产一区 | 在线黄色毛片 | 夜夜躁狠狠躁日日躁视频黑人 | 在线免费视频a | 狠狠干夜夜 | 久久99婷婷 | 一区二区三区精品在线 | 中文字幕精品三区 | 精品成人免费 | 国产精品日韩精品 | 中文字幕刺激在线 | 久久免费精品一区二区三区 | 亚洲一区美女视频在线观看免费 | 91精品国产九九九久久久亚洲 | 成人网页在线免费观看 | 操操操av | a天堂中文在线 | 综合铜03| 国产午夜三级一二三区 | 在线观看黄色 | 91色蜜桃 | 久久久黄色免费网站 | 天天干天天怕 | 国产综合精品一区二区三区 | 欧美在线视频日韩 | 在线视频亚洲 | 九九久久国产 | 久久成人黄色 | 久草精品在线观看 | av在线亚洲天堂 | 免费视频 三区 | 免费在线国产精品 | 69亚洲精品 | 亚洲国产日韩精品 | 亚洲国产免费 | 精品国产福利在线 | 丝袜av一区| 国产亚洲精品免费 | 色综合五月天 | 亚洲极色 | 色婷婷久久 | 久久免费视频8 | 91免费观看视频网站 | 免费日韩电影 | 最新日韩视频在线观看 | 亚洲精品在线看 | 日韩大片免费在线观看 | 久久的色 | 97视频网站 | 五月天色中色 | 亚洲理论片 | 久久久久久久久久网站 | 2023亚洲精品国偷拍自产在线 | 九九久久久久久久久激情 | 精品久久九九 | 91高清一区| 久草在线视频首页 | 国产精品久久久久久久久久妇女 | 久久免费视频6 | www.久草.com| 亚洲最快最全在线视频 | 国产乱对白刺激视频在线观看女王 | 国内精品视频一区二区三区八戒 | 97在线视频免费播放 | 九九精品视频在线看 | 99综合久久 | 亚洲va欧美va人人爽 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 日韩大片在线免费观看 | 特片网久久| 国产99精品在线观看 | 美女免费电影 | 成人免费色| 狠狠的日日 | 亚洲 欧美 另类人妖 | 国产一级二级视频 | 国产精品成人aaaaa网站 | 免费网站黄 | 丁香激情综合 | 人人澡澡人人 | 在线免费观看欧美日韩 | 97精品电影院 | 亚洲爽爽网 | 免费在线观看的av网站 | 三级黄色理论片 | 99热精品国产一区二区在线观看 | 中文字幕日韩精品有码视频 | 在线免费试看 | 在线看国产一区 | 日韩欧美视频在线观看免费 | 97人人模人人爽人人少妇 | 天天操夜夜叫 | www.天天操.com | 国产伦精品一区二区三区高清 | 国产日韩欧美在线播放 | 日韩av电影国产 | 色噜噜日韩精品一区二区三区视频 | 色在线免费观看 | 在线va网站 | 国产在线色站 | www.久久婷婷 | 国产精品午夜久久久久久99热 | 久久视频这里只有精品 | 少妇自拍av | 99人久久精品视频最新地址 | 中文乱码视频在线观看 | 中文字幕在线免费看线人 | 日韩午夜大片 | 日韩精品在线观看视频 | 日本精品一区二区在线观看 | 亚洲精品一区二区精华 | 奇米影视在线99精品 | 蜜桃视频成人在线观看 | 亚洲资源视频 | 天天综合天天做天天综合 | 激情五月婷婷激情 | 日韩欧美在线播放 | 国产又黄又爽又猛视频日本 | 久久污视频 | 2018好看的中文在线观看 | 亚洲精品综合一二三区在线观看 | 免费激情在线电影 | 奇米网网址 | 日韩成人xxxx | 在线国产视频一区 | 波多野结衣久久资源 | 青青草华人在线视频 | 在线成人高清电影 | 夜又临在线观看 | 日韩av手机在线看 | 在线观看av片 | 久久一二区 | 最新高清无码专区 | 精品国产一区二区三区噜噜噜 | 超碰在线观看av.com | 免费的成人av | 婷色在线 | 日韩字幕在线观看 | 五月综合色 | 色综合色综合久久综合频道88 | 中文视频一区二区 | 免费看黄色91 | 精品国产一区二区三区久久久 | 国产高清久久久 | 成人免费观看电影 | 亚洲天堂精品视频在线观看 | 精品久久久久久久久久久久久久久久久久 | 天天操天天爱天天爽 | 久久视频精品在线观看 | 久久久这里有精品 | 中文字幕丝袜美腿 | 亚洲综合欧美精品电影 | 特级黄录像视频 | 四月婷婷在线观看 | 九九热精品在线 | 精品视频在线免费 | 欧美ⅹxxxxxx | 欧美另类网站 | 91在线视频 | 国内精品久久久久影院一蜜桃 | 精品一区二区三区久久久 | 九九视频这里只有精品 | 激情五月婷婷激情 | 亚州精品成人 | 亚洲爱视频 | 人人射人人爱 | 成人午夜黄色影院 | 综合婷婷久久 | 欧美日韩中文国产一区发布 | 波多野结衣小视频 | 精品久久久久久亚洲综合网 | 美女视频免费精品 | 99免费看片 | 日日爽天天操 | 国产精品福利在线播放 | 国产在线黄色 | 日本一区二区不卡高清 | 欧美一区二区伦理片 | 免费午夜网站 | 超碰在线观看av.com | 在线91av | 综合网中文字幕 | 国产九色在线播放九色 | 手机av电影在线观看 | 99资源网 | 激情影音先锋 | 97在线播放| 日韩免费在线播放 | 精品99免费 | 九七人人干 | 九九99 | 免费黄色小网站 | 久久成人精品电影 | 国产精品福利在线观看 | 天天插天天 | 久久夜色精品国产欧美乱极品 | 亚洲视频综合 | 免费欧美高清视频 | 婷婷亚洲五月色综合 | 免费看片在线观看 | 8x成人免费视频 | 久久久www成人免费毛片麻豆 | a级黄色片视频 | 中文字幕成人一区 | 五月婷婷视频在线 | 91精品综合在线观看 | 亚洲成av人影院 | 国产韩国日本高清视频 | 久久久精品久久日韩一区综合 | 亚洲成人av片在线观看 | 999久久国产精品免费观看网站 | 天天干天天操av | 91毛片视频 | 国产精品久久久久久久久久白浆 | 日韩精品视频免费 | 啪啪免费观看网站 | 国产vs久久| 欧美日韩视频一区二区 | 亚洲一区二区观看 | 久久精品看片 | 久久视频99 | 久久国产精品久久精品国产演员表 | 午夜精品久久久久久中宇69 | 亚洲激情在线视频 | 99国产精品一区二区 | 国内久久视频 | 日韩免费一二三区 | 97狠狠干 | 欧美在线观看视频一区二区 | 欧美日韩xxxxx | 国产中的精品av小宝探花 | 久久久久久久久久久成人 | 91黄视频在线观看 | 精品国产一区二区在线 | 久久在线观看 | 狠狠干天天干 | 免费日韩一区二区三区 | 日日干夜夜草 | 波多野结衣在线观看一区 | 久久综合久色欧美综合狠狠 | 91看片看淫黄大片 | 亚洲精品免费在线 | 国产精品久久久99 | 国产日韩精品一区二区 | 成人国产网址 | 国产另类xxxxhd高清 | 97超碰在线资源 | 亚洲国产精品成人av | 日韩av三区 | 久久久穴 | free. 性欧美.com | 精品黄色片 | 男女啪啪网站 | 国产精品成| 91色网址| 亚洲专区视频在线观看 | 最近中文字幕mv免费高清在线 | 欧美性春潮| 99re久久资源最新地址 | 欧美福利久久 | 国产精品人人做人人爽人人添 | 中文字幕免费观看 | 久久99亚洲热视 | 国产精品系列在线观看 | 五月开心激情 | 日韩免费一区二区三区 | 久久91久久久久麻豆精品 | 精品专区一区二区 | 国产艹b视频 | 午夜精品久久久久久久99热影院 | 美女免费视频一区 | 色婷婷电影网 | 国产精品久久久久久久久久白浆 | 久久免费成人 | 黄色毛片一级片 | 午夜视频导航 | 久久国产精品免费一区 | 国产五月婷| 日韩电影在线观看一区二区 | 香蕉在线视频观看 | 成人av网址大全 | 日韩免费在线观看视频 | 久久黄色网址 | 91传媒激情理伦片 | 蜜桃av人人夜夜澡人人爽 | 亚洲人精品午夜 | 午夜精品久久久久 | 久久国产精品99久久久久 | 亚洲欧洲精品一区二区 | 久久久久亚洲国产精品 | av在线电影网站 | 九九热久久免费视频 | 国产婷婷精品 | 亚洲精品资源在线 | 成 人 黄 色 视频免费播放 | 激情电影影院 | 天天射天天爽 | 免费看的黄网站 | 婷婷六月中文字幕 | 亚洲午夜在线视频 | 又黄又爽又湿又无遮挡的在线视频 | 欧美韩国日本在线观看 | 国产精品 国内视频 | 91在线小视频 | 麻豆影视网 | 综合色播| 国产资源免费在线观看 | 久久成年视频 | 欧美精品天堂 | h动漫中文字幕 | 亚洲精品乱码久久久久久蜜桃动漫 | 成人黄色在线 | 国产美女在线精品免费观看 | www.狠狠干 | 日韩午夜剧场 | 久久精品一区二区三区国产主播 | 狠狠综合久久 | 91亚洲国产成人久久精品网站 | 国产剧在线观看片 | 91精品无人成人www | 黄网站app在线观看免费视频 | 东方av免费在线观看 | 黄色国产区 | 亚洲爱爱视频 | 亚洲一级黄色av | 丁香婷婷综合色啪 | 免费av在线网站 | 日韩精品国产一区 | 久久免费福利 | 一区二区不卡视频在线观看 | 久久综合五月天 | 日韩成人看片 | 日韩伦理片hd | 久久久免费精品国产一区二区 | 99热国内精品 | 草久久av| 亚洲精品在线看 | 欧美日韩一区二区三区不卡 | 亚洲成av人片 | 国产探花在线看 | av电影久久 | 99国产在线观看 | 国产视频精品免费播放 | 色婷婷福利视频 | 天天干,夜夜操 | 99精品国产99久久久久久福利 | 精品欧美一区二区在线观看 | 日韩欧美精品一区二区三区经典 | 日韩亚洲国产精品 | 婷婷久操| 91中文字幕永久在线 | 天天射色综合 | 久久精品欧美 | 91在线91 | 国产精品久久久久久99 | 国产精品精品国产婷婷这里av | 热久久精品在线 | 91九色视频在线观看 | 99久久99久久免费精品蜜臀 | 欧美老少交 | 99精品影视| 亚洲国产精品激情在线观看 | 波多野结衣一区 | 亚洲天堂自拍视频 | 天天干天天操天天干 | 视频在线观看日韩 | 免费福利片2019潦草影视午夜 | 欧美日韩视频 | 日韩视频一区二区三区 | 蜜臀av夜夜澡人人爽人人桃色 | 国产精品 中文字幕 亚洲 欧美 | 国内成人精品2018免费看 | 久久久久久综合网天天 | 久久久久国产a免费观看rela | 久久久久久久久久影视 | 99热最新在线 | 久草免费福利在线观看 | 久久99精品久久久久婷婷 | 伊人久久av | 在线一区观看 | 视频91| 亚洲一区视频在线播放 | 亚洲人成在线观看 | 欧美 亚洲 另类 激情 另类 | 久久精品视频在线观看 | 99热只有精品在线观看 | 色婷婷视频| 成 人 黄 色 视频 免费观看 | 激情欧美丁香 | 国产精品系列在线播放 | 久久不卡视频 | 精品久久久精品 | 成人av电影在线播放 | 99精品欧美一区二区三区黑人哦 | 久久福利剧场 | 婷婷综合视频 | 成人中文字幕+乱码+中文字幕 | 在线不卡中文字幕播放 | 国产视频2 | 日本美女xx| 91porny九色91啦中文 | 欧美亚洲久久 | 日本久久片 | 999久久久 | 91黄色视屏 | 天天色天天综合网 | 麻豆视频在线免费 | 欧美精品一区二区免费 | 国产色视频| www久久| 久久日本视频 | 亚洲欧美成人网 | 五月天激情综合 | av九九九| 99精品视频在线观看播放 | 91手机视频 | 美女黄频在线观看 | 青青视频一区 | 亚洲免费av在线播放 | 天天看天天操 | 欧美一二三四在线 | 久久精品波多野结衣 | 成人h视频在线 | 在线免费试看 | 超碰av在线免费观看 | 精品久久久久久一区二区里番 | 69精品久久 | 在线小视频国产 | 久久五月天婷婷 | 香蕉视频在线免费 | 精品一区久久 | 免费亚洲精品 | 国产麻豆剧果冻传媒视频播放量 | 日韩免费在线视频 | 欧美精品乱码99久久影院 | 免费三级黄色片 | 久久精品精品 | 亚洲专区欧美专区 | 黄色av一区二区三区 | 亚洲免费专区 | 亚洲一区二区三区四区在线视频 | 婷婷色狠狠 | 韩国视频一区二区三区 | 免费在线一区二区三区 | 日本精油按摩3 | 国产一区二区三区在线免费观看 | 97精品视频在线播放 | 狠狠狠色丁香婷婷综合激情 | 欧美日韩99 | 91色网址 | 91经典在线| 丰满少妇久久久 | 国产一区二区在线观看免费 | 国产精品电影在线 | 黄色影院在线免费观看 | 综合久久精品 | 国产精品久久久久久久久免费 | 国产精品久久久久av免费 | 最新国产一区二区三区 | 色偷偷88888欧美精品久久久 | 日韩啪视频 | 久久视频免费 | 久久国内视频 | 91九色porny在线 | 国产成人av综合色 | 9在线观看免费 | 亚洲黄色av网址 | 夜色资源站wwwcom | 97成人在线 | 欧美日韩视频在线 | 久草视频免费 | 日韩成人一级大片 | 深爱激情五月网 | 国产精品私人影院 | 国产中的精品av小宝探花 | 欧美福利在线播放 | 精品福利片 | 久草a视频 | 久久综合九色综合欧美狠狠 | 999久久国精品免费观看网站 | 国产精品亚洲成人 | 五月天中文字幕mv在线 | 激情五月播播久久久精品 | 视频 天天草 | 国产99中文字幕 | 人人澡人摸人人添学生av | 亚洲欧美观看 | 99r国产精品 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产精品九九视频 | 免费在线成人av电影 | 国产精品成人自产拍在线观看 | 91精品国产综合久久婷婷香蕉 | 久久色在线播放 | 中文字幕91 | 在线日韩av| 午夜精品一区二区国产 | 九九热国产视频 | 午夜在线看片 | 青青草国产成人99久久 | 久久综合九色九九 | 久操视频在线免费看 | 午夜狠狠干 | 黄色成人在线网站 | 天天摸日日摸人人看 | www.看片网站 | 久久免费毛片视频 | 国产精品久久久久久久久搜平片 | 亚洲网久久 | 美女免费av | 色在线网站 | 久久亚洲综合色 | 在线免费色 | 精品国产乱码久久久久久天美 | 中文字幕一区二区三区视频 | 粉嫩av一区二区三区免费 | 国产美女久久久 | 久久久久久免费毛片精品 | 天天操天 | 97电影院网 | 亚洲午夜精品久久久久久久久久久久 | 丁香视频全集免费观看 | 在线观看日韩中文字幕 | 欧美日韩在线视频免费 | 视频国产在线观看18 | 五月婷av| 国产伦精品一区二区三区照片91 | 最新日韩在线观看视频 | 国产成人av综合色 | 日韩精品一区二区三区中文字幕 | 日本一区二区高清不卡 | 国产69精品久久99的直播节目 | 国产欧美日韩精品一区二区免费 | 久久婷亚洲五月一区天天躁 | 97天天综合网 | 91精品在线播放 | 国产视频在 | 黄色av大片 | 午夜精品久久久久久久99 | 福利网在线 | 一本一本久久a久久精品综合妖精 | 欧美午夜精品久久久久久浪潮 | 国产精品久久久久久久久久 | 这里只有精彩视频 | www.国产视频 | 综合激情av| 91丨九色丨蝌蚪丨对白 | 国产精品毛片久久久久久 | 亚洲伦理电影在线 | 天天做夜夜做 | 日日夜夜精品免费视频 | 超碰人人在线观看 | 国内精品久久久久久久久久清纯 | 黄色精品在线看 | 最近最新最好看中文视频 | 精品色999 | 亚洲激情视频在线观看 | 国内精品久久久久影院男同志 | 久久综合中文字幕 | 国产精品久久久久久久久久了 | 成人av资源 | 日本在线视频一区二区三区 | 免费男女羞羞的视频网站中文字幕 | 日本性生活免费看 | 国产视频一区二区三区在线 | 久久久久久久国产精品视频 | 伊人va| 日韩av二区| 九色91在线 | 国产成人精品午夜在线播放 | 五月开心婷婷 | 天天综合网天天 | 久久综合久久八八 | 九色一区二区 | 青青河边草免费直播 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 久久96国产精品久久99漫画 | 香蕉国产91 | 婷婷精品视频 | 日韩三级视频在线观看 | 天天天综合 | 午夜精品一区二区三区免费视频 | 免费h漫在线观看 | 日日操天天操狠狠操 | 最新的av网站 | 日本高清中文字幕有码在线 | 天天看天天干天天操 | 欧美一区二区三区在线观看 | 日日综合 | 国产精品爽爽爽 | 麻豆免费在线播放 | www.xxx.性狂虐 | 久久久久免费电影 | 天堂素人在线 | 狠狠干我| 黄色一级免费 | 日本99热 | 亚洲精品乱码久久久一二三 | 欧美一级免费高清 | 狠狠色噜噜狠狠狠合久 | 九九热中文字幕 | av在线激情 | 91在线视频观看 | av丁香| 99在线观看免费视频精品观看 | 日日射av| 欧美xxxxx在线视频 | 99精品久久99久久久久 | 国产一级片不卡 | 日日夜夜婷婷 | 啪啪精品 | 亚洲国产人午在线一二区 | 免费进去里的视频 | 国产一区二区久久久 | 99九九热只有国产精品 | 91亚洲精品久久久中文字幕 | 一级黄网| 麻花豆传媒mv在线观看 | 91pony九色丨交换 | 国产精品岛国久久久久久久久红粉 | 国产精品国产亚洲精品看不卡15 | 97国产大学生情侣白嫩酒店 | 国产精品久久久久久久久免费看 | 国产精品成人一区 | 久久免费电影网 | 日韩毛片在线一区二区毛片 | 久青草电影 | 91精品在线免费视频 | 成人一级在线 | 天天色天天色 | 婷婷久久精品 | 91在线视频精品 | 久久免费视频在线观看30 | 欧美视频日韩 | 欧美精品久久久久久久久久 | 欧美日韩视频在线 | 日日夜夜精品视频天天综合网 | 99久久久国产精品美女 | 国语精品免费视频 | 国产精品久久久久久麻豆一区 | 国产精品18久久久 | 在线视频 91 | 久久视频这里只有精品 | 免费在线一区二区三区 | 免费欧美高清视频 | 国产视频精品免费 | 91福利国产在线观看 | 精品高清美女精品国产区 | 激情深爱五月 | 五月婷婷精品 | 成人av影视在线 | 国产精品福利小视频 | 91亚洲夫妻 | 最新av在线播放 | 亚洲精品美女久久久久网站 | 天天爽天天碰狠狠添 | 九九免费在线观看视频 | 99精品在线观看视频 | 亚洲精品男人天堂 | 视频一区二区在线观看 | 国产高清99 | 日韩av免费一区二区 | 国产美女视频免费观看的网站 | 亚洲国产一区在线观看 | 国产免费二区 | 色的网站在线观看 | 手机看片| 97夜夜澡人人爽人人免费 | 国产九色在线播放九色 | 黄色日视频 | av最新资源 | 亚洲成人在线免费 | 亚洲视频h | 狠狠色丁香婷婷综合久久片 | 免费情趣视频 | av中文字幕网站 | 国产成人精品午夜在线播放 | 麻豆综合网| 中文字幕高清免费日韩视频在线 | 午夜 久久 tv | 国产一区在线视频观看 | 美女视频黄是免费的 | 911免费视频 | 日韩网站在线免费观看 | 在线观看91 | 日韩av手机在线看 | 91漂亮少妇露脸在线播放 | 玖玖在线资源 | 亚洲六月丁香色婷婷综合久久 | 欧美成人久久 | a久久久久久 | 亚洲精品午夜视频 | 欧美a√大片 | 天天综合网 天天综合色 | 国内外成人免费在线视频 | 国产精品爽爽爽 | 日本中文在线播放 | 久久公开视频 | www.夜夜操.com| 日韩欧美精品在线视频 | 久久国产精品一二三区 | av福利在线免费观看 | 亚洲综合在线视频 | 黄色片软件网站 | 国产永久免费 | 日韩av不卡播放 | 国产一区在线观看免费 | 九色琪琪久久综合网天天 | 91桃色在线观看视频 | 在线欧美中文字幕 | 成年人免费观看在线视频 | 国产91全国探花系列在线播放 | 国内精品视频在线播放 | 国产精品视频免费看 | 欧美9999 | 福利电影久久 | 婷婷丁香视频 | 四虎影视成人 | 欧美激情va永久在线播放 | 成人教育av| 日韩中文字幕第一页 | 九九亚洲精品 | 久草在线中文视频 | 国产99久久久国产精品免费看 | 久久久久久久久久久久久久电影 | a黄色片| 久久久69 | 欧美大香线蕉线伊人久久 | 天天色播| 五月婷婷在线视频观看 | 国产明星视频三级a三级点| 久久情爱 | 夜夜摸夜夜爽 | 免费无遮挡动漫网站 | 天堂视频一区 | 国产最新视频在线 | 国产精品久一 | 成人午夜影院在线观看 | 免费网站观看www在线观看 | 黄a在线观看 | 国产精品手机在线 | 成年人黄色大全 | 欧美精品久| 99综合电影在线视频 | 久草精品视频在线播放 | www.一区二区三区 | av在线直接看 | 99re视频在线观看 | 久久亚洲美女 | 日本精品一二区 | 九九在线高清精品视频 | 深爱激情亚洲 | 999久久国产精品免费观看网站 | 国产原创在线 | 9免费视频 | 超碰人人在线 | 五月婷婷中文 | 久久综合婷婷国产二区高清 | 91成人在线免费观看 | 国产成人精品一区一区一区 | 青春草免费在线视频 | 国产中文字幕在线看 | 视频一区二区视频 | 中文字幕免费观看视频 | 久久激情网站 | 五月天丁香综合 | 久久99国产精品久久99 | 日韩免费成人av | 91av小视频 | 久久国产视频网站 | 天天操天天干天天操天天干 | 欧美一区二区三区在线视频观看 | 久草国产视频 | 免费观看一级 | 色插综合 | 在线视频国产区 | 色婷婷精品大在线视频 | 中文在线a在线 | 欧美日韩国产色综合一二三四 | 久久国产高清视频 | 日韩高清观看 | 日日干天天爽 | 欧美激情亚洲综合 | 一区二区三区四区在线免费观看 | 免费人人干 | 国产香蕉在线 | 久久热首页 | 狠狠综合网| 亚洲精品乱码久久久一二三 | 久草视频免费在线观看 |