UrFairy icon indicating copy to clipboard operation
UrFairy copied to clipboard

C# extensions for Unity development

UrFairy

UrFairy (Your fairy) is a set of useful extensions for development in Unity.

Installation

Add following url on Unity Package Manager

List of extensions

Extensions for Vector3

  • .X() / .Y() / .Z() - One Liner Modification

Extensions for Transform

  • .LocalPosition() - One Liner Modification
  • .LocalRotation() - One Liner Modification
  • .LocalEulerAngles() - One Liner Modification
  • .LocalScale() - One Liner Modification
  • .Position() - One Liner Modification
  • .Rotation() - One Liner Modification
  • .EulerAngles() - One Liner Modification
  • .Identity() - Reset Transform
  • .Children() - Traversing Hierarchy
  • .FindDesendant() - Finding Desendant

Extensions for Color

  • .R() / .G() / .B() / .A() - One Liner Modification
  • .HSV() - Manipulating HSV

Extensions for Material

  • .Color() - One Liner Modification
  • .Float() - One Liner Modification
  • .Keyword() - One Liner Modification

Extensions for Renderer

  • .Material() - One Liner Modification
  • .Materials() - One Liner Modification

Extensions for int

  • .Color() - Hex to Color
  • .RandomSign() - Random Sign

Extensions for float

  • .RandomSign() - Random Sign

Extensions for MonoBehaviour

  • .Delay() - Delay Frames
  • .Delay() - Delay Seconds

Extensions for IEnumerable<T>

  • .AsEnumerable() - Object to Enumerable
  • .CombineFirst() - Appending Object to First
  • .CombineLast() - Appending Object to Last
  • .Sample() - Picking Random Object
  • .Shuffle() - Enumerating in Random Order
  • .IsEmpty() - Is Collection Empty
  • .Each() - Enumerating Elements
  • .EachWithIndex() - Enumerating Elements with Indicies

Extensions for IEnumerable<T> where T : UnityEngine.Object

  • .ActiveObjects() - Enumerating Not Destroyed Elements

Extensions for IEnumerable<T> where T : UnityEngine.Component

  • .Actives() - Enumerating Not Destroyed Elements

Extensions for List<T>

  • .Shuffle() - Shuffling

Extensions for Dictionary<K, V>

  • .QueryObject() - Nullsafe Querying

Extensions for Dictionary<K, V> where V : UnityEngine.Object

  • .Query() - Nullsafe Querying

Extensions for <T>

  • .Tap()
  • .IfJust()
  • .IfNothing()

Other

  • Rnd - PCG Random Number Generator
  • Interpolations - Time Based Interpolation Alghorithms

Editor Extensions

  • Spacebar Hand Tool
  • Capture Screenshot

Extensions for Vector3

.X() / .Y() / .Z() - One Liner Modification

Returns a new value with modifying a specified component value:

var v = new Vector3(1f, 2f, 3f);
var p = v.X(10f).Y(20f);

// p = Vector3(10f, 20f, 3f)

Relative value version:

var v = new Vector3(1f, 2f, 3f);
var p = v.X(x => x + 10f).Y(y => y + 20f);

// p = Vector3(11f, 22f, 3f)

Extensions for Transform

.LocalPosition() - One Liner Modification

Set a new value with modifying a current value:

// Set localPosition.x to 10f
g.transform.LocalPosition(p => p.X(10f));

.LocalRotation() - One Liner Modification

Set a new value with modifying a current value:

// Multiply localRotation and quaternion
g.transform.LocalRotation(r => r * quaternion);

.LocalEulerAngles() - One Liner Modification

Set a new value with modifying a current value:

// Set localEulerAngles.z to 180f
g.transform.LocalEulerAngles(r => r.Z(180f));

.LocalScale() - One Liner Modification

Set a new value with modifying a current value:

// Set localScale.y to 2f
g.transform.LocalScale(s => s.Y(2f));

.Position() - One Liner Modification

Set a new value with modifying a current value:

// Set position.x to 10f
g.transform.Position(p => p.X(10f));

.Rotation() - One Liner Modification

Set a new value with modifying a current value:

// Multiply rotation and quaternion
g.transform.Rotation(r => r * quaternion);

.EulerAngles() - One Liner Modification

Set a new value with modifying a current value:

// Set eulerAngles.z to 180f
g.transform.EulerAngles(r => r.Z(180f));

.Identity() - Reset Transform

Set initial values to position, rotation and scale.

g.transform.Identity();

// Same as:
/*
g.transform.localPosition = Vector3.zero;
g.transform.localRotation = Quaternion.identity;
g.transform.localScale = Vector3.one;
*/

.Children() - Traversing Hierarchy

Enumerates children (not includes desendants):

foreach (var child in transform.Children())
{
  Debug.Log(child.gameObject.name);
}

Enumerates children (includes desendants):

foreach (var child in transform.Children(true))
{
  Debug.Log(child.gameObject.name);
}

.FindDesendant() - Finding Desendant

Returns a transform that has a specified name by searching transform hierarchy recursive.

var d = transform.FindDesendant("DesendantName");

Extensions for Color

.R() / .G() / .B() / .A() - One Liner Modification

Returns a new value with modifying a specified component value:

var c = Color.white;
var v = c.A(0.5f);

// v = Color(1f, 1f, 1f, 0.5f)

.HSV() - Manipulating HSV

Color to HSV:

var hsv = color.HSV();

Modify HSV:

hsv.s = hsv.s - 0.5f;

HSV to Color:

var col = hsv.Color();

