Simple Chat Room
BeginnerLearn the basics by building a real-time chat application. Perfect for understanding room creation, message handling, and state synchronization.
Room lifecycleMessage handlingBroadcasting
Server (TypeScript)
import { Room, Client } from 'gameon-multiplayer';
interface ChatState {
messages: { author: string; text: string; timestamp: number }[];
users: Map<string, string>;
}
export class ChatRoom extends Room<ChatState> {
onCreate() {
this.setState({
messages: [],
users: new Map()
});
this.onMessage('chat', (client, data) => {
const username = this.state.users.get(client.sessionId) || 'Anonymous';
const message = {
author: username,
text: data.text,
timestamp: Date.now()
};
this.state.messages.push(message);
// Keep only last 100 messages
if (this.state.messages.length > 100) {
this.state.messages.shift();
}
});
}
onJoin(client: Client, options: { username?: string }) {
this.state.users.set(client.sessionId, options.username || 'Guest');
this.broadcast('user_joined', { username: options.username });
}
onLeave(client: Client) {
const username = this.state.users.get(client.sessionId);
this.state.users.delete(client.sessionId);
this.broadcast('user_left', { username });
}
}Client (Unity C#)
using UnityEngine;
using GameOn.Networking;
public class ChatManager : MonoBehaviour
{
private GameOnNetworkManager network;
private Room chatRoom;
async void Start()
{
network = GetComponent<GameOnNetworkManager>();
await network.Connect();
chatRoom = await network.JoinOrCreate("chat", new {
username = "Player1"
});
chatRoom.OnMessage<ChatMessage>("chat", OnChatReceived);
chatRoom.OnStateChange += OnStateChange;
}
public void SendMessage(string text)
{
chatRoom.Send("chat", new { text = text });
}
void OnChatReceived(ChatMessage msg)
{
Debug.Log($"{msg.author}: {msg.text}");
}
void OnStateChange(ChatState state)
{
// Update UI with message history
}
}