Skip to content

Instantly share code, notes, and snippets.

@GeorgiyRyaposov
GeorgiyRyaposov / AssetDatabaseUtils.cs
Created March 24, 2025 05:54
Find ScriptableObject anywhere at project, or prefab, create scriptable, add it to addressables, etc
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEditor.AddressableAssets;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine;
using Object = UnityEngine.Object;
@GeorgiyRyaposov
GeorgiyRyaposov / CharactersContainer.cs
Last active March 27, 2025 04:51
AssetPostprocessor for scriptable files. At Example below finds all containers of scriptable files and collect theme automatically on scriptable added/removed
using UnityEngine;
namespace Code.Scripts.Configs.InteractionItems
{
[CreateAssetMenu(fileName = "CharactersContainer", menuName = "Configs/Interactions/CharactersContainer")]
public class CharactersContainer : ScriptableObject, IConfigsContainer
{
public CharacterInfo[] Characters = new CharacterInfo[0];
public void UpdateItems(IAssetsFinder finder)
@GeorgiyRyaposov
GeorgiyRyaposov / HexDirection.cs
Last active March 11, 2025 10:59
Unity hexagon grid helpers
namespace Code.Scripts.Data.Hexes
{
public enum HexDirection
{
NE,
E,
SE,
SW,
W,
NW
@GeorgiyRyaposov
GeorgiyRyaposov / QuadTree.cs
Created January 26, 2025 02:31
Generic 2d quad tree implementation
using System.Collections.Generic;
using UnityEngine;
namespace Code.Scripts.Utils
{
public class QuadTree<T> where T : Component
{
private const int Capacity = 4;
private readonly Rect _bounds;
@GeorgiyRyaposov
GeorgiyRyaposov / SquareGrid.cs
Created January 14, 2025 11:17
Simple square grid: converts position to index; keep flat list of grid items
using Unity.Burst;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.Events;
namespace Grids.Square
{
[BurstCompile]
public class SquareGrid<T>
{
@GeorgiyRyaposov
GeorgiyRyaposov / ScriptableObjectIdAttribute.cs
Last active April 16, 2025 07:35
Generate unique id for scriptable + duplicate check
using System;
using UnityEngine;
namespace Code.Scripts.Utils
{
public class ScriptableObjectIdAttribute : PropertyAttribute { }
#if UNITY_EDITOR
[UnityEditor.CustomPropertyDrawer(typeof(ScriptableObjectIdAttribute))]
public class ScriptableObjectIdDrawer : UnityEditor.PropertyDrawer
@GeorgiyRyaposov
GeorgiyRyaposov / PathFinding.cs
Created February 23, 2023 02:10
SquareGrid + path finding
using System.Collections.Generic;
using Unity.Mathematics;
namespace Grids.Square
{
public class PathFinding
{
private const int MOVE_STRAIGHT_COST = 10;
private const int MOVE_DIAGONAL_COST = 14;
//To get the difference C between quaternions A and B you do this:
C = A * Quaternion.Inverse(B);
//To add the difference to D you do this:
D = C * D;
/////////////////
//World vs local
//An easy way to keep track of the order of operations for quaternions is to think of it in terms of world and local rotations.
//When multiplying a quaternion the world rotation is on the left, and the local rotation is on the right, like this:
@GeorgiyRyaposov
GeorgiyRyaposov / Debug.cs
Created September 30, 2021 09:27
Debug capsule or sphere even from not monobehaviours
private List<GameObject> _debug = new List<GameObject>();
private void ClearDebug()
{
for (int i = _debug.Count - 1; i >= 0; i--)
{
GameObject.Destroy(_debug[i]);
}
_debug.Clear();
}
private void Debug(Vector3 pos, Color color)
@GeorgiyRyaposov
GeorgiyRyaposov / SnapCurve.cs
Created September 23, 2021 04:26
When you need to snap value, e.g. each 45 from 0 to 360
private AnimationCurve GetSnapCurve(float min, float max, float snapAt, float snapAmount, WrapMode wrapMode = WrapMode.Clamp)
{
var keyFrames = new List<Keyframe>
{
new Keyframe(0, min),
new Keyframe(1, max)
};
for (float i = snapAt; i < max; i += snapAt)
{