Awesome
UrFairy
UrFairy (Your fairy) is a set of useful extensions for development in Unity.
Installation
Add following url on Unity Package Manager
https://git@github.com/beinteractive/UrFairy.git?path=Assets/UrFairy
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
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>
Other
Rnd
- PCG Random Number GeneratorInterpolations
- Time Based Interpolation Alghorithms
Editor Extensions
Extensions for Vector3
<a name="vector3-xyz"> .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
<a name="transform-localposition"> .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));
<a name="transform-localrotation"> .LocalRotation()
- One Liner Modification
Set a new value with modifying a current value:
// Multiply localRotation and quaternion
g.transform.LocalRotation(r => r * quaternion);
<a name="transform-localeulerangles"> .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));
<a name="transform-localscale"> .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));
<a name="transform-position"> .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));
<a name="transform-rotation"> .Rotation()
- One Liner Modification
Set a new value with modifying a current value:
// Multiply rotation and quaternion
g.transform.Rotation(r => r * quaternion);
<a name="transform-eulerangles"> .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));
<a name="transform-identity"> .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;
*/
<a name="transform-children"> .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);
}
<a name="transform-finddesendant"> .FindDesendant()
- Finding Desendant
Returns a transform that has a specified name by searching transform hierarchy recursive.
var d = transform.FindDesendant("DesendantName");
Extensions for Color
<a name="color-rgba"> .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)
<a name="color-hsv"> .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
<a name="material-color"> .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);
<a name="material-float"> .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);
<a name="material-keyword"> .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
<a name="renderer-material"> .Material()
- One Liner Modification
Set a new material with modifying existing material.
r.Material(m => m.Color("_Color", Color.red));
<a name="renderer-materials"> .Materials()
- One Liner Modification
Set a new materials with modifying existing materials.
r.Materials(m => m.Keyword("_GRAYSCALE", true));
Extensions for int
<a name="int-color"> .Color()
- Hex to Color
Hex value to Color:
var c = 0x112233.Color();
<a name="int-randomsign"> .RandomSign()
- Random Sign
Returns positive or negative value randomly
var v = 100.RandomSign(); // 100 or -100
Extensions for float
<a name="float-randomsign"> .RandomSign()
- Random Sign
var v = 100f.RandomSign(); // 100f or -100f
Extensions for MonoBehaviour
<a name="monobehaviour-delay-frames"> .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");
});
<a name="monobehaviour-delay-seconds"> .Delay()
- Delay Seconds
// this is MonoBehaviour
this.Delay(3.0f, () =>
{
Debug.Log("Three seconds after");
});
Extensions for IEnumerable<T>
<a name="ienumerable-asenumerable"> .AsEnumerable()
- Object to Enumerable
Convert a single object into IEnumerable.
// e is IEnumerable<int>
var e = 100.AsEnumerable();
<a name="ienumerable-combinefirst"> .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
<a name="ienumerable-combinelast"> .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
<a name="ienumerable-sample"> .Sample()
- Picking Random Object
// Pick a random element
var e = list.Sample();
<a name="ienumerable-shuffle"> .Shuffle()
- Enumerating in Random Order
var shuffled = list.Shuffle();
<a name="ienumerable-isempty"> .IsEmpty()
- Is Collection Empty
// Whether enumerable doesn`t have any element
var b = list.IsEmpty();
<a name="ienumerable-each"> .Each()
- Enumerating Elements
Same as each()
in Ruby.
list.Each(e =>
{
Debug.Log(e);
});
<a name="ienumerable-eachwithindex"> .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
<a name="ienumerable-activeobjects"> .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
<a name="ienumerable-actives"> .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>
<a name="list-shuffle"> .Shuffle()
- Shuffling
list.Shuffle();
Extensions for Dictionary<K, V>
<a name="dictionary-queryobject"> .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
<a name="dictionary-query"> .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>
<a name="t-tap"> .Tap()
Same as tap()
in Ruby.
particle.main.Tap(m => m.startColor = Color.red);
<a name="t-ifjust"> .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();
<a name="t-ifnothing"> .IfNothing()
Calls a closure if object is null.
Resources.Load<GameObject>("Prefab").IfNothing(Debug.Log("Prefab is not found"));
Other
<a name="rnd"> 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);
<a name="interpolations"> 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
<a name="spacebar-hand-tool"> Spacebar Hand Tool
Toggle hand tool while pressing a space key in the scene view like Photoshop.
<a name="capture-screenshot"> 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