GameObject.Find () в Unity 3D - PullRequest
       19

GameObject.Find () в Unity 3D

0 голосов
/ 11 октября 2019

Это метод C #, который я нашел в учебнике по Unity3D:

Public List<Piece> pieces = new List<piece>(); // list of pieces in the pool

public Piece GetPiece(PieceType pt, int visualIndex) {
    Piece p = pieces.Find(x => x.type == pt && x.visualIndex == visualIndex);
} 

Чего я не понимаю, так это в этой строке: x => x.type == pt...

Где написано "x"откуда и почему x.type?

Ответы [ 5 ]

3 голосов
/ 11 октября 2019

Это List<T>.Find и не имеет ничего общего с GameObject.Find!


List<T>.Find:

Выполняет поиск элемента, который соответствует условиям, определенным указанным предикатом, и возвращает первое вхождение во всем List<T>.

Predicate<T>является делегатом [(или, в вашем случае, лямбда-выражением)] метода, который возвращает true, если переданный ему объект соответствует условиям, определенным в делегате. Элементы текущего List<T> индивидуально передаются делегату Predicate<T>, продвигаясь вперед по List<T>, начиная с первого элемента и заканчивая последним элементом. Обработка останавливается, когда найдено совпадение.


Тогда у вас есть Лямбда-выражение , где x - переменная итератора, как в

foreach(var x in pieces)

вот откуда взялась x. Он может в основном называться как угодно. И его тип Piece, поэтому от вашей Piece реализации зависит, что x.type .. смотрит на ваши параметры. Я бы сказал, что enum называется PieceType.


* 1044. * Так что это в основном так же, как и просто сокращение
public Piece GetPiece(PieceType pt, int visualIndex) 
{
    Piece p = default;

    foreach(var x in pieces)
    {
        if(x.type == pt && x.visualIndex == visualIndex) p = x;
    }

    return p;
} 
3 голосов
/ 11 октября 2019

Если вы посмотрите на определение Find, public T Find (Predicate<T> match), вы увидите, что он получает Predicate<T>, который является не чем иным, как функцией с параметром T и возвращаемым значением bool, Func<T, bool>. Это фактически означает, что последовательность элементов будет отфильтрована на основе предоставленной функции.

Один из возможных способов указать Func<T, bool> - использование языковой конструкции C #, называемой лямбда-выражением. При этом x => x.type == pt... является лямбда-выражением, которое определяет условия элемента для поиска.

Рассматривая:

Piece p = Pieces.Find(x => x.type == pt && x.visualIndex == visualIndex)

Цель состоит в том, чтобы отфильтровать Pieces на основе type и visualIndex, где x равно Piece. Не путайте с x, вы можете использовать любой литерал. Вы можете прочитать это как: Дайте мне каждый кусок x, где x.type - это pt, а x.visualIndex - это visualIndex

2 голосов
/ 11 октября 2019
Pieces.Find(x => x.type == pt && x.visualIndex == visualIndex)

Может быть записано как

Pieces.Find(singlePiece => singlePiece.type == pt && singlePiece.visualIndex == visualIndex)

, что означает:

"Внутри коллекции" Pieces "найти первый элемент, который имеет тип pt и свойство visualIndex которого равноvisualIndex) "

" singlePiece "или" x "обозначает, какие условия должны быть выполнены, чтобы элемент был" найден "с использованием метода Find.

2 голосов
/ 11 октября 2019

В методе find вы объявляете лямбда-функцию (точнее, предикат ), а x - переменная этой функции. Согласно этой инструкции x является экземпляром класса Piece и имеет атрибуты type и visualIndex.

Эта строка означает: «Найти первый элемент в piecesсписок, где type установлен на pt, а visualIndex установлен на visualIndex ".

2 голосов
/ 11 октября 2019

x - это объект Piece, который был найден в списке Pieces, а x.type - это поле, определенное внутри класса Piece, которое, в свою очередь, позволяет вам иметь объект p с таким жеPieceType как pt

...