# New Script

> Scaffold a new Unity C# script under unity/Assets/Scripts/ following the project's conventions (SerializeField, headers, no per-frame allocations), and explain exactly which GameObject to attach it to. Use when creating any new MonoBehaviour, ScriptableObject, or utility class.

- Skill: `faaz17/new-script` (Agent Skill)
- Install (CLI): `npx skillmds@latest add faaz17/new-script`
- Raw SKILL.md: https://api.skillmd.com/api/skills/faaz17/new-script/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: Faaz17 (https://skillmd.com/u/faaz17)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/faaz17/new-script

---


# /new-script — Unity C# Script Scaffold

Create a new C# script that follows `.claude/rules/tech_defaults.md` exactly, and — because the user is a Unity beginner — always explain where it goes and how to wire it up.

## Steps

1. Ask (or infer from context): class name, feature area (Flood / Weather / XR / UI), and what it should do.
2. Confirm the Unity project exists (`unity/Assets/` present). If not, stop — scripts have nowhere to live before Phase 0's Unity project is created.
3. Create the file at `unity/Assets/Scripts/<Feature>/<ClassName>.cs`. Filename **must** match the class name.
4. Follow the template and conventions below.
5. Tell the user, step by step: which GameObject to attach it to, which Inspector fields to fill in, and what they should *see* when they press Play (the eye-verification step).

## Template

```csharp
using System.Collections;

using UnityEngine;

/// <summary>
/// One sentence: what this component does and what it attaches to.
/// </summary>
public class ClassName : MonoBehaviour
{
    [Header("Settings")]
    [SerializeField] private float exampleValue = 1f;

    [Header("References")]
    [SerializeField] private Transform exampleTarget;

    private void Awake()
    {
        // Cache components here — never GetComponent<X>() in Update().
    }

    private void Update()
    {
        // No allocations here: no `new`, no LINQ, no string concat, no Find().
    }
}
```

## Convention checklist (enforce all of these)

- `[SerializeField] private` for Inspector-exposed fields — never bare `public` fields.
- PascalCase class/methods, camelCase fields. One class per file.
- `using` groups: System / UnityEngine / third-party / project — blank-line separated.
- `[Header("...")]` groups in the Inspector.
- No magic numbers — extract to a serialized field or `const`.
- Coroutines need `using System.Collections;` (`IEnumerator`, non-generic).
- Event subscriptions in `Awake()`/`OnEnable()` get mirrored unsubscriptions in `OnDestroy()`/`OnDisable()`.
- Network calls (Phase 4): coroutine + `UnityWebRequest`, never blocking the main thread.

## After creating

Remind the user: **a script does nothing until attached to a GameObject** — and the scene must be saved (Ctrl+S) afterwards.