Extensions for Material

.Color() - One Liner Modification

Set a new value with modifying existing value (this method is chainable)

m.Color("_Color", c => c.A(0.5f)).Keyword("_ALPHA_BLEND", true);

.Float() - One Liner Modification

Set a new value with modifying existing value (this method is chainable)

m.Float("_Alpha", a => a * 0.5f).Keyword("_ALPHA_BLEND", true);

.Keyword() - One Liner Modification

Set a new value with modifying existing value (this method is chainable)

m.Keyword("_ENABLE_GRAYSCALE", b => !b).Float("_TIME_SCALE", 0.5f);

Extensions for Renderer

.Material() - One Liner Modification

Set a new material with modifying existing material.

r.Material(m => m.Color("_Color", Color.red));

.Materials() - One Liner Modification

Set a new materials with modifying existing materials.

r.Materials(m => m.Keyword("_GRAYSCALE", true));

Extensions for int

.Color() - Hex to Color

Hex value to Color:

var c = 0x112233.Color();

.RandomSign() - Random Sign

Returns positive or negative value randomly

var v = 100.RandomSign(); // 100 or -100

Extensions for float

.RandomSign() - Random Sign

var v = 100f.RandomSign(); // 100f or -100f

Extensions for MonoBehaviour

.Delay() - Delay Frames

Delay one frame:

// this is MonoBehaviour
this.Delay(() =>
{
  Debug.Log("One frame after");
});

Delay specified frames:

this.Delay(3, () =>
{
  Debug.Log("Three frames after");
});

.Delay() - Delay Seconds

// this is MonoBehaviour
this.Delay(3.0f, () =>
{
  Debug.Log("Three seconds after");
});

Extensions for IEnumerable<T>

.AsEnumerable() - Object to Enumerable

Convert a single object into IEnumerable.

// e is IEnumerable<int>
var e = 100.AsEnumerable();

.CombineFirst() - Appending Object to First

Insert a specified element to first.

var list = new int[] { 1, 2, 3 };
var n = 10;
list.CombineFirst(n); // 10, 1, 2, 3

.CombineLast() - Appending Object to Last

Insert a specified element to last.

var list = new int[] { 1, 2, 3 };
var n = 10;
list.CombineLast(n); // 1, 2, 3, 10

.Sample() - Picking Random Object

// Pick a random element
var e = list.Sample();

.Shuffle() - Enumerating in Random Order

var shuffled = list.Shuffle();

.IsEmpty() - Is Collection Empty

// Whether enumerable doesn`t have any element
var b = list.IsEmpty();

.Each() - Enumerating Elements

Same as each() in Ruby.

list.Each(e =>
{
  Debug.Log(e);
});

.EachWithIndex() - Enumerating Elements with Indicies

Same as each_with_index() in Ruby.

list.EachWithIndex((e, i) =>
{
  Debug.Log($"{i} -> {e}");
});

Extensions for IEnumerable<T> where T : UnityEngine.Object

.ActiveObjects() - Enumerating Not Destroyed Elements

Enumerates objects that is not null (means has not been destroyed yet)

var activeObjects = objects.ActiveObjects();

Extensions for IEnumerable<T> where T : UnityEngine.Component

.Actives() - Enumerating Not Destroyed Elements

Enumerates objects that is not null (means has not been destroyed yet and also related GameObject has not been destroyed)

var actives = components.Actives();

Extensions for List<T>

.Shuffle() - Shuffling

list.Shuffle();

Extensions for Dictionary<K, V>

.QueryObject() - Nullsafe Querying

Calls a closure with a object in a dictionary if exists and is not null.

dictionary.QueryObject("Foo", o => Debug.Log(o));

Extensions for Dictionary<K, V> where V : UnityEngine.Object

.Query() - Nullsafe Querying

Calls a closure with a object in a dictionary if exists and is not null (means has not been destroyed).

gameObjects.Query("Player", g => Debug.Log(g));

Extensions for <T>

.Tap()

Same as tap() in Ruby.

particle.main.Tap(m => m.startColor = Color.red);

.IfJust()

Calls a closure if object is not null.

// Invoke callback if not null
callback.IfJust(f => f());

In .NET 4.6 script backend, it's recommended to use a null conditional operator.

callback?.Invoke();

.IfNothing()

Calls a closure if object is null.

Resources.Load<GameObject>("Prefab").IfNothing(Debug.Log("Prefab is not found"));

Other

Rnd

Implementation of PCG Random Number Generation.

// With specified seed
var r = new Rnd(12345U, 678910U);
// Auto seed
var r = new Rnd();

// float
r.Value;
// uint
r.Value32;
// float range
r.Range(0.5f, 1.5f);
// uint range
r.Range(50, 150);

Interpolations

Time based interpolation alghrothims from Klak.

By passing a destination value, a current value, a speed and a delta time, an interpolated new current value will be returned.

// Approaching "to" by exponential algorhithm.
transform.localPosition = Interpolations.Expo(to, transform.localPosition, 30f, Time.deltaTime);

// Approaching "to" by critically damped spring smoothing.
transform.localPosition = Interpolations.CriticallyDamped(to, transform.localPosition, 30f, Time.deltaTime);

Editor Extensions

Spacebar Hand Tool

Toggle hand tool while pressing a space key in the scene view like Photoshop.

Capture Screenshot

Capture the game view and save png image to project directory by editor menu UrFairy | Capture Screenshot.

License

Copyright 2016 Oink Games, Inc. and other contributors.

Code licensed under the MIT License: http://opensource.org/licenses/MIT