2.8 KiB
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:
ChatInputHandlertrên GameObject chat (cùngChatSystemlUInế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 quaMaxRecentWhisperTargets).
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 (
SendPrivateChat→RecordRecentWhisper). - 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:
inputFieldkhô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/SetWhisperTargetvẫ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