using GameServer.Client; using UnityEngine; using UnityEngine.UI; public class rkPrefab : MonoBehaviour { [SerializeField] private Image buttom_image; [SerializeField] private Text listID; [SerializeField] private Image userProfile; [SerializeField] private Text this_username; [SerializeField] private Text this_submitTime; [SerializeField] private Text this_totalScore; [SerializeField] private Text this_keepOnTime; public void Bind(LeaderboardEntry entry, Sprite backgroundSprite, string formattedSubmitTime) { BindInternal(entry, backgroundSprite, formattedSubmitTime, false); } public void BindRoomRanking(LeaderboardEntry entry, Sprite backgroundSprite, string formattedSubmitTime) { BindInternal(entry, backgroundSprite, formattedSubmitTime, true); } private void BindInternal(LeaderboardEntry entry, Sprite backgroundSprite, string formattedSubmitTime, bool isRoomRanking) { if (entry == null) { return; } if (buttom_image != null) { buttom_image.sprite = backgroundSprite; } if (listID != null) { listID.text = entry.rank.ToString(); } if (this_username != null) { string displayName = string.IsNullOrWhiteSpace(entry.display_name) ? entry.steam_id : entry.display_name; this_username.text = TruncateToFit(this_username, displayName); } if (this_submitTime != null) { this_submitTime.text = formattedSubmitTime; } if (this_totalScore != null) { this_totalScore.text = entry.total_score.ToString(); } if (this_keepOnTime != null) { this_keepOnTime.text = isRoomRanking ? (!string.IsNullOrWhiteSpace(entry.room_status_text) ? entry.room_status_text : "-") : entry.keep_on_time.ToString(); } if (userProfile != null) { userProfile.enabled = false; } } private static string TruncateToFit(Text targetText, string source) { if (targetText == null || string.IsNullOrEmpty(source)) { return source ?? string.Empty; } RectTransform rect = targetText.rectTransform; if (rect == null || rect.rect.width <= 0f) { return source; } float maxWidth = rect.rect.width; if (GetPreferredWidth(targetText, source) <= maxWidth) { return source; } const string ellipsis = "..."; if (GetPreferredWidth(targetText, ellipsis) > maxWidth) { return string.Empty; } int low = 0; int high = source.Length; while (low < high) { int mid = (low + high + 1) / 2; string candidate = source.Substring(0, mid) + ellipsis; if (GetPreferredWidth(targetText, candidate) <= maxWidth) { low = mid; } else { high = mid - 1; } } return low <= 0 ? ellipsis : source.Substring(0, low) + ellipsis; } private static float GetPreferredWidth(Text targetText, string content) { TextGenerationSettings settings = targetText.GetGenerationSettings(Vector2.zero); return targetText.cachedTextGeneratorForLayout.GetPreferredWidth(content, settings) / targetText.pixelsPerUnit; } }