ChatUI.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. namespace Mirror.Examples.Chat
  6. {
  7. public class ChatUI : NetworkBehaviour
  8. {
  9. [Header("UI Elements")]
  10. [SerializeField] Text chatHistory;
  11. [SerializeField] Scrollbar scrollbar;
  12. [SerializeField] InputField chatMessage;
  13. [SerializeField] Button sendButton;
  14. // This is only set on client to the name of the local player
  15. internal static string localPlayerName;
  16. // Server-only cross-reference of connections to player names
  17. internal static readonly Dictionary<NetworkConnectionToClient, string> connNames = new Dictionary<NetworkConnectionToClient, string>();
  18. public override void OnStartServer()
  19. {
  20. connNames.Clear();
  21. }
  22. public override void OnStartClient()
  23. {
  24. chatHistory.text = "";
  25. }
  26. [Command(requiresAuthority = false)]
  27. void CmdSend(string message, NetworkConnectionToClient sender = null)
  28. {
  29. if (!connNames.ContainsKey(sender))
  30. connNames.Add(sender, sender.identity.GetComponent<Player>().playerName);
  31. if (!string.IsNullOrWhiteSpace(message))
  32. RpcReceive(connNames[sender], message.Trim());
  33. }
  34. [ClientRpc]
  35. void RpcReceive(string playerName, string message)
  36. {
  37. string prettyMessage = playerName == localPlayerName ?
  38. $"<color=red>{playerName}:</color> {message}" :
  39. $"<color=blue>{playerName}:</color> {message}";
  40. AppendMessage(prettyMessage);
  41. }
  42. void AppendMessage(string message)
  43. {
  44. StartCoroutine(AppendAndScroll(message));
  45. }
  46. IEnumerator AppendAndScroll(string message)
  47. {
  48. chatHistory.text += message + "\n";
  49. // it takes 2 frames for the UI to update ?!?!
  50. yield return null;
  51. yield return null;
  52. // slam the scrollbar down
  53. scrollbar.value = 0;
  54. }
  55. // Called by UI element ExitButton.OnClick
  56. public void ExitButtonOnClick()
  57. {
  58. // StopHost calls both StopClient and StopServer
  59. // StopServer does nothing on remote clients
  60. NetworkManager.singleton.StopHost();
  61. }
  62. // Called by UI element MessageField.OnValueChanged
  63. public void ToggleButton(string input)
  64. {
  65. sendButton.interactable = !string.IsNullOrWhiteSpace(input);
  66. }
  67. // Called by UI element MessageField.OnEndEdit
  68. public void OnEndEdit(string input)
  69. {
  70. if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter) || Input.GetButtonDown("Submit"))
  71. SendMessage();
  72. }
  73. // Called by OnEndEdit above and UI element SendButton.OnClick
  74. public void SendMessage()
  75. {
  76. if (!string.IsNullOrWhiteSpace(chatMessage.text))
  77. {
  78. CmdSend(chatMessage.text.Trim());
  79. chatMessage.text = string.Empty;
  80. chatMessage.ActivateInputField();
  81. }
  82. }
  83. }
  84. }