Random
Unity предоставляет простой метод Random.Range(min, max) для числовых типов int и float. В реальных проектах требуется более сложное случайное поведение и множество различных продвинутых методов. Методы из RandomUtil.cs основаны на Random.Range и немного упрощают жизнь.
Вернуть случайное булевое значение:
bool randomBool = RandomUtil.NextBool();
Вернуть случайный элемент из набора элементов item1, item2 или item3:
string randomPerson = RandomUtil.Next("me", "you");
Pork randomPork = RandomUtil.Next(Pork.NifNif, Pork.NafNaf, Pork.NufNuf);
Вернуть случайный элемент из массива:
int[] intArray = new[] { 1, 3, 5, 7, 9 };
int randomInt = RandomUtil.NextItem(intArray);
Вернуть случайный элемент из списка:
List<int> list = new List<int> { 1, 3, 5, 7, 9 };
int randomInt = RandomUtil.NextItem(list);
Вернуть случайный элемент перечисления:
enum Direction { Left, Right, Up, Down }
Direction randomDirection = RandomUtil.NextEnum<Direction>();
Вернуть случайный индекс переданного массива. Случайный выбор индекса основан на весовых коэффициентах массива:
int[] weights = new int[] { 10, 10, 30, 50 };
int randomIndex = RandomUtil.NextWeightedInd(weights);
Вернуть подсписок случайных элементов из исходного списка без повторения:
List<Card> deckCards = GetDeck();
List<Card> handCards = RandomUtil.Take(deckCards, 6);
Перемешать список:
List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
RandomUtil.Shuffle(list);
Перетасовать массив:
float[] array = new float[] { 1.1f, 1.2f, 1.3f, 1.5f, 1.6f };
RandomUtil.Shuffle(array);
Получить случайную точку на отрезке:
Vector2 point1 = new Vector2(123f, 321f);
Vector2 point2 = new Vector2(0f, 0f);
Vector2 randomPoint2 = RandomUtil.NextPointOnLine(point1, point2);
Vector3 point3 = new Vector3(123f, 321f, 213f);
Vector3 point4 = new Vector3(0f, 0f, 0f);
Vector3 randomPoint3 = RandomUtil.NextPointOnLine(point3, point4);
Получить шанс с заданным процентом (от 0 до 100). Если процент равен 25, то в среднем каждый 4-й раз будет возвращаться значение true:
int percentage = 25;
bool isSuccess = RandomUtil.GetChance(percentage);
Получить шанс с заданной вероятностью (от 0f до 1f). Если вероятность равна 0.25, то в среднем каждый 4-й раз будет возвращаться значение true:
float probability = 0.25f;
bool isSuccess = RandomUtil.GetChance(probability);
Методы расширений
В классе UtilsExtensions.cs. находятся различные расширения и синтаксический сахар для часто используемых операций.
Обертки для вызова
Типобезопасные версии функций вызова из MonoBehaviour.
Вместо этого используется
1. Invoke("InvokedFunc", 1f);
2. InvokeRepeating("InvokedFunc", 1f, 1f);
3. bool isInvoking = IsInvoking("InvokedFunc");
4. CancelInvoke("InvokedFunc");
мы можем использовать типобезопасные методы:
1. this.Invoke(() => InvokedFunc(), 1f);
2. this.InvokeRepeating(() => InvokedFunc(), 1f, 1f);
3. bool isInvoking = this.IsInvoking(() => InvokedFunc());
4. this.CancelInvoke(() => InvokedFunc());
Оболочки RectTransform
Компонент RectTransform содержит неочевидные и сложные в использовании свойства (например, offsetMin, offsetMax, sizeDelta и т. д.). Редактор Unity предоставляет более понятные поля ввода в инспекторе для RectTransform, такие как Left, Top, Right, Bottom, Width, Height, PosX, PosY и т. д.
Иногда мы хотим задать эти поля в коде и не можем понять, как для этого манипулировать RectTransform. Следующие обёртки позволяют нам это сделать:
rectTransform.SetLeft(fLeft);
rectTransform.SetRight(fRight);
rectTransform.SetTop(fTop);
rectTransform.SetBottom(fBottom);
rectTransform.SetLeftTopRightBottom(fLeft, fTop, fRight, fBottom);
rectTransform.SetPosX(fPosX);
rectTransform.SetPosY(fPosY);
rectTransform.SetPosXY(fPosX, fPosY);
rectTransform.SetWidth(fWidth);
rectTransform.SetHeight(fHeight);
rectTransform.SetWidthHeight(fWidth, fHeight);
rectTransform.SetPosAndSize(fPosX, fPosY, fWidth, fHeight);
Иногда мы хотим использовать привязки RectTransform и выравнивать UI-компоненты по проценту от размеров родительского UI-компонента. Следующие обёртки позволяют задавать смещения в процентах от левой, верхней, правой и нижней сторон:
rectTransform.SetLeftAnchorOffset(0.1f);
rectTransform.SetTopAnchorOffset(0.05f);
rectTransform.SetRightAnchorOffset(0.05f);
rectTransform.SetBottomAnchorOffset(0.1f);
rectTransform.SetAnchorOffset(0.1f, 0.05f, 0.05f, 0.1f);
RectTransform предоставляет мировые координаты всех четырёх углов RectTransform. Метод GetWorldCorners возвращает массив из четырёх векторов Vector3, и нам всегда приходится читать документацию, так как мы не можем определить, как эти векторы соотносятся с углами. Следующие методы преобразуют это в читаемый код:
worldTransform.position = rectTransform.GetWorldCenter();
worldTransform.position = rectTransform.GetWorldTopLeft();
worldTransform.position = rectTransform.GetWorldTopRight();
worldTransform.position = rectTransform.GetWorldBottomLeft();
worldTransform.position = rectTransform.GetWorldBottomRight();
worldTransform.position = new Vector2(rectTransform.GetWorldLeft(), rectTransform.GetWorldTop());
worldTransform.position = new Vector2(rectTransform.GetWorldRight(), rectTransform.GetWorldBottom());
Rect rect = rectTransform.GetWorldRect();
Система частиц.PlayAndWaitForFinish()
Обертка позволяет последовательно запускать системы частиц и выполнять логику, когда эффект конкретных частиц завершается.
public ParticleSystem Particles1;
public ParticleSystem Particles2;
public IEnumerator RunParticlesCoroutine()
{
yield return Particles1.PlayAndWaitForFinish();
yield return Particles2.PlayAndWaitForFinish();
DoLogicAfterParticles();
}