Files
the-island/unity-client/Assets/Scripts/Models.cs
empty 64ed46215f feat: add Unity 6 client with 2.5D visual system
Unity client features:
- WebSocket connection via NativeWebSocket
- 2.5D agent visuals with programmatic placeholder sprites
- Billboard system for sprites and UI elements
- Floating UI panels (name, HP, energy bars)
- Speech bubble system with pop-in animation
- RTS-style camera controller (WASD + scroll zoom)
- Editor tools for prefab creation and scene setup

Scripts:
- NetworkManager: WebSocket singleton
- GameManager: Agent spawning and event handling
- AgentVisual: 2.5D sprite and UI creation
- Billboard: Camera-facing behavior
- SpeechBubble: Animated dialogue display
- CameraController: RTS camera with UI input detection
- UIManager: HUD and command input

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 12:17:04 +08:00

169 lines
3.9 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace TheIsland.Models
{
/// <summary>
/// Root server message structure.
/// Matches Python's GameEvent schema.
/// </summary>
[Serializable]
public class ServerMessage
{
public string event_type;
public double timestamp;
// data is parsed separately based on event_type
// We use a raw JSON approach for flexibility
}
/// <summary>
/// Wrapper for deserializing the full message including raw data.
/// </summary>
[Serializable]
public class RawServerMessage
{
public string event_type;
public double timestamp;
public string rawData; // Will be populated manually after initial parse
}
/// <summary>
/// Agent data from the server.
/// Matches Python's Agent.to_dict() output.
/// </summary>
[Serializable]
public class AgentData
{
public int id;
public string name;
public string personality;
public string status; // "Alive", "Dead", "Exiled"
public int hp;
public int energy;
public string inventory;
public bool IsAlive => status == "Alive";
}
/// <summary>
/// Agents update event data.
/// </summary>
[Serializable]
public class AgentsUpdateData
{
public List<AgentData> agents;
}
/// <summary>
/// Agent speak event data (LLM response).
/// </summary>
[Serializable]
public class AgentSpeakData
{
public int agent_id;
public string agent_name;
public string text;
}
/// <summary>
/// Feed event data.
/// </summary>
[Serializable]
public class FeedEventData
{
public string user;
public string agent_name;
public int energy_restored;
public int agent_energy;
public int user_gold;
public string message;
}
/// <summary>
/// Agent death event data.
/// </summary>
[Serializable]
public class AgentDiedData
{
public string agent_name;
public string message;
}
/// <summary>
/// Tick event data.
/// </summary>
[Serializable]
public class TickData
{
public int tick;
public int day;
public int alive_agents;
}
/// <summary>
/// System/Error event data.
/// </summary>
[Serializable]
public class SystemEventData
{
public string message;
}
/// <summary>
/// User update event data.
/// </summary>
[Serializable]
public class UserUpdateData
{
public string user;
public int gold;
}
/// <summary>
/// World state data.
/// </summary>
[Serializable]
public class WorldStateData
{
public int day_count;
public string weather;
public int resource_level;
}
/// <summary>
/// Client message structure for sending to server.
/// </summary>
[Serializable]
public class ClientMessage
{
public string action;
public ClientPayload payload;
}
[Serializable]
public class ClientPayload
{
public string user;
public string message;
}
/// <summary>
/// Event type constants matching Python's EventType enum.
/// </summary>
public static class EventTypes
{
public const string COMMENT = "comment";
public const string TICK = "tick";
public const string SYSTEM = "system";
public const string ERROR = "error";
public const string AGENTS_UPDATE = "agents_update";
public const string AGENT_DIED = "agent_died";
public const string AGENT_SPEAK = "agent_speak";
public const string FEED = "feed";
public const string USER_UPDATE = "user_update";
public const string WORLD_UPDATE = "world_update";
public const string CHECK = "check";
}
}