Files
test/Docs/chat-channel-whisper-dropdown-summary.md
2026-05-25 10:33:40 +07:00

2.8 KiB

# Chat: TMP_Dropdown kênh + MRU Whisper

Tóm tắt hành vi dropdown gắn với ChatInputHandler (Assets/Scripts/ChatInputHandler.cs).

Vị trí cấu hình

  • Component: ChatInputHandler trên GameObject chat (cùng ChatSystemlUI nếu có).
  • Field Inspector: recentWhisperDropdown — kéo TMP_Dropdown từ Hierarchy vào.
  • Giới hạn MRU: maxRecentWhisperTargets (mặc định 5, tối thiểu áp dụng 1 qua MaxRecentWhisperTargets).

Hai chế độ nội dung dropdown

1. Không ở kênh Whisper

Khi m_currentChannel != GP_CHAT_WHISPER, dropdown liệt kê 4 kênh (thứ tự cố định):

Thứ tự ChatChannel Nhãn hiển thị
0 GP_CHAT_LOCAL Local
1 GP_CHAT_TEAM Team
2 GP_CHAT_FACTION Faction
3 GP_CHAT_FARCRY World
  • Chọn một dòng → gọi OnCommand_speakmode(kênh tương ứng) (tương tự channelButtons).
  • Đồng bộ selection: nếu kênh hiện tại nằm trong bốn kênh trên thì highlight đúng; nếu không (ví dụ Trade), caption mặc định về Local (index 0) cho đến khi người chọn lại.

2. Kênh Whisper (GP_CHAT_WHISPER)

  • Dòng đầu: ký tự (placeholder): không ép chọn MRU / giữ target đang gõ.
  • Các dòng sau: tên người MRU (mới chat gần nhất lên trên).
  • MRU chỉ tăng/cập nhật sau khi gửi whisper thành công (SendPrivateChatRecordRecentWhisper).
  • Khi đang ở kênh khác, MRU vẫn được cập nhật trong bộ nhớ; chuyển sang Whisper sẽ thấy danh sách trong dropdown.

Tương tác & hệ thống

  • Kênh System: inputField không nhập được; dropdown không interactable (interactable = false).
  • Các kênh khác (không System): dropdown interactable (kể cả khi đang 4 kênh public hoặc Whisper).
  • Sự kiện: WhisperPlayerEvent / SetWhisperTarget vẫn chuyển sang Whisper và đồng bộ dropdown (MRU).

Hằng số / cấu trúc code (tham chiếu)

  • ChatDropdownChannelOrder: mảng tĩnh 4 kênh public.
  • GetChannelDropdownLabel(ChatChannel): nhãn dropdown cho từng kênh.
  • RebuildChatDropdownOptions(): rebuild theo chế độ hiện tại (public vs whisper).
  • RecordRecentWhisper: cập nhật list MRU; chỉ RebuildChatDropdownOptions() khi đang ở Whisper.

Lưu ý

  • MRU không persist (PlayerPrefs / file) — chỉ trong phiên chơi.
  • Tên field SerializeField vẫn là recentWhisperDropdown để tránh gãy reference prefab cũ.

Đường dẫn file

  • Logic: Assets/Scripts/ChatInputHandler.cs