UrFairy
September 18, 2020 ยท View on GitHub
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
.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