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 -100
var v = 100f.RandomSign(); // 100f or -100f
Delay 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, 3
Insert 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