UrFairy (Your fairy) is a set of useful extensions for development in Unity.
Add following url on Unity Package Manager
https://git@github.com/beinteractive/UrFairy.git?path=Assets/UrFairy
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
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)Set a new value with modifying a current value:
// Set localPosition.x to 10f
g.transform.LocalPosition(p => p.X(10f));Set a new value with modifying a current value:
// Multiply localRotation and quaternion
g.transform.LocalRotation(r => r * quaternion);Set a new value with modifying a current value:
// Set localEulerAngles.z to 180f
g.transform.LocalEulerAngles(r => r.Z(180f));Set a new value with modifying a current value:
// Set localScale.y to 2f
g.transform.LocalScale(s => s.Y(2f));Set a new value with modifying a current value:
// Set position.x to 10f
g.transform.Position(p => p.X(10f));Set a new value with modifying a current value:
// Multiply rotation and quaternion
g.transform.Rotation(r => r * quaternion);Set a new value with modifying a current value:
// Set eulerAngles.z to 180f
g.transform.EulerAngles(r => r.Z(180f));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;
*/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);
}Returns a transform that has a specified name by searching transform hierarchy recursive.
var d = transform.FindDesendant("DesendantName");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)Color to HSV:
var hsv = color.HSV();Modify HSV:
hsv.s = hsv.s - 0.5f;HSV to Color:
var col = hsv.Color();Set a new value with modifying existing value (this method is chainable)
m.Color("_Color", c => c.A(0.5f)).Keyword("_ALPHA_BLEND", true);Set a new value with modifying existing value (this method is chainable)
m.Float("_Alpha", a => a * 0.5f).Keyword("_ALPHA_BLEND", true);Set a new value with modifying existing value (this method is chainable)
m.Keyword("_ENABLE_GRAYSCALE", b => !b).Float("_TIME_SCALE", 0.5f);Set a new material with modifying existing material.
r.Material(m => m.Color("_Color", Color.red));Set a new materials with modifying existing materials.
r.Materials(m => m.Keyword("_GRAYSCALE", true));Hex value to Color:
var c = 0x112233.Color();Returns positive or negative value randomly
var v = 100.RandomSign(); // 100 or -100var v = 100f.RandomSign(); // 100f or -100fDelay one frame:
// this is MonoBehaviour
this.Delay(() =>
{
Debug.Log("One frame after");
});Delay specified frames:
this.Delay(3, () =>
{
Debug.Log("Three frames after");
});// this is MonoBehaviour
this.Delay(3.0f, () =>
{
Debug.Log("Three seconds after");
});Convert a single object into IEnumerable.
// e is IEnumerable<int>
var e = 100.AsEnumerable();Insert a specified element to first.
var list = new int[] { 1, 2, 3 };
var n = 10;
list.CombineFirst(n); // 10, 1, 2, 3Insert a specified element to last.
var list = new int[] { 1, 2, 3 };
var n = 10;
list.CombineLast(n); // 1, 2, 3, 10// Pick a random element
var e = list.Sample();var shuffled = list.Shuffle();// Whether enumerable doesn`t have any element
var b = list.IsEmpty();Same as each() in Ruby.
list.Each(e =>
{
Debug.Log(e);
});Same as each_with_index() in Ruby.
list.EachWithIndex((e, i) =>
{
Debug.Log($"{i} -> {e}");
});Enumerates objects that is not null (means has not been destroyed yet)
var activeObjects = objects.ActiveObjects();Enumerates objects that is not null (means has not been destroyed yet and also related GameObject has not been destroyed)
var actives = components.Actives();list.Shuffle();Calls a closure with a object in a dictionary if exists and is not null.
dictionary.QueryObject("Foo", o => Debug.Log(o));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));Same as tap() in Ruby.
particle.main.Tap(m => m.startColor = Color.red);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();Calls a closure if object is null.
Resources.Load<GameObject>("Prefab").IfNothing(Debug.Log("Prefab is not found"));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);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);Toggle hand tool while pressing a space key in the scene view like Photoshop.
Capture the game view and save png image to project directory by editor menu UrFairy | Capture Screenshot.
Copyright 2016 Oink Games, Inc. and other contributors.
Code licensed under the MIT License: http://opensource.org/licenses/MIT