diff --git a/Assets/PerfectWorld/Scene/Bootstrap.unity b/Assets/PerfectWorld/Scene/Bootstrap.unity index 96d7d0ddb7..db4113e554 100644 --- a/Assets/PerfectWorld/Scene/Bootstrap.unity +++ b/Assets/PerfectWorld/Scene/Bootstrap.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:80240cfe7d09ee2bd71e83f71df212818695e4bb1f431eafb04dce66f2ced2a0 -size 323449 +oid sha256:47ff1377fe87865c1bdada70b8f6fee638a20879f70b84b40d62fb978aee203e +size 325051 diff --git a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs index 6979e0c35a..b40a8bf148 100644 --- a/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs +++ b/Assets/PerfectWorld/Scripts/Chat/UI/ChatPanelUI.cs @@ -106,11 +106,12 @@ namespace BrewMonster.Scripts.ChatUI if (_userAtBottom) ScrollToBottom(); } - + void AddMessageView(string msg) { var view = _pool.Get(); view.transform.SetParent(content, false); + view.transform.SetAsLastSibling(); view.Bind(msg); _visibleViews.Add(view); @@ -138,12 +139,14 @@ namespace BrewMonster.Scripts.ChatUI { var view = _pool.Get(); view.transform.SetParent(content, false); + view.transform.SetAsLastSibling(); view.Bind(_messages[i]); _visibleViews.Add(view); } Canvas.ForceUpdateCanvases(); + ScrollToBottom(); } public void ScrollToBottom() @@ -171,4 +174,4 @@ namespace BrewMonster.Scripts.ChatUI RefreshVisible(); } } -} \ No newline at end of file +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs index 9262f072c3..cb9e652961 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/AUICommon.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -28,7 +28,7 @@ namespace CSNetwork enumEINum = enumEICustom + MAXNUM_CUSTOM_ITEM } - public static void AUI_ConvertChatString(string pszChat, char[] pszConv, bool bName) + public static void AUI_ConvertChatString(ref string pszChat, ref char[] pszConv, bool bName) { if (string.IsNullOrEmpty(pszChat) || pszConv == null) return; @@ -320,6 +320,52 @@ namespace CSNetwork return sb.ToString(); } + + /// + /// Chuyển đổi định dạng printf (C-style: %s, %d) sang string.Format (C#-style: {0}, {1}) + /// + public static string ConvertPrintfToCSharpFormat(string format) + { + if (string.IsNullOrEmpty(format)) return ""; + + StringBuilder sb = new StringBuilder(); + int argIndex = 0; + for (int i = 0; i < format.Length; i++) + { + if (format[i] == '%' && i + 1 < format.Length) + { + char next = format[i + 1]; + if (next == '%') // Trường hợp %% -> % + { + sb.Append('%'); + i++; + } + else + { + sb.Append('{').Append(argIndex++).Append('}'); + + i++; + // Nhảy qua các ký tự định dạng (ví dụ: %02d, %ls, %f) + while (i < format.Length && (char.IsDigit(format[i]) || format[i] == '.' || format[i] == 'l' || format[i] == 'u' || format[i] == 'd' || format[i] == 's' || format[i] == 'f' || format[i] == 'x')) + { + // Nếu gặp ký tự kết thúc định dạng (s, d, f, ...) thì dừng lại sau ký tự đó + char c = format[i]; + if (c == 's' || c == 'd' || c == 'f' || c == 'u' || c == 'x' || c == 'g') + { + // i++; // Đã ở đúng vị trí để vòng lặp cha thực hiện i++ tiếp theo + break; + } + i++; + } + } + } + else + { + sb.Append(format[i]); + } + } + return sb.ToString(); + } } } @@ -628,7 +674,7 @@ public class EditBoxItemBase return true; } - + private bool TryParseInt(string text, int start, out int value) { int end = start; @@ -638,7 +684,7 @@ public class EditBoxItemBase return int.TryParse(text.Substring(start, end - start), out value); } - + private bool TryParseUInt(string text, int start, out uint value) { int end = start; @@ -803,4 +849,4 @@ public class EditboxScriptItem { return Data?.Length ?? 0; } -} \ No newline at end of file +} diff --git a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs index 898f0ffcfa..2a2ebbc801 100644 --- a/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs +++ b/Assets/PerfectWorld/Scripts/Network/CSNetwork/GameSession.cs @@ -259,7 +259,7 @@ namespace CSNetwork Debug.Log($"[GameSession] Creating role - UserID: {_currentUserId}, Localsid: {_localsid}, Profession: {roleInfo.occupation}, Gender: {roleInfo.gender}"); Debug.Log($"[GameSession] RoleInfo details - Name size: {roleInfo.name?.Size ?? 0}, Equipment count: {roleInfo.equipment?.Count ?? 0}, Custom data size: {roleInfo.custom_data?.Size ?? 0}, Race: {roleInfo.race}"); - + // Log first few bytes of custom_data for debugging if (roleInfo.custom_data != null && roleInfo.custom_data.Size > 0) { @@ -268,7 +268,7 @@ namespace CSNetwork string hexPreview = BitConverter.ToString(customDataPreview).Replace("-", " "); Debug.Log($"[GameSession] Custom_data preview (first 16 bytes): {hexPreview}"); } - + Debug.Log($"[GameSession] Sending createrole protocol (Type: {createRoleProtocol.Type})"); SendProtocol(createRoleProtocol); } @@ -331,7 +331,7 @@ namespace CSNetwork // Initialize custom data exactly as C++ does: memset to 0, then set specific values // This matches C++ LoadDefaultCustomizeData behavior roleInfo.custom_data = CreateDefaultCustomizeData(profession, gender); - + // Initialize other empty custom data fields roleInfo.custom_status = new Octets(); roleInfo.charactermode = new Octets(); @@ -370,31 +370,31 @@ namespace CSNetwork const int CUSTOMIZE_DATA_SIZE = 176; // Match server expectation (176 bytes from response) const uint CUSTOMIZE_DATA_VERSION = 0x10007001; // CUSTOMIZE_DATA_VERSION from C++ byte[] customDataBytes = new byte[CUSTOMIZE_DATA_SIZE]; - + // Step 1: memset to 0 (already done by new byte[]) - + // Step 2: Set dwVersion at offset 0-3 (little-endian) byte[] versionBytes = BitConverter.GetBytes(CUSTOMIZE_DATA_VERSION); Array.Copy(versionBytes, 0, customDataBytes, 0, 4); - + // Step 3: FACE_CUSTOMIZEDATA at offset 4-87 is already zero (84 bytes) // (In C++ this would be loaded from INI, but for now we use zeros) - + // Step 4: bodyID at offset 88-89 is already zero (2 bytes) // Note: There might be 2 bytes padding here if struct is 4-byte aligned - - // Step 5: Set colorBody to 0xffffffff + + // Step 5: Set colorBody to 0xffffffff // Try offset 90 first (no padding), if that doesn't work try 92 (with padding) byte[] colorBodyBytes = BitConverter.GetBytes(0xffffffffu); Array.Copy(colorBodyBytes, 0, customDataBytes, 90, 4); // Try 90 first - + // Step 6: Set all 6 scale fields to 128 // Try offset 94 first (no padding), if that doesn't work try 96 (with padding) for (int i = 94; i < 100; i++) { customDataBytes[i] = 128; } - + return new Octets(customDataBytes); } @@ -997,7 +997,7 @@ namespace CSNetwork } else if (pCmd.iMessage == 133 || pCmd.iMessage == 134) { - // deal failed + // deal failed //pGameRun.PostMessage(MSG_HST_BUY_SELL_FAIL, MAN_PLAYER, 0, (DWORD)pDataBuf, pCmdHeader.cmd); } else if (pCmd.iMessage == 158) @@ -1343,7 +1343,7 @@ namespace CSNetwork private void HandleCreateRoleResponse(createrole_re protocol) { Debug.Log($"[GameSession] HandleCreateRoleResponse - result: {protocol.result}, roleid: {protocol.roleid}"); - + if (protocol.result != (int)ErrCode.ERR_SUCCESS) { string errorMsg = $"Create role failed with result code: {protocol.result} (ERR_SUCCESS = {(int)ErrCode.ERR_SUCCESS})"; @@ -1364,7 +1364,7 @@ namespace CSNetwork private void HandleErrorInfo(errorinfo protocol) { Debug.LogError($"[GameSession] Server error - Errcode: {protocol.Errcode}"); - + // If we're waiting for create role response and get an error, fail the callback if (_createRoleCallback != null) { @@ -1656,8 +1656,8 @@ namespace CSNetwork g.Data = C2SCommandFactory.CreatePlayerLogoutCmd(outType); SendProtocol(g, complete); } - - + + public void c2s_SendCmdStopMove(in Vector3 vDest, float fSpeed, int iMoveMode, byte byDir, ushort wStamp, int iTime) { @@ -1687,7 +1687,7 @@ namespace CSNetwork { if (string.IsNullOrEmpty(szMsg)) return; - + publicchat p = new publicchat(); p.Channel = cChannel; p.Roleid = m_iCharID; @@ -1727,14 +1727,14 @@ namespace CSNetwork BitConverter.GetBytes(index).CopyTo(bytes, 3); p.Data.Replace(bytes); } - + byte[] unicodeBytes = Encoding.Unicode.GetBytes(szMsg); p.Msg.Replace(unicodeBytes); SendProtocol(p); - - if (cChannel is (byte)ChatChannel.GP_CHAT_LOCAL + + if (cChannel is (byte)ChatChannel.GP_CHAT_LOCAL or (byte)ChatChannel.GP_CHAT_FARCRY - or (byte)ChatChannel.GP_CHAT_SUPERFARCRY + or (byte)ChatChannel.GP_CHAT_SUPERFARCRY or (byte)ChatChannel.GP_CHAT_BATTLE or (byte)ChatChannel.GP_CHAT_COUNTRY) { CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer(); @@ -1761,7 +1761,7 @@ namespace CSNetwork EventBus.Publish(new ChatMessageEvent(szMsg, p.Channel)); } } - + public void LoadConfigData() { getuiconfig p = new getuiconfig(); @@ -1776,7 +1776,7 @@ namespace CSNetwork public void SaveConfigData(byte[] pBuf, int len) { BMLogger.Log($"[MH] Session.SaveConfigData | len={len}"); - + if (pBuf == null || len <= 0) return; var p = new setuiconfig(); p.Roleid = m_iCharID; @@ -1784,7 +1784,7 @@ namespace CSNetwork byte[] slice = new byte[len]; Buffer.BlockCopy(pBuf, 0, slice, 0, len); p.Ui_config = new Octets(slice); - + // return; SendProtocol(p); } @@ -1802,7 +1802,7 @@ namespace CSNetwork OnTaskChatMessage(p.Msg.RawBuffer, p.Msg.Size); return true; }*/ - + // TODO: Porting logic OnPrtcWorldChat hoàn chỉnh từ C++ if needed Debug.Log("[Cuong] OnPrtcWorldChat"); return true; @@ -1818,7 +1818,7 @@ namespace CSNetwork // Tương đương OnBattleChatMessage trong C++ // Hiện tại đơn giản hóa việc hiển thị, thực tế cần parse nội dung Battle cụ thể Debug.Log($"[Battle Chat] RoleID: {p.Srcroleid}"); - return true; + return true; } private bool OnFortressChatMessage(chatmessage p, List pPendingFactions) @@ -1844,7 +1844,7 @@ namespace CSNetwork private bool OnPrtcChatMessage(Protocol pProtocol, bool bCalledagain) { CECGameUIMan pGameUI = EC_Game.GetGameRun().GetUIManager().GetInGameUIMan(); - + chatmessage p = (chatmessage)pProtocol; //var channel = (ChatChannel)p.Channel; Debug.Log("[Cuong] reciver chat channel: " + p.Channel); @@ -1856,7 +1856,7 @@ namespace CSNetwork } EC_IvtrItem pItem = CHAT_S2C.CreateChatItem(p.Data); - + string szMsg = null; string strTemp = Encoding.Unicode.GetString(p.Msg.ToArray(), 0, p.Msg.Length); string strMsgOrigion = strTemp; @@ -1892,14 +1892,14 @@ namespace CSNetwork } break; case 18: case 19: case 20: case 21: case 22: // Auction Message - // pGameUI.AddSysAuctionMessage(...) + // pGameUI.AddSysAuctionMessage(...) Debug.Log("[Auction] " + strTemp); EventBus.Publish(new ChatMessageEvent(strTemp, p.Channel)); break; case 24: // Task Message // OnTaskChatMessage(p.Data.RawBuffer, p.Data.Size); break; - case 29: case 30: case 31: case 32: case 33: case 34: + case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 41: case 42: case 43: case 45: // Fortress Message OnFortressChatMessage(p, null); @@ -1949,18 +1949,18 @@ namespace CSNetwork { Debug.Log("[Cuong] Other 1"); char[] szText = new char[80]; - AUICommon.AUI_ConvertChatString(szName, szText, false); + AUICommon.AUI_ConvertChatString(ref szName,ref szText, false); + string fmt = AUICommon.ConvertPrintfToCSharpFormat(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT)); string str = string.Format( - pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT), + fmt, szName, strTemp ); // Convert to EventBus - - /*EC_Game.GetGameRun().AddChatMessage(strTemp, p.Channel, p.Srcroleid, + /*EC_Game.GetGameRun().AddChatMessage(strTemp, p.Channel, p.Srcroleid, null, 0, p.Emotion, null, strMsgOrigion);*/ - EventBus.Publish(new ChatMessageEvent(strTemp, p.Channel)); + EventBus.Publish(new ChatMessageEvent(str, p.Channel)); // Set player's last said words CECPlayer pPlayer = EC_Game.GetGameRun().GetWorld().GetPlayerMan().GetPlayer(p.Srcroleid); if (pPlayer != null) @@ -1978,14 +1978,14 @@ namespace CSNetwork if (pNPC != null) { string str; - string template = pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT2); + string template = AUICommon.ConvertPrintfToCSharpFormat(pStrTab.GetWideString((int)FixedMsg.FIXMSG_CHAT2)); string message = string.Format( template, pNPC.GetName(), strTemp ); - + EC_Game.GetGameRun().AddChatMessage( message, p.Channel, @@ -2030,7 +2030,7 @@ namespace CSNetwork EC_Game.GetConfigs().ApplyUserSetting(); } - // Now, Get config data request is sent after all host initial data ready. + // Now, Get config data request is sent after all host initial data ready. // so when we receive this reply, we can do some last work before game // really starts. Maybe it's not the best place to do these work, but // now we do it here. @@ -2041,7 +2041,7 @@ namespace CSNetwork pGameUI.EnableUI(true); // Get referral name for adding friend or other display - //TODO: a Hung lam phan select role info di + //TODO: a Hung lam phan select role info di /* RoleInfo info = EC_Game.GetGameRun().GetSelectedRoleInfo(); if (info.referrer_role > 0) GetPlayerBriefInfo(1, info.referrer_role, 2);*/ @@ -2062,7 +2062,7 @@ namespace CSNetwork CECMCDownload::GetInstance().SendGetDownloadOK();*/ } } - + private void OnPrtcSetConfigRe(Protocol pProtocol) { SetUIConfig_Re p = (SetUIConfig_Re)pProtocol; @@ -2072,12 +2072,12 @@ namespace CSNetwork if (CECGameRun.Instance != null) { TestLogoutLogic.Instance.WasClientSendLogoutMessage = true; - + CECGameRun.Instance.GetPendingLogOut().TriggerAll(); CECGameRun.Instance.GetPendingLogOut().Clear(); } } - + private void OnPrtcPlayerBaseInfoRe(Protocol pProtocol) { playerbaseinfo_re p = (playerbaseinfo_re)pProtocol; @@ -2195,7 +2195,7 @@ namespace CSNetwork BYTE* pBuf = (BYTE*)a_malloctemp(iSize); if (!pBuf) return; - + ((cmd_header*)pBuf)->cmd = C2S::GET_OTHER_EQUIP; cmd_get_other_equip* pCmd = (cmd_get_other_equip*)(pBuf + sizeof (cmd_header)); @@ -2212,7 +2212,7 @@ namespace CSNetwork var idlist = new int[iNumSend]; for (int i=0; i < iNumSend; i++) idlist[i] = aIDs[iCount+i]; - + gamedatasend gamedatasend = new gamedatasend(); gamedatasend.Data = C2SCommandFactory.CreateGetOtherEquipCmd(iNumID, idlist); SendProtocol(gamedatasend); @@ -2328,7 +2328,7 @@ namespace CSNetwork gamedatasend.Data = C2SCommandFactory.CreateNakeCmd(C2SCommand.CommandID.STAND_UP); SendProtocol(gamedatasend); } - + public void c2s_SendCmdAutoTeamSetGoal(int type, int goal_id, int op) { gamedatasend gamedatasend = new gamedatasend(); @@ -2416,9 +2416,9 @@ namespace CSNetwork public void c2s_CmdGoto(float x, float y, float z) { - c2s_SendCmdGoto(x, y, z); + c2s_SendCmdGoto(x, y, z); } - + // Send C2S::GOTO command data void c2s_SendCmdGoto(float x, float y, float z) { @@ -2545,7 +2545,7 @@ namespace CSNetwork gamedatasend.Data = C2SCommandFactory.CreateNPCSevRestorePetCmd(iPetIdx); SendProtocol(gamedatasend); } - + // Cross-server get in (C++: c2s_CmdNPCSevCrossServerGetIn) — TODO: implement C2S packet when needed public void c2s_CmdNPCSevCrossServerGetIn() { @@ -2557,6 +2557,6 @@ namespace CSNetwork { // TODO: C2SCommandFactory.CreateNPCSevCrossServerGetOutCmd() and SendProtocol } - + } } diff --git a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs index 0fbd136d8b..9cc7c83ae8 100644 --- a/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs +++ b/Assets/PerfectWorld/Scripts/UI/Login/LoginScreenUI.cs @@ -14,7 +14,7 @@ using UnityEngine.UI; namespace BrewMonster.UI { /// - /// Login Flow: + /// Login Flow: /// 1. Enter username and password /// 2. Click login button /// 3. Login success, get the list of characters @@ -92,13 +92,14 @@ namespace BrewMonster.UI #if UNITY_EDITOR if (Input.GetKeyUp(KeyCode.LeftAlt)) { - _usernameInputField.text = "test004"; + _usernameInputField.text = "test016"; _passwordInputField.text = "123456"; + OnLoginButtonClicked(); } if (Input.GetKeyUp(KeyCode.Tab)) { - _usernameInputField.text = "test002"; + _usernameInputField.text = "test017"; _passwordInputField.text = "123456"; OnLoginButtonClicked(); } @@ -135,7 +136,7 @@ namespace BrewMonster.UI BMLogger.LogError("[LoginScreenUI] Username/password empty."); await BeginGameLoginAsync(_usernameInputField.text, _passwordInputField.text); } - + } private async Task BeginGameLoginAsync(string username, string password) @@ -179,7 +180,7 @@ namespace BrewMonster.UI // If we're returning to select role, skip straight to select role without showing login UI again, since we never fully left the game session. OnLoginComplete(true); return; - + // Auto-login to reach Select Role like the original client, without showing Tech3C auth UI again. if (!string.IsNullOrEmpty(_usernameInputField.text) && !string.IsNullOrEmpty(_passwordInputField.text)) { @@ -192,7 +193,7 @@ namespace BrewMonster.UI } /// - /// Callback when the login is complete. + /// Callback when the login is complete. /// Then get the list of characters /// private void OnLoginComplete(bool result) @@ -214,7 +215,7 @@ namespace BrewMonster.UI } /// - /// Callback when the list of characters is retrieved. + /// Callback when the list of characters is retrieved. /// Then move to the select character screen /// private void OnGetRoleListComplete(List roleInfos) @@ -344,7 +345,7 @@ namespace BrewMonster.UI UnityGameSession.EnterWorldAsync(roleInfo, OnEnterWorldComplete); #else string nameScene = UnityGameSession.Instance.GetWorldInstanceName(); - UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Single, + UnityGameSession.Instance.LoadScene(nameScene, LoadSceneMode.Single, (progress) => { LoadingSceneController.Instance.SetProgress(progress); @@ -356,7 +357,7 @@ namespace BrewMonster.UI isDoneWorldRender = true; actLoadChar?.Invoke(); UnityGameSession.EnterWorldAsync(roleInfo, OnEnterWorldComplete); - + }); #endif }, null); @@ -433,4 +434,4 @@ namespace BrewMonster.UI } } } -} \ No newline at end of file +} diff --git a/Assets/Prefabs/ChatSystem/prefab_ChatCanvas.prefab b/Assets/Prefabs/ChatSystem/prefab_ChatCanvas.prefab index c76513cc75..679c4af487 100644 --- a/Assets/Prefabs/ChatSystem/prefab_ChatCanvas.prefab +++ b/Assets/Prefabs/ChatSystem/prefab_ChatCanvas.prefab @@ -206,10 +206,10 @@ RectTransform: - {fileID: 6133989890986254344} m_Father: {fileID: 1983722419643715407} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 500, y: 426.75708} + m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0, y: 1} --- !u!222 &6409592904291504631 CanvasRenderer: @@ -458,11 +458,11 @@ RectTransform: - {fileID: 4454076196230765805} m_Father: {fileID: 6199635200021499044} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -288.98} - m_SizeDelta: {x: 508.681, y: 53} - m_Pivot: {x: 0, y: 1} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: -396, y: 79} + m_SizeDelta: {x: 75, y: 75} + m_Pivot: {x: 0.5, y: 0} --- !u!1 &4190358850504021446 GameObject: m_ObjectHideFlags: 0 @@ -481,7 +481,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1983722419643715407 RectTransform: m_ObjectHideFlags: 0 @@ -497,10 +497,10 @@ RectTransform: - {fileID: 7473152984931807423} m_Father: {fileID: 6199635200021499044} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 0, y: -783} - m_SizeDelta: {x: 508.681, y: 441.022} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: -346.5, y: 50} + m_SizeDelta: {x: 550, y: 450} m_Pivot: {x: 0, y: 0} --- !u!222 &5213722908587404148 CanvasRenderer: @@ -764,7 +764,7 @@ RectTransform: m_Father: {fileID: 3976287853544917220} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 20, y: 20} m_Pivot: {x: 0.5, y: 0.5} @@ -859,7 +859,7 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5535948066766320732} - m_Enabled: 1 + m_Enabled: 0 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} m_Name: @@ -1028,7 +1028,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_text: "\u200B" + m_text: "5\u200B" m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -1133,11 +1133,11 @@ RectTransform: - {fileID: 7133716985767026273} m_Father: {fileID: 4963429530816417249} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 0, y: 1} - m_AnchoredPosition: {x: 116, y: -0.000026464} - m_SizeDelta: {x: 160, y: 50} - m_Pivot: {x: 0, y: 1} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 75, y: 75} + m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5054963699385999060 CanvasRenderer: m_ObjectHideFlags: 0 @@ -1466,9 +1466,9 @@ RectTransform: m_Father: {fileID: 1473672866371037475} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} m_Pivot: {x: 0, y: 1} --- !u!222 &4906838759260176767 CanvasRenderer: