const string TAB_TYPE_TEXT_CHAT = "TAB_TYPE_TEXT_CHAT"; const string TAB_TYPE_SYSTEM_MESSAGE = "TAB_TYPE_SYSTEM_MESSAGE"; const string CHAT_TYPE_PUBLIC = "CHAT_TYPE_PUBLIC"; const string CHAT_TYPE_PRIVATE = "CHAT_TYPE_PRIVATE"; const string CHAT_TYPE_SYSTEM = "CHAT_TYPE_SYSTEM"; // テキチャの文字数上限 const int TEXTCHAT_MAX_TEXT_LENGTH = 200; // WebXRテキチャの文字数上限 const int TEXTCHAT_WEBXR_MAX_TEXT_LENGTH = 75; component TCViewModel { TCView m_View; TCModelCommon m_ModelCommon; TCModelGlobalChat m_ModelGlobalChat; TCModelSystemChat m_ModelSystemChat; TCModelPrivateChat m_ModelPrivateChat; string m_CurrentTabType; string m_CurrentChatType; bool m_TextChatOpened; bool m_IsChatConnected; public TCViewModel() { m_View = new TCView(); m_ModelCommon = system.Layer_GetComponentByName("textchat_common"); m_ModelGlobalChat = system.Layer_GetComponentByName("textchat_common"); m_ModelSystemChat = system.Layer_GetComponentByName("textchat_common"); m_ModelPrivateChat = system.Layer_GetComponentByName("textchat_common"); m_CurrentTabType = TAB_TYPE_TEXT_CHAT; m_CurrentChatType = CHAT_TYPE_PUBLIC; m_TextChatOpened = false; m_IsChatConnected = false; hsAddEventListener("textchat-notify-system-message", NotifySystemMessageFromJS); hsAddEventListener("textchat-notify-chat-message", NotifyChatMessageFromJS); hsAddEventListener("textchat-receive-text-chat-message", ReceiveTextChatMessage); hsAddEventListener("textchat-receive-text-chat-message-personal", ReceiveTextChatMessagePersonal); } public void OnLoaded() { m_View.OnLoaded(); } public bool IsTextChatOpened() { return m_TextChatOpened; } public void SetTextChatConnectFlag(bool connectFlag){ m_IsChatConnected = connectFlag; } public void OnResize() { m_View.ResizeCallback(); } void EnabledTextChat(bool UseInput) { m_View.OpenTextChatBase(true); m_View.ShowTextChat(m_CurrentChatType, true, UseInput); m_View.ShowBadge(false, m_CurrentChatType); m_View.SwitchTextChatTab(m_CurrentTabType); ShowPrvChatPulldown("false"); } public void OpenGlobalTextChat() { m_TextChatOpened = true; m_IsChatConnected = true; m_CurrentTabType = TAB_TYPE_TEXT_CHAT; m_CurrentChatType = CHAT_TYPE_PUBLIC; m_View.ToggleIndividualChat(false); EnabledTextChat(true); m_ModelPrivateChat.ResetCurrentChatterUserCode(); m_ModelGlobalChat.SetHasUnreadGlobalMessage(false); ControlTextChatBadge(); } public void OpenPrivateTextChat(string PlayerID) { m_TextChatOpened = true; m_CurrentTabType = TAB_TYPE_TEXT_CHAT; m_CurrentChatType = CHAT_TYPE_PRIVATE; m_View.ToggleIndividualChat(true); EnabledTextChat(true); m_ModelPrivateChat.SelectIndividualChatByPlayerID(PlayerID); ControlIndivisualBadge(); ControlTextChatBadge(); } public void OpenSystemChat() { m_TextChatOpened = true; m_CurrentTabType = TAB_TYPE_SYSTEM_MESSAGE; m_CurrentChatType = CHAT_TYPE_SYSTEM; EnabledTextChat(false); m_ModelPrivateChat.ResetCurrentChatterUserCode(); ControlTextChatBadge(); } public void ClickSendButton() { // 送信ボタン押下時の処理 _SendTextChat(); } public void SendEmoteStamp(string emoteIndex) { if(m_CurrentChatType == CHAT_TYPE_PUBLIC) { m_ModelGlobalChat.SendEmoteStamp(emoteIndex); } else if(m_CurrentChatType == CHAT_TYPE_PRIVATE) { m_ModelPrivateChat.SendEmoteStamp(emoteIndex); } } public void OnSendTextChat() { // Enter押下時の処理 _SendTextChat(); } void _SendTextChat() { if(m_CurrentTabType == TAB_TYPE_TEXT_CHAT) { string message = m_View.GetInputFieldText(); if(message.Length() > TEXTCHAT_MAX_TEXT_LENGTH){ return; } // 送信文字数制限 message = message.SubString(0, TEXTCHAT_MAX_TEXT_LENGTH); if(m_CurrentChatType == CHAT_TYPE_PUBLIC) { m_ModelGlobalChat.SendTextChat(message); } else if(m_CurrentChatType == CHAT_TYPE_PRIVATE) { m_ModelPrivateChat.SendTextChat(message); } } m_View.ClearInputFieldText(); } public void ExitTextChat() { CloseTextChat(); // テキストチャットを抜けるのでバッチも一度非表示にする m_View.ShowBadge(false, CHAT_TYPE_PUBLIC); m_View.ShowBadge(false, CHAT_TYPE_PRIVATE); m_View.ShowBadge(false, CHAT_TYPE_SYSTEM); m_ModelCommon.Exit(); m_ModelGlobalChat.Exit(); m_ModelSystemChat.Exit(); m_ModelPrivateChat.Exit(); } public void CloseTextChat() { m_TextChatOpened = false; m_CurrentTabType = TAB_TYPE_TEXT_CHAT; m_CurrentChatType = CHAT_TYPE_PUBLIC; m_View.OpenTextChatBase(false); m_View.SwitchTextChatTab(m_CurrentTabType); m_View.CloseMessageList(); m_View.ShowInputField(false); m_View.ShowClickableTextChatHUD(); SwitchSendable(true); ShowPrvChatPulldown("false"); m_ModelCommon.Close(); m_ModelGlobalChat.Close(); m_ModelSystemChat.Close(); m_ModelPrivateChat.Close(); } public void SwitchTextChat(string ChatType) { if(ChatType == CHAT_TYPE_PUBLIC) { OpenGlobalTextChat(); } else if(ChatType == CHAT_TYPE_PRIVATE) { OpenPrivateTextChat(""); } else if(ChatType == CHAT_TYPE_SYSTEM) { OpenSystemChat(); } else { // 無効なChatTypeなので抜ける return; } } public void ShowBadge(string ChatType) { // テキストチャットがオープンでないもしくは開いているチャットタイプが異なる場合はバッチを表示する bool IsShow = (!m_TextChatOpened || m_CurrentChatType != ChatType); m_View.ShowBadge(IsShow, ChatType); } public void ShowPrvChatPulldown(string param) { bool show = (param == "true"); m_View.ShowPrvChatPulldown(show); } public void Update(){ m_View.SetPlaceHolder(); if(m_TextChatOpened){ m_View.ApplyInputTextLengthLimit(); int inputTextLength = m_View.GetInputFieldText().Length(); bool isInLimit = inputTextLength <= TEXTCHAT_MAX_TEXT_LENGTH; SwitchSendable(isInLimit && m_IsChatConnected); } } // テキストチャットを送信可能かどうか public void SwitchSendable(bool sendableFlag) { m_View.SwitchSendable(sendableFlag); } // テキストチャットタブの有効化 public void EnabledIndividualChatTab(bool Enabled) { m_View.EnabledIndividualChatTab(Enabled); } void NotifyChatMessageFromJS(string param) { m_ModelGlobalChat.NotifyChatMessageFromJS(param); } void ReceiveTextChatMessage(string param) { m_ModelGlobalChat.ReceiveTextChatMessage(param); ControlTextChatBadge(); } void ReceiveTextChatMessagePersonal(string param) { m_ModelPrivateChat.ReceiveTextChatMessagePersonal(param); } void NotifySystemMessageFromJS(string param) { m_ModelSystemChat.NotifySystemMessageFromJS(param); } public void NotifyChatGPTMessageFromJS(string param) { m_ModelGlobalChat.NotifyChatGPTMessageFromJS(param); } public void ClickLoginUserIcon(string UserCode) { m_ModelCommon.FetchProfileFromMessage(UserCode, "login"); } public void ClickGuestUserIcon(string UserCode) { m_ModelCommon.FetchProfileFromMessage(UserCode, "guest"); } //個別チャットを開始 (paramはネットワークライブラリが管理しているプレイヤー識別子) public void StartIndividualChat(string PlayerID) { m_ModelPrivateChat.StartIndividualChat(PlayerID); OpenPrivateTextChat(PlayerID); } //個別チャットの宛先を選択 (paramはネットワークライブラリが管理しているプレイヤー識別子) public void SelectPlayerIndividualChatPulldown(string param) { int Index = param.ToInt(); hsCanvasToggleChange("Toggle_PrvTextChat_Pulldown_OpenClose"); m_ModelPrivateChat.SelectPlayerIndividualChatPulldown(Index); } public void OnNetReceivePosJoin(string ID, string Data) { // 再入室時にPlayerIDが変わるのと入室直後ではカスタムステートからUserCodeを復元することができないためこの機能は実質機能しない // 再入室したプレイヤーと再びチャットを行うにはターゲットフォーカスからPrivateChatを開始する必要がある // m_ModelPrivateChat.ReStartIndividualChat(ID); } public void OnNetReceivePosLeave(string ID, string Data) { bool IndividualChatOpened = (m_CurrentChatType == CHAT_TYPE_PRIVATE); m_ModelPrivateChat.EndIndividualChat(ID, IndividualChatOpened); } public void EnterWebXRMode() { m_View.ResizeWebXRUI(); m_ModelGlobalChat.RefreshChatMessageList(); m_ModelSystemChat.RefreshChatMessageList(); m_ModelPrivateChat.RefreshChatMessageList(); } public void ExitWebXRMode() { m_ModelGlobalChat.RefreshChatMessageList(); m_ModelSystemChat.RefreshChatMessageList(); m_ModelPrivateChat.RefreshChatMessageList(); m_View.RestoreNormalHUD(); } public void ControlIndivisualBadge(){ m_View.ControlIndivisualBadge(m_ModelPrivateChat.GetHasUnreadIndivisualMessage()); ControlTextChatBadge(); } public void ControlTextChatBadge(){ bool flag; flag = (m_ModelPrivateChat.GetHasUnreadIndivisualMessage() || m_ModelGlobalChat.GetHasUnreadGlobalMessage()); m_View.ControlTextChatBadge(flag); } public void SetVRKeyboardInputText(string text) { string ellipsisText = m_ModelCommon.AddEllipsisToOutRangeText(text, TEXTCHAT_WEBXR_MAX_TEXT_LENGTH); // 入力されたテキスト m_View.SetWebXRInputText(text); // プレースホルダー表示用の省略されたテキスト m_View.SetWebXRPlaceholderText("mainmenu_webxr","chat_text_inputfield",ellipsisText); } }