Skip to content

Instantly share code, notes, and snippets.

@adammyhre
adammyhre / Processor.cs
Created November 23, 2025 10:36
Generic Processing Chains
using System;
using UnityEngine;
public interface IProcessor<in TIn, out TOut> {
TOut Process(TIn input);
}
public delegate TOut ProcessorDelegate<in TIn, out TOut>(TIn input);
public class ThresholdFilter : IProcessor<float, bool> {
@adammyhre
adammyhre / CharacterStateMachine.cs
Last active November 17, 2025 06:34
Curiously Recurring Template Pattern (CRTP) in C#
using System.Collections.Generic;
using UnityEngine;
public class MoveState : CharacterState<MoveState> {
protected override void OnEnter() {
Debug.Log("#State# Entered Move");
}
protected override void OnExit() {
Debug.Log("#State# Exited Move");
@adammyhre
adammyhre / AllocCounter.cs
Created October 19, 2025 12:34
Allocation Analyzer
using System;
using UnityEngine.Profiling;
// See UnityEngine.TestTools.Constraints.AllocatingGCMemoryConstraint
// and https://maingauche.games/devlog/20230504-counting-allocations-in-unity/
public class AllocCounter {
UnityEngine.Profiling.Recorder rec;
public AllocCounter() {
rec = Recorder.Get("GC.Alloc");
@adammyhre
adammyhre / BulletHoleSpawner.cs
Created October 5, 2025 12:54
Decal Pooling in Unity
using System.Collections;
using UnityEngine;
using UnityEngine.Pool;
using UnityEngine.Rendering.Universal;
public class BulletHoleSpawner : MonoBehaviour {
#region Fields
IObjectPool<DecalProjector> decalPool;
@adammyhre
adammyhre / AOETargeting.cs
Last active October 8, 2025 08:24
Ability Targeting System
using System;
using System.Linq;
using Unity.Cinemachine;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityUtils;
[Serializable]
public class AOETargeting : TargetingStrategy {
public GameObject aoePrefab;
@adammyhre
adammyhre / DamageOverTimeEffect.cs
Created September 21, 2025 11:43
Effects Over Time Example
using System;
using System.Collections.Generic;
using ImprovedTimers; // https://github.com/adammyhre/Unity-Improved-Timers
using UnityEngine;
[Serializable]
public class Ability {
public AudioClip castSfx;
public GameObject castVfx;
public GameObject runningVfx;
@adammyhre
adammyhre / DynamicNavMeshUpdater.cs
Created September 14, 2025 07:35
Updating NavMesh at Runtime using Quantization
using System;
using Unity.AI.Navigation;
using UnityEngine;
using UnityEngine.AI;
[DefaultExecutionOrder(-115)] // Before input system
public class DynamicNavMeshUpdater : MonoBehaviour {
[Header("Agent Tracking")] [SerializeField, Tooltip("The agent whose position will be used to update the NavMesh")]
NavMeshAgent trackedAgent;
@adammyhre
adammyhre / CullingManager.cs
Created September 6, 2025 18:06
CullingGroup API for Unity C#
using UnityEngine;
using System.Collections.Generic;
using UnityUtils; // https://github.com/adammyhre/Unity-Utils
public class CullingManager : Singleton<CullingManager> {
#region Fields
public Camera cullingCamera;
public float maxCullingDistance = 100f;
public LayerMask cullableLayers;
@adammyhre
adammyhre / Targeting.cs
Last active September 24, 2025 00:44
Combinator Programming Pattern for Unity C#
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using CanTarget = And<And<InRange, IsAlive>, LineOfSight>;
// ---------- Domain ----------
class Health : MonoBehaviour {
public int hp = 10;
@adammyhre
adammyhre / EnemyWorldUI.cs
Created August 24, 2025 09:23
Unity 6.2 World Space UI
using System;
using System.Collections.Generic;
using TMPro;
using Unity.Cinemachine;
using UnityEngine;
using UnityEngine.UI;
using UnityUtils;
[DisallowMultipleComponent]
public class EnemyWorldUI : MonoBehaviour {