jahro-watcher
について
このClaude Skillは、Unityでのリアルタイムランタイム監視のために、C#のフィールドとプロパティに自動的に`[JahroWatch]`属性を追加します。主要なゲーム状態変数を識別し、手動ロギングを置き換えるパフォーマンス安全なパターンを生成します。変数の追跡、ゲーム状態の検査、またはJahroWatchシステムとの統合が必要な場合にご利用ください。
クイックインストール
Claude Code
推奨npx skills add jahro-console/unity-agent-skills -a claude-code/plugin add https://github.com/jahro-console/unity-agent-skillsgit clone https://github.com/jahro-console/unity-agent-skills.git ~/.claude/skills/jahro-watcherこのコマンドをClaude Codeにコピー&ペーストしてスキルをインストールします
ドキュメント
Jahro Watcher
Help users monitor game variables in real-time using Jahro's [JahroWatch] attribute system.
Workflow
- Analyze the user's code — identify fields/properties worth monitoring
- Generate correct
[JahroWatch]attributes - Add registration if needed (instance members require
RegisterObject) - VERIFY — "Enter Play Mode, open the Watcher tab, confirm values update"
Analyzing Code for Watcher Candidates
When the user shares a class, identify members worth monitoring:
Good candidates:
- Game state fields: health, score, level, currency, inventory counts
- Physics values: velocity, position, rotation (especially via properties wrapping Rigidbody)
- Performance metrics: FPS, memory, draw calls
- Enum state fields: game state, player state, AI state
- Key counters: enemy count, player count, item count
Skip these:
- Constants and readonly compile-time values
- Private implementation details that change every frame with no debugging value
- References to other objects (Transform, GameObject) — watch their properties instead
- Collections and dictionaries (arrays are supported, but dictionaries are not)
Suggest replacing Debug.Log polling:
If the user has Debug.Log($"Health: {health}") in Update(), recommend [JahroWatch] instead — it eliminates log spam and provides a clean real-time dashboard.
Attribute Syntax
[JahroWatch("Display Name", "GroupName", "Description for detail modal")]
Constructor: [JahroWatch(string name, string group, string description)]
All parameters are optional. Defaults: name = member name (leading _ stripped), group = "Default", description = "".
Complete example
using JahroConsole;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[JahroWatch("Health", "Player", "Current hit points")]
public float health = 100f;
[JahroWatch("Stamina", "Player", "Current stamina")]
public float stamina = 50f;
[JahroWatch("Position", "Player", "World position")]
public Vector3 Position => transform.position;
[JahroWatch("Velocity", "Player", "Movement velocity")]
public Vector3 Velocity => GetComponent<Rigidbody>().velocity;
[JahroWatch("Is Grounded", "Player", "Touching ground")]
public bool isGrounded;
void OnEnable() => Jahro.RegisterObject(this);
void OnDisable() => Jahro.UnregisterObject(this);
}
Registration
Instance members — require RegisterObject
void OnEnable() => Jahro.RegisterObject(this);
void OnDisable() => Jahro.UnregisterObject(this);
This same call also registers [JahroCommand] attributes on the class. If the class already has RegisterObject for commands, do not add a second call — one call handles both.
Read references/common-patterns.md for the canonical lifecycle pattern.
Static members — no registration needed
Static fields and properties with [JahroWatch] are discovered via assembly scanning:
public static class GameStats
{
[JahroWatch("Total Score", "Game")]
public static int Score;
[JahroWatch("Session Time", "Game")]
public static float SessionTime => Time.realtimeSinceStartup;
}
Adding watchers to a class that already has commands
If the class already has [JahroCommand] attributes and RegisterObject, just add [JahroWatch] attributes — no registration changes:
public class GameManager : MonoBehaviour
{
// Existing command
[JahroCommand("reset-game", "Game", "Reset game")]
public void ResetGame() { /* ... */ }
// New watchers — just add attributes
[JahroWatch("Player Count", "Game")]
public int playerCount;
[JahroWatch("Game Time", "Game")]
public float gameTime;
// Already present — no changes needed
void OnEnable() => Jahro.RegisterObject(this);
void OnDisable() => Jahro.UnregisterObject(this);
}
Supported Types
| Type | List View Display | Detail Modal |
|---|---|---|
int, float, double, bool | Value as-is | Same |
string | Truncated | Full text |
Vector2 | Compact coords | Coords + magnitude |
Vector3 | Compact coords | Coords + magnitude |
Quaternion | Raw values | Raw + Euler angles |
Transform | Position | Position, rotation, scale, child count |
Rigidbody | Summary | Mass, kinematic, gravity, velocity, angular velocity |
Collider | Summary | Trigger status, material, bounds |
AudioSource | Summary | Clip, volume, loop, pitch, mute |
Camera | Summary | FOV, clip planes, aspect ratio |
Arrays (any T[]) | TypeName[length] | Full contents |
For custom types not in this table, the watcher calls .ToString(). If you need rich display, consider watching individual primitive properties instead.
Read references/api-reference.md for the full type display details.
Performance
Watchers are designed to be safe for development and testing:
- Values are only read when the Watcher UI tab is visible. No continuous polling when the console is closed or on another tab.
- No overhead when disabled. If Jahro is disabled via
JAHRO_DISABLEor auto-disable, watchers are never evaluated. - Be mindful of expensive property getters. A property like
public int Count => expensiveList.Where(...).Count()runs its getter every frame the Watcher is open. Cache expensive computations.
Performance-safe property pattern
private float _cachedFps;
private float _lastFpsUpdate;
void Update()
{
if (Time.time - _lastFpsUpdate > 0.25f)
{
_cachedFps = 1f / Time.unscaledDeltaTime;
_lastFpsUpdate = Time.time;
}
}
[JahroWatch("FPS", "Performance")]
public float FPS => _cachedFps;
Group Organization
By system (recommended default)
"Player" — Health, Stamina, Position, Velocity
"Physics" — Is Grounded, Angular Velocity, Collision Count
"Performance" — FPS, Memory, Draw Calls
"Game" — Game State, Level Progress, Player Count
"AI" — AI State, Target, Path Length
By priority
"Critical" — Health, Frame Time (always need these)
"Gameplay" — Enemy Count, Spawn Timer
"Diagnostics" — GC Allocs, Memory
Watcher UI behavior
- Favorites group always appears at top (user stars individual watchers)
- Custom groups are alphabetically sorted
- Groups are collapsible to reduce clutter
- Tapping a watcher opens a detail modal with description and full type info
Contextual Awareness
| Pattern in code | Suggestion |
|---|---|
Debug.Log in Update() logging variable values | Replace with [JahroWatch] — cleaner, no log spam |
[JahroWatch] already present | Suggest additional watchers, better groups, performance tips |
[JahroCommand] but no watchers | Suggest adding watchers for key state the commands modify |
| Rigidbody or physics-heavy code | Suggest velocity, angular velocity, isGrounded watchers |
| Game manager with state fields | Suggest watching game state enum, counts, timers |
Verification
After generating watchers, always include:
Verify: Enter Play Mode → press ~ → switch to the Watcher tab. Confirm your watched values appear in the correct groups and update in real-time as the game runs. Tap a watcher to see its detail modal.
If watchers appear but don't update, or don't appear at all, suggest the jahro-troubleshooting skill — common causes: missing RegisterObject, Watcher tab not open, object destroyed without unregistering.
GitHub リポジトリ
関連スキル
content-collections
メタこのスキルは、Content Collections(Markdown/MDXファイルを型安全なデータコレクションに変換するTypeScriptファーストのツール)の本番環境でテストされた設定を提供します。Zodバリデーションによる型安全性を実現し、ブログ、ドキュメントサイト、コンテンツ重視のVite + Reactアプリケーション構築時にご利用ください。Viteプラグインの設定、MDXコンパイルから、デプロイ最適化、スキーマバリデーションまで、すべてを網羅しています。
polymarket
メタこのスキルは、開発者がPolymarket予測市場プラットフォームを活用したアプリケーション構築を可能にします。API統合による取引や市場データの取得に加え、WebSocketを介したリアルタイムデータストリーミングにより、ライブ取引や市場活動を監視できます。取引戦略の実装や、ライブ市場更新を処理するツールの作成にご利用ください。
creating-opencode-plugins
メタこのスキルは、開発者がコマンド、ファイル、LSP操作など25種類以上のイベントタイプにフックするOpenCodeプラグインを作成することを支援します。JavaScript/TypeScriptモジュール向けに、プラグイン構造、イベントAPI仕様、および実装パターンを提供します。カスタムイベント駆動ロジックでOpenCode AIアシスタントのライフサイクルをインターセプト、監視、または拡張する必要がある場合にご利用ください。
sglang
メタSGLangは、高性能なLLMサービングフレームワークであり、RadixAttentionプレフィックスキャッシュを活用したJSON、正規表現、エージェントワークフロー向けの高速で構造化された生成を特長とします。特にプレフィックスが繰り返されるタスクにおいて、大幅に高速な推論を実現し、複雑な構造化出力やマルチターン対話に最適です。制約付きデコードが必要な場合や、広範なプレフィックス共有を伴うアプリケーションを構築する場合は、vLLMなどの代替案ではなくSGLangを選択してください。
