aha
This commit is contained in:
100
Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs
Normal file
100
Assets/Mirror/Examples/Chat/Scripts/ChatUI.cs
Normal file
@ -0,0 +1,100 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace Mirror.Examples.Chat
|
||||
{
|
||||
public class ChatUI : NetworkBehaviour
|
||||
{
|
||||
[Header("UI Elements")]
|
||||
[SerializeField] Text chatHistory;
|
||||
[SerializeField] Scrollbar scrollbar;
|
||||
[SerializeField] InputField chatMessage;
|
||||
[SerializeField] Button sendButton;
|
||||
|
||||
// This is only set on client to the name of the local player
|
||||
internal static string localPlayerName;
|
||||
|
||||
// Server-only cross-reference of connections to player names
|
||||
internal static readonly Dictionary<NetworkConnectionToClient, string> connNames = new Dictionary<NetworkConnectionToClient, string>();
|
||||
|
||||
public override void OnStartServer()
|
||||
{
|
||||
connNames.Clear();
|
||||
}
|
||||
|
||||
public override void OnStartClient()
|
||||
{
|
||||
chatHistory.text = "";
|
||||
}
|
||||
|
||||
[Command(requiresAuthority = false)]
|
||||
void CmdSend(string message, NetworkConnectionToClient sender = null)
|
||||
{
|
||||
if (!connNames.ContainsKey(sender))
|
||||
connNames.Add(sender, sender.identity.GetComponent<Player>().playerName);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(message))
|
||||
RpcReceive(connNames[sender], message.Trim());
|
||||
}
|
||||
|
||||
[ClientRpc]
|
||||
void RpcReceive(string playerName, string message)
|
||||
{
|
||||
string prettyMessage = playerName == localPlayerName ?
|
||||
$"<color=red>{playerName}:</color> {message}" :
|
||||
$"<color=blue>{playerName}:</color> {message}";
|
||||
AppendMessage(prettyMessage);
|
||||
}
|
||||
|
||||
void AppendMessage(string message)
|
||||
{
|
||||
StartCoroutine(AppendAndScroll(message));
|
||||
}
|
||||
|
||||
IEnumerator AppendAndScroll(string message)
|
||||
{
|
||||
chatHistory.text += message + "\n";
|
||||
|
||||
// it takes 2 frames for the UI to update ?!?!
|
||||
yield return null;
|
||||
yield return null;
|
||||
|
||||
// slam the scrollbar down
|
||||
scrollbar.value = 0;
|
||||
}
|
||||
|
||||
// Called by UI element ExitButton.OnClick
|
||||
public void ExitButtonOnClick()
|
||||
{
|
||||
// StopHost calls both StopClient and StopServer
|
||||
// StopServer does nothing on remote clients
|
||||
NetworkManager.singleton.StopHost();
|
||||
}
|
||||
|
||||
// Called by UI element MessageField.OnValueChanged
|
||||
public void ToggleButton(string input)
|
||||
{
|
||||
sendButton.interactable = !string.IsNullOrWhiteSpace(input);
|
||||
}
|
||||
|
||||
// Called by UI element MessageField.OnEndEdit
|
||||
public void OnEndEdit(string input)
|
||||
{
|
||||
if (Input.GetKeyDown(KeyCode.Return) || Input.GetKeyDown(KeyCode.KeypadEnter) || Input.GetButtonDown("Submit"))
|
||||
SendMessage();
|
||||
}
|
||||
|
||||
// Called by OnEndEdit above and UI element SendButton.OnClick
|
||||
public void SendMessage()
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(chatMessage.text))
|
||||
{
|
||||
CmdSend(chatMessage.text.Trim());
|
||||
chatMessage.text = string.Empty;
|
||||
chatMessage.ActivateInputField();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user