unity-csharp-scripting

v2026.09.24

C# scripting in Unity for gameplay, behavior, and engine integration. PROACTIVELY activate for: (1) writing Unity C# scripts, (2) MonoBehaviour lifecycle (Awake/OnEnable/Start/Update/FixedUpdate/LateUpdate), (3) coroutines and async/await in Unity, (4) delegates, events, Action/Func patterns, (5) ScriptableObject creation and serialization, (6) GetComponent / TryGetComponent and component caching, (7) physics scripting (Rigidbody, raycast, collision/trigger callbacks), (8) animation scripting (Animator parameters, state machines, IK), (9) NavMesh and NavMeshAgent scripting, (10) input handling (Input System package), (11) custom serialization and SerializeField. Provides: lifecycle reference, coroutine vs async patterns, ScriptableObject templates, Rigidbody/collision recipes, NavMesh examples, and Input System setup.

GitHub
安装命令
npx skhub add josiahsiegel/unity-csharp-scripting
Markdown
SKILL.md

Unity C# Scripting Patterns

Overview

Core C# scripting reference for Unity development. Covers MonoBehaviour lifecycle, physics and collision APIs, animation scripting, audio, navigation, common design patterns, serialization, and ECS/DOTS coding patterns.

MonoBehaviour Lifecycle

Execution Order

Awake() -> OnEnable() -> Start() -> FixedUpdate() -> Update() -> LateUpdate() -> OnDisable() -> OnDestroy()
MethodWhen CalledUse For
Awake()Once, when object instantiates (before Start)Self-initialization, caching references
OnEnable()Each time object becomes activeSubscribe to events, reset state
Start()Once, before first Update (after all Awake)Cross-object initialization
FixedUpdate()Fixed timestep (default 0.02s)Physics, Rigidbody movement
Update()Every frameInput, non-physics logic
LateUpdate()After all Update callsCamera follow, post-movement adjustments
OnDisable()When object deactivatesUnsubscribe events, save state
OnDestroy()When object is destroyedFinal cleanup, resource release

Key Rules

  • Awake runs even on disabled components (but not disabled GameObjects)
  • Never rely on Awake/Start order between scripts -- use [DefaultExecutionOrder(N)] or Script Execution Order settings
  • Use OnValidate() for editor-time validation of serialized fields

Coroutines and Async

Coroutines

IEnumerator SpawnWaves(int count, float delay)
{
    for (int i = 0; i < count; i++)
    {
        SpawnEnemy();
        yield return new WaitForSeconds(delay);
    }
}
// Start: Coroutine handle = StartCoroutine(SpawnWaves(5, 1f));
// Stop: StopCoroutine(handle); or StopAllCoroutines();
Yield InstructionBehavior
yield return nullWait one frame
yield return new WaitForSeconds(t)Wait t seconds (affected by timeScale)
yield return new WaitForSecondsRealtime(t)Unscaled time
yield return new WaitForFixedUpdate()Wait for next FixedUpdate
yield return new WaitForEndOfFrame()After rendering
yield return new WaitUntil(() => condition)Wait until predicate is true
yield return StartCoroutine(other)Wait for nested coroutine

Async/Await (Unity 6+ / UniTask)

For Unity 2023+/Unity 6, Awaitable is built-in. For older versions, use UniTask.

async Awaitable LoadLevelAsync(string sceneName)
{
    await Awaitable.WaitForSecondsAsync(1f);
    var op = SceneManager.LoadSceneAsync(sceneName);
    while (!op.isDone)
    {
        progressBar.value = op.progress;
        await Awaitable.NextFrameAsync();
    }
}

Events and Delegates

Event Pattern (Recommended)

// Publisher
public class Health : MonoBehaviour
{
    public event System.Action<float> OnDamaged;  // event keyword prevents external invocation
    public event System.Action OnDeath;

    public void TakeDamage(float amount)
    {
        currentHealth -= amount;
        OnDamaged?.Invoke(amount);
        if (currentHealth <= 0) OnDeath?.Invoke();
    }
}

// Subscriber
void OnEnable() => health.OnDamaged += HandleDamage;
void OnDisable() => health.OnDamaged -= HandleDamage;
void HandleDamage(float amount) => /* react */;

ScriptableObject Event Channels

Decouple systems without direct references. Create GameEvent as a ScriptableObject asset, invoke from publishers, and listen from subscribers via GameEventListener MonoBehaviours. See references/design-patterns.md for full implementation.

Physics API Quick Reference

Rigidbody Movement (3D)

