Skip to content

Instantly share code, notes, and snippets.

View tomkail's full-sized avatar

Tom Kail tomkail

View GitHub Profile
@tomkail
tomkail / RiveUIRenderer.cs
Last active February 12, 2024 11:04
Renders a Rive asset to Unity UI
// RiveUIRenderer.cs created by Tom Kail. This file is licensed under the MIT License.
// Renders a Rive asset to Unity UI using a RenderTexture in a similar manner to RawImage.
// Supports pointer events and masking.
using UnityEngine;
using UnityEngine.Rendering;
using Rive;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[ExecuteAlways]
@tomkail
tomkail / InputFieldActivationRestorer.cs
Created January 5, 2024 13:07
Workaround for Unity's inability to keep an input field selected when you click a button
using System.Reflection;
using TMPro;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
// Workaround for Unity's inability to keep an input field selected when you click a button.
// Call ReactivateInputField to immediately activate and restore caret position/selection.
// This class also tracks the state of the last selected input field in Update, allowing easier restoration of the input field when it becomes deselected.
// Common use cases are to:
@tomkail
tomkail / PresetImportPerFolder.cs
Created September 25, 2023 14:45
Automatically applies Preset files to assets in the same directory. Also adds labels present on the Preset file to those assets.
using System.IO;
using UnityEditor;
using UnityEditor.Presets;
using System.Linq;
// This script automatically applies Presets to assets when they are imported into a folder containing a Preset.
// It also adds any labels on the Preset file to the asset.
public class PresetImportPerFolder : AssetPostprocessor {
void OnPreprocessAsset() {
// Make sure we are applying presets the first time an asset is imported.
@tomkail
tomkail / GetLocalToAnchoredPositionOffset.cs
Created December 20, 2022 14:47
Converts between localPosition and anchoredPosition for a RectTransform.
// Add this to convert a local position to an anchored position
public static Vector2 GetLocalToAnchoredPositionOffset(this RectTransform rectTransform) {
var parentRT = (RectTransform) rectTransform.parent;
var pivotAnchor = new Vector2(Mathf.LerpUnclamped(rectTransform.anchorMin.x, rectTransform.anchorMax.x, rectTransform.pivot.x), Mathf.LerpUnclamped(rectTransform.anchorMin.y, rectTransform.anchorMax.y, rectTransform.pivot.y));
return -parentRT.rect.size * (pivotAnchor - parentRT.pivot);
}
// Add this to convert a local position to an anchored position
public static Vector2 GetAnchoredToLocalPositionOffset(this RectTransform rectTransform) {
return -rectTransform.GetLocalToAnchoredPositionOffset();
@tomkail
tomkail / Trim Ends.txt
Created November 3, 2022 13:10
Audacity macro to trim 5 seconds from the start and end of a track
Select:End="5" RelativeTo="ProjectStart" Start="0" Track="0" TrackCount="1"
Delete:
Select:End="5" RelativeTo="ProjectEnd" Start="0" Track="0" TrackCount="1"
Delete:
@tomkail
tomkail / Seamless Loop.txt
Last active November 3, 2022 16:33
Audacity macro to create seamless loops from audio tracks
Select:End="100000" RelativeTo="Project" Start="40" Track="0" TrackCount="1"
Delete:
Select:End="2" RelativeTo="ProjectEnd" Start="0"
Copy:
SelectNone:
Paste:
SelectTracks:Mode="Set" Track="0" TrackCount="2"
CrossfadeTracks:curve="0" direction="Automatic" type="ConstantGain"
MixAndRender:
SelectNone:
@tomkail
tomkail / InkParserUtility.cs
Last active January 21, 2024 14:11
Utility for parsing lines of ink into instructions that can be executed on the game side.
// Usage example:
// using System.Collections.Generic;
// using System.Text.RegularExpressions;
// public enum AudioCategory {
// Undefined,
// Music,
// Narration,
// }
@tomkail
tomkail / Better TextMeshPro GetRenderedValues
Created September 7, 2022 09:02
Better GetRenderedValues for TextMeshPro that doesn't return NaN/other invalid values and allows you to test with custom text
// Gets the tightest bounds for the text by updating the text and using GetRenderedValues
// Note this uses sizeDelta for sizing so won't work when using anchors.
// This is wayyyy more reliable than the actual GetRenderedValues because it won't return stupid values, as GetRenderedValues is prone to doing.
public static Vector2 GetRenderedValues (this TMP_Text textMeshPro, string text, float maxWidth = Mathf.Infinity, float maxHeight = Mathf.Infinity, bool onlyVisibleCharacters = true) {
if(string.IsNullOrEmpty(text)) return Vector2.zero;
var originalRenderMode = textMeshPro.renderMode;
var originalText = textMeshPro.text;
var originalDeltaSize = textMeshPro.rectTransform.sizeDelta;
@tomkail
tomkail / ColorDescriptor.cs
Last active September 14, 2022 17:29
Describes a color in english. Crude implementation, but handy for scanning colors when shown in text fields.
using System.Collections.Generic;
using UnityEngine;
[ExecuteAlways]
public static class ColorDescriptor {
public static string GetNameForColor (Color color) {
var bestDist = float.MaxValue;
string best = null;
foreach(var colorName in colorNames) {
@tomkail
tomkail / AbsoluteRectTransformController.cs
Last active April 15, 2024 14:57
Sets the rect of the attached RectTransform to a viewport space rect, regardless of the pivot, anchors, or (optionally) scale of the RectTransform.
using UnityEngine;
// Sets the rect of the attached RectTransform to a viewport space rect, regardless of the pivot, anchors, or (optionally) scale of the RectTransform.
[ExecuteAlways]
[RequireComponent(typeof(RectTransform))]
public class AbsoluteRectTransformController : MonoBehaviour {
public Rect viewportRect = new Rect(0,0,1,1);
public bool ignoreScale;
static Vector3[] corners = new Vector3[4];
DrivenRectTransformTracker drivenRectTransformTracker;