Skip to content

beinteractive/UrFairy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

69 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

Extensions for Transform

Extensions for Color

Extensions for Material

Extensions for Renderer

Extensions for int

Extensions for float

Extensions for MonoBehaviour

Extensions for IEnumerable<T>

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

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

Extensions for List<T>

Extensions for Dictionary<K, V>

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

Extensions for <T>

Other

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

Editor Extensions

Extensions for Vector3

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

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");

Extensions for Color

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();

Extensions for Material

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);

Extensions for Renderer

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));

Extensions for int

Hex value to Color:

var c = 0x112233.Color();

Returns positive or negative value randomly

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

Extensions for float

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

Extensions for MonoBehaviour

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");
});

Extensions for IEnumerable<T>

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}");
});

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

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

var activeObjects = objects.ActiveObjects();

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

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>

list.Shuffle();

Extensions for Dictionary<K, V>

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

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>

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"));

Other

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);

Editor Extensions

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.

License

Copyright 2016 Oink Games, Inc. and other contributors.

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