TaskMethodWhere
Continuous forcerb.AddForce(dir * force)FixedUpdate
Instant impulserb.AddForce(dir * force, ForceMode.Impulse)FixedUpdate
Direct velocityrb.linearVelocity = dir * speedFixedUpdate
Kinematic moverb.MovePosition(target)FixedUpdate
Rotationrb.MoveRotation(targetRot)FixedUpdate

Note: In Unity 6, Rigidbody.velocity is renamed to Rigidbody.linearVelocity.

Raycasting

if (Physics.Raycast(origin, direction, out RaycastHit hit, maxDistance, layerMask))
{
    Debug.Log($"Hit {hit.collider.name} at {hit.point}");
}
// Use Physics.RaycastAll or Physics.RaycastNonAlloc for multiple hits
// 2D: Physics2D.Raycast, Physics2D.OverlapCircle, etc.

Collision vs Trigger

CallbackRequiresUse For
OnCollisionEnter/Stay/ExitBoth have colliders, at least one Rigidbody, isTrigger=falsePhysical impacts
OnTriggerEnter/Stay/ExitOne collider has isTrigger=true, at least one RigidbodyZones, pickups, detection

Always use CompareTag("Enemy") instead of other.tag == "Enemy" (avoids GC allocation).

Animation Scripting

[RequireComponent(typeof(Animator))]
public class CharacterAnimation : MonoBehaviour
{
    static readonly int SpeedHash = Animator.StringToHash("Speed");
    static readonly int JumpTrigger = Animator.StringToHash("Jump");
    Animator _anim;

    void Awake() => _anim = GetComponent<Animator>();
    void Update()
    {
        _anim.SetFloat(SpeedHash, moveSpeed);
        if (jumped) _anim.SetTrigger(JumpTrigger);
    }
}

Cache Animator.StringToHash results as static readonly fields to avoid per-frame hashing. Use Animation Events for gameplay-timed callbacks (footsteps, hit frames). For IK, implement OnAnimatorIK(int layerIndex) with SetIKPosition/Rotation/Weight.

Audio Quick Reference

[RequireComponent(typeof(AudioSource))]
public class SFXPlayer : MonoBehaviour
{
    [SerializeField] AudioClip[] clips;
    AudioSource _source;
    void Awake() => _source = GetComponent<AudioSource>();
    public void PlayRandom() => _source.PlayOneShot(clips[Random.Range(0, clips.Length)]);
}

Use AudioSource.PlayOneShot() for overlapping SFX. Use AudioMixer with exposed parameters for volume control. Use snapshots for state transitions (combat vs. exploration).

Serialization

TypeSerializedNotes
public fieldsYesVisible in Inspector
[SerializeField] privateYesPreferred -- maintains encapsulation
[HideInInspector] publicYes, hiddenSerialized but not shown
[NonSerialized] publicNoOpt-out of serialization
PropertiesNoNever serialized by Unity
DictionariesNoUse serialized list + rebuild, or Odin/SerializedDictionary
InterfacesNoUse abstract ScriptableObject or SerializeReference

Use [SerializeReference] for polymorphic serialization of interfaces and abstract types.

Common Design Patterns

PatternWhen to UseApproach
SingletonGlobal managers (Audio, GameState)ScriptableObject-based or lazy MonoBehaviour
ObserverDecoupled communicationC# events or SO event channels
CommandInput/undo systemsCommand interface + history stack
State MachineAI, player statesEnum + switch, or class-based states
Object PoolBullets, particles, enemiesQueue<T> with pre-instantiation
Service LocatorTestable global accessStatic registry with interface keys

For detailed implementations and code examples, see references/design-patterns.md.

ECS/DOTS Quick Reference

ConceptRole
EntityLightweight ID (no MonoBehaviour)
IComponentDataPure data struct on entities
SystemBase / ISystemLogic operating on component queries
EntityQueryFilter entities by component sets
Jobs (IJobEntity)Multithreaded systems
Burst CompilerSIMD-optimized native code

For ECS architecture patterns and migration guidance, see references/design-patterns.md.

Additional Resources

Reference Files

  • references/design-patterns.md -- Full implementations of singleton, observer, command, state machine, object pool, service locator, and ECS patterns
  • references/physics-animation-audio.md -- Detailed physics setup (2D and 3D), advanced animation (blend trees, IK, root motion, Animation Rigging), and audio architecture
发现
标签

此技能尚未发布标签。

版本
最新版本元数据

版本

v2026.09.24

发布时间

Sep 24, 2026

分类

未分类

许可证

MIT

源路径

plugins/unity-master/skills/unity-csharp-scripting

默认分支

main

最新提交

5a1b112

Tree SHA

376c8e0