This skill should be used when the user asks about "touch input", "BoardInput", "BoardContact", "piece detection", "glyph", "glyph recognition", "simulator", "Board hardware", "contact phases", "Piece Set", "touch system", "Board SDK", "multi-touch", "noise rejection", or discusses Board hardware integration and input handling.
Provides touch input and piece recognition for Board multi-touch hardware. Use when handling physical piece placement, glyph detection, or multi-touch interactions in your game.
/plugin marketplace add jwmyers/vui-vux-plugins/plugin install zero-day-dev@vui-vuxThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Expert knowledge of the Board SDK for Unity, enabling touch input, piece detection, and hardware integration for the Board multi-touch display.
Board is a specialized multi-touch display with:
| Type | Description |
|---|---|
| Finger | Standard touch point from a finger |
| Glyph | Contact from a physical Piece with conductive pattern |
| Phase | Description |
|---|---|
Began | Contact started this frame |
Moved | Position or orientation changed |
Stationary | Held in place, no change |
Ended | Lifted from surface |
Canceled | Tracking interrupted |
.tflite ML file for recognizing a Piece SetPrimary input API for contacts and glyphs:
using Board.Input;
// Get all active contacts of a type
BoardContact[] fingers = BoardInput.GetActiveContacts(BoardContactType.Finger);
BoardContact[] pieces = BoardInput.GetActiveContacts(BoardContactType.Glyph);
// Get all contacts regardless of type
BoardContact[] all = BoardInput.GetActiveContacts();
| Property | Type | Description |
|---|---|---|
Id | int | Unique contact ID (persistent during lifecycle) |
Position | Vector2 | Screen position in pixels |
Phase | ContactPhase | Current lifecycle state |
Type | BoardContactType | Finger or Glyph |
Orientation | float | Rotation angle (glyphs only) |
IsTouched | bool | Whether piece is being held (glyphs only) |
GlyphId | int | Specific glyph identifier (glyphs only) |
Manage player profiles and sessions:
using Board.Session;
// Get current players
var players = BoardSession.GetPlayers();
foreach (var player in players)
{
string name = player.Name;
Texture2D avatar = player.Avatar;
}
System integration features:
using Board.Core;
// Show pause screen
BoardApplication.ShowPauseScreen();
// Check if paused
bool isPaused = BoardApplication.IsPaused;
Persistent storage per player:
using Board.Save;
// Save game data
BoardSaveGameManager.Save("slot1", saveData);
// Load game data
var loaded = BoardSaveGameManager.Load("slot1");
InputManager.cs is the ONLY file that imports Board.Input:
namespace ZeroDayAttack.Input
{
using Board.Input;
public class InputManager : MonoBehaviour
{
public static InputManager Instance { get; private set; }
// Events for other systems
public event Action<BoardContact> OnContactBegan;
public event Action<BoardContact> OnContactMoved;
public event Action<BoardContact> OnContactEnded;
void Update()
{
var contacts = BoardInput.GetActiveContacts();
foreach (var contact in contacts)
{
switch (contact.Phase)
{
case ContactPhase.Began:
OnContactBegan?.Invoke(contact);
break;
case ContactPhase.Moved:
OnContactMoved?.Invoke(contact);
break;
case ContactPhase.Ended:
OnContactEnded?.Invoke(contact);
break;
}
}
}
}
}
TokenManager.cs subscribes to InputManager events:
void Start()
{
InputManager.Instance.OnContactBegan += HandleContactBegan;
}
void HandleContactBegan(BoardContact contact)
{
if (contact.Type == BoardContactType.Glyph)
{
// Map glyph to token
var token = MapGlyphToToken(contact.GlyphId);
// Convert screen to world position
Vector3 worldPos = Camera.main.ScreenToWorldPoint(
new Vector3(contact.Position.x, contact.Position.y, 10));
// Snap to nearest edge node
SnapTokenToNode(token, worldPos);
}
}
Test without hardware using Board's Simulator:
// Board SDK provides screen pixels (origin bottom-left)
Vector2 screenPos = contact.Position;
// Convert to world coordinates
Vector3 worldPos = Camera.main.ScreenToWorldPoint(
new Vector3(screenPos.x, screenPos.y, 10));
// World position to grid coordinates
int gridX = Mathf.FloorToInt((worldPos.x - LayoutConfig.GridLeft) / LayoutConfig.TileSize);
int gridY = Mathf.FloorToInt((worldPos.y - LayoutConfig.GridBottom) / LayoutConfig.TileSize);
Map Board SDK glyph IDs to game tokens:
// In TokenDatabase or TokenManager
Dictionary<int, TokenData> glyphToToken = new()
{
{ 1, redAttack },
{ 2, redExploit },
{ 3, redGhost },
{ 4, blueAttack },
{ 5, blueExploit },
{ 6, blueGhost }
};
When using Unity UI on Board:
// Replace standard InputSystemUIInputModule with BoardUIInputModule
// The SDK blocks system touch events
This is required because Board SDK intercepts touch input before Unity's standard input system.
Keep Board SDK imports isolated to InputManager:
Always convert coordinates:
Track contacts properly:
BeganMovedEnded or CanceledUse IsTouched for gameplay:
true = piece being held/moved by playerfalse = piece resting on surfaceFor comprehensive SDK documentation:
overview.md - SDK introductionlearn/concepts.md - Core terminologylearn/touch-system.md - Touch handling detailslearn/pieces.md - Piece/glyph recognitionguides/touch-input.md - Implementation guideguides/simulator.md - Simulator usagereference/ - API documentationBoard.Input.BoardInput - Touch contact accessBoard.Input.BoardContact - Contact data structureBoard.Session.BoardSession - Player managementBoard.Save.BoardSaveGameManager - Save dataThis skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.