Skip to content

Instantly share code, notes, and snippets.

@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 {
@adammyhre
adammyhre / make-package.sh
Created August 12, 2025 14:25
Automating creation of a custom Unity Project Template
#!/usr/bin/env bash
set -euo pipefail
##############################################
# make-template.sh
#
# This script packages a Unity template for local use
# in Unity Hub's ProjectTemplates folder.
#
# How it works:
@adammyhre
adammyhre / ArenaAllocator.cs
Created June 8, 2025 07:18
Unity Memory Arena
using System;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
public unsafe class ArenaAllocator : IDisposable {
byte* buffer; // 'buffer' is a pointer to a byte (i.e., byte*)
int offset;
readonly int capacity;
public ArenaAllocator(int sizeInBytes) {