- tải game win 88
Featured image of post  - tải game win 88

- tải game win 88

Tải game win 88 từ trang web uy tín

2017-01-16 12:12:37 am -08:00 •
Tóm tắt ngắn gọn: Sao chép đoạn mã và sử dụng bằng cách gõ textToAddEmoji.Emojify(); winvip.club

1
2
3
4
5
6

Trong quá trình phát triển một trò chơi nhỏ, tôi cần hiển thị các biểu tượng cảm xúc (emoji) để thể hiện tâm trạng của nhân vật tại một số vị trí cụ thể trong văn bản. Ban đầu, tôi sử dụng chức năng Sprite của TextMesh Pro (TMP), tự tạo 8 emoji như sau:

!](

Sau đó, chọn texture phù hợp, tạo một tài sản Sprite mới  đặt  làm tài sản Sprite mặc định. Trong script UGUI của TextMesh Pro, tôi thiết lập thuộc tính `text` theo  pháp sau:

<sprite=1><sprite=1><sprite=1>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

và điều này cho phép hiển thị các biểu tượng theo đúng thứ tự đã thiết lập. Tuy nhiên phương án này có một số hạn chế: TMP là giải pháp hiển thị vector, việc hỗ trợ tiếng Việt không tốt, do đó ở những nơi có cả chữ Hán và tiếng Anh, tôi ưu tiên sử dụng Text tích hợp sẵn của Unity thay vì TextMesh Pro.

Ngoài ra, Unity cũng gặp khó khăn khi xử lý emoji đầu vào – người dùng không thể nhập emoji trực tiếp như trên ô bình thường, nên tôi phải tìm cách ánh xạ một chuỗi ký tự thay thế để lưu trữ emoji trong game.

Đối với vấn đề đầu tiên, tôi đã tìm thấy thư viện **Unity-UI-emoji**, còn đối với vấn đề thứ hai, tôi quyết định áp dụng mô hình tương tự như Slack. Cụ thể, dựa trên cơ sở của Unity-UI-emoji, tôi đã mở rộng thêm khả năng nhận diện và thay thế các ký hiệu alpha code thành emoji Unicode tương ứng.

Dưới đây là hình ảnh minh họa từ Slack về chức năng autocomplete emoji:

![  
Hình ảnh 

Slack mô tả chức năng này như sau: "Slack sử dụng các ký hiệu emoji chuẩn được liệt kê trên Emoji Cheat Sheet."

Cheat Sheet này cung cấp thông tin chính xác mà tôi đang tìm kiếm, nhưng lại được xây dựng bằng Flash. May mắn thay, tôi đã tìm thấy kho GitHub tên là **Emoji Alpha Codes**, cung cấp dữ liệu dưới dạng CSV và JSON. Tôi sử dụng thư viện **MiniJSON** để chuyển đổi JSON sang kiểu Dictionary trong C#.

Ngoài ra, tôi còn đảo ngược dictionary để lấy các ký hiệu alpha code làm key và giá trị emoji Unicode làm value. Dưới đây là đoạn code thực hiện công việc này:

using System.Linq;

public Dictionary<string,string> InitDict () { emojiCodeJSONTextAsset = (TextAsset)Resources.Load(emojiCodeJSONPath, typeof(TextAsset)); deserializedEmojiCodeJSONObject = (Dictionary<string,object>)MiniJSON.Json.Deserialize(emojiCodeJSONTextAsset.text); _reversedCodeEmojiDict = new Dictionary<string, string>(); List arrayOfAllKeys = deserializedEmojiCodeJSONObject.Keys.ToList();

foreach (string key in arrayOfAllKeys)
{
    Dictionary<string,object> subDict = (Dictionary<string,object>)deserializedEmojiCodeJSONObject[key];
    string code = (string)subDict["alpha_code"];
    string unicodeKey = GetConvertedString(key);
    
    _reversedCodeEmojiDict[code] = unicodeKey;
}

return _reversedCodeEmojiDict;

}

private static string GetConvertedString(string inputString) { char[] chars = { ‘-’ }; return string.Join(string.Empty, inputString.Split(chars).Select(hex => char.ConvertFromUtf32(Convert.ToInt32(hex, 16))).ToArray()); }

1
2
3
4

Khi đã  dictionary hoàn chỉnh, tôi tiếp tục nghiên cứu dự án **Unity-UI-emoji**. Giải pháp của   đọc nội dung Text, thay thế emoji bằng khoảng trắng đặc biệt (`emSpace = '\u2001'`) để giữ nguyên độ dài chữ, đồng thời tạo một RawImage  vị trí của emSpace để hiển thị emoji. Tất cả các RawImage sẽ dùng cùng một material để tiết kiệm draw call  tuy nhiên tôi chưa kiểm tra kỹ lưỡng điểm này.

Vấn đề lớn nhất của dự án này  việc đặt vị trí emoji sai lệch trong một số trường hợp phức tạp của Canvas / Text. Trong thử nghiệm [99win club](/mas/9f90aa9d53b24c07.html)  trên game của mình, nhiều emoji bị đẩy ra khỏi màn hình. Do đó, tôi đã sửa đổi hàm `SetUITextThatHasEmoji`, dựa trên gợi ý từ một câu trả lời trên Stack Overflow  một kho BitBucket, đồng thời tham khảo  nguồn gốc của Unity để điều chỉnh lại logic:

// Một RawImage cho mỗi emoji for (int j = 0; j < emojiReplacements.Count; j++) { int emojiIndex = emojiReplacements[j].pos; if (emojiIndex * 4 < textGen.verts.Count) { GameObject newRawImage = GameObject.Instantiate(this.rawImageToClone.gameObject); newRawImage.transform.SetParent(textToEdit.transform);

    Vector2 locUpperLeft = new Vector2(textGen.verts[emojiIndex * 4].position.x, textGen.verts[emojiIndex * 4].position.y);
    Vector2 locBottomRight = new Vector2(textGen.verts[emojiIndex * 4 + 2].position.x, textGen.verts[emojiIndex * 4 + 2].position.y);

    Vector3 mid = (locUpperLeft + locBottomRight) / 2.0f;
    Vector3 size = locBottomRight - locUpperLeft;

    Rect inputRect = textToEdit.rectTransform.rect;
    Vector2 textAnchorPivot = GetTextAnchorPivot(textToEdit.alignment);
    Vector2 refPoint = Vector2.zero;
    refPoint.x = (textAnchorPivot.x == 1 ? inputRect.xMax : inputRect.xMin);
    refPoint.y = (textAnchorPivot.y == 0 ? inputRect.yMin : inputRect.yMax);
    Vector2 roundingOffset = textToEdit.PixelAdjustPoint(refPoint) - refPoint;
    IList<UIVertex> verts = textGen.verts;
    FontData fontData = FontData.defaultFontData;
    fontData.font = textToEdit.font;
    float pixelsPerUnit = 0.0f;
    var localCanvas = GameObject.Find("GameCanvas").GetComponent<Canvas>();

    if (!localCanvas)
    {
        pixelsPerUnit = 1.0f;
    }
    else if (!textToEdit.font || textToEdit.font.dynamic)
    {
        pixelsPerUnit = localCanvas.scaleFactor;
    }
    else
    {
        pixelsPerUnit = textToEdit.font.fontSize / (float)fontData.fontSize;
    }

    float unitsPerPixel = 1 / pixelsPerUnit;
    int vertCount = verts.Count - 4;

    if (roundingOffset != Vector2.zero)
    {
        mid *= unitsPerPixel;
        mid.x += roundingOffset.x;
        mid.y += roundingOffset.y;
    }
    else
    {
        mid *= unitsPerPixel;
    }

    Debug.Log ("EMOJI mid X" + mid.x + " Y " + mid.y + " Z " + mid.z);
    newRawImage.transform.localPosition = mid;

    RawImage ri = newRawImage.GetComponent<RawImage>();
    ri.uvRect = emojiRects[emojiReplacements[j].emoji];
    ri.rectTransform.pivot = new Vector2(0.0f, 0.0f);
    ri.rectTransform.localScale = Vector3.one;
    ri.rectTransform.sizeDelta = Vector2.one * textToEdit.font.lineHeight * unitsPerPixel;
}

}

1
2
3
4

Mặc dù đoạn mã này khá lộn xộn, nhưng nó hoạt động ổn định. Sau khi hoàn thành trò chơi, tôi sẽ dành thời gian để tối ưu và tái cấu trúc lại phần này.

Tiếp theo, tôi mở rộng thêm một phương thức mở rộng cho `UnityEngine.UI.Text`, gọi là `Emojify();`:

static public void Emojify (this UnityEngine.UI.Text self) { if (JZEmojiUITextManager.Instance.reversedCodeEmojiDict == null) { return; }

string currentCodeBasedString = self.text;

// Sử dụng regex để thay thế các alpha code bằng emoji Unicode tương ứng
Dictionary<string,string> map = (Dictionary<string,string>)JZEmojiUITextManager.Instance.reversedCodeEmojiDict;
var regex = new Regex(string.Join("|",map.Keys.ToArray()));
var newStr = regex.Replace(currentCodeBasedString, m => map[m.Value]);

// Thay thế các ký tự '\\' thành '\' để chuẩn hóa chuỗi Unicode
Regex regex1 = new Regex (@"\\U([0-9A-F]{4})", RegexOptions.IgnoreCase);
var newStrUnescape = regex1.Replace (newStr, match [99win club](/mas/9f90aa9d53b24c07.html)  => ((char)int.Parse (match.Groups[1].Value,
    NumberStyles.HexNumber)).ToString ());

JZEmojiUITextManager.Instance.StartCoroutine(JZEmojiUITextManager.Instance.SetUITextThatHasEmoji(self, newStrUnescape));

}

1
2
3
4

Trong đó, `JZEmojiUITextManager`  một class đơn thể (singleton) đơn giản, được sử dụng để quản   lưu trữ dictionary vừa tạo, đồng thời sao chép một phần lớn các phương thức từ dự án Unity-UI-emoji.

Bây giờ, bạn chỉ cần gọi:

textToAddEmoji.Emojify();

1
2
3
4

để hiển thị emoji một cách nhanh chóng và tiện lợi.

Ngoài ra, tôi còn thay thế bộ emoji Twitter bằng bộ emoji iOS, nguồn từ github.com/iamcal/emoji-data. Kết quả cuối cùng trông như sau:

Morning! Here is your new phone. :flag_us: You can reply to new messages by swiping cards to left or right. Different reply will lead to different impact on company valuation and staff happiness. Our goal is to hit $ 1 Billion valuation by the end of the year while keep our staff from leaving.

1
2
3
4

![](

Hy vọng bài viết này giúp bạn hiểu rõ hơn về cách tích hợp và tùy chỉnh hệ thống emoji trong Unity UI. Nếu bạn có bất kỳ câu hỏi hay góp ý nào, đừng ngần ngại chia sẻ nhé!
comments powered by Disqus
Built with Hugo
Theme Stack thiết kế bởi Jimmy