【问题标题】:GameObject.Find() in Unity 3DUnity 3D 中的 GameObject.Find()
【发布时间】:2019-10-11 07:00:02
【问题描述】:

这是我在 Unity3D 教程中找到的 C# 方法:

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 =&gt; x.type == pt...

“x”从何而来,为什么是 x.type?

【问题讨论】:

标签: c# unity3d find gameobject object-pooling


【解决方案1】:

这是List&lt;T&gt;.Find,与GameObject.Find无关!


List&lt;T&gt;.Find:

搜索与指定谓词定义的条件匹配的元素,并返回整个List&lt;T&gt; 中的第一个匹配项。

Predicate&lt;T&gt; 是一个方法的委托[(或在您的情况下为 lambda 表达式)],如果传递给它的对象与委托中定义的条件匹配,则该方法返回 true。当前List&lt;T&gt; 的元素被单独传递给Predicate&lt;T&gt; 委托,在List&lt;T&gt; 中向前移动,从第一个元素开始到最后一个元素结束。找到匹配项时停止处理。


那么你有一个Lambda Expression,其中x 是迭代器变量,如

foreach(var x in pieces)

这就是x 的来源。它基本上可以调用任何你喜欢的。它的类型是Piece,所以它取决于你的Piece 实现x.type 是什么......看看你的参数我会说它是一个enum,称为PieceType


所以它的作用基本相同,只是一个简写

public Piece GetPiece(PieceType pt, int visualIndex) 
{
    foreach(var x in pieces)
    {
        if(x.type == pt && x.visualIndex == visualIndex) return x;
    }

    return default(Piece);
} 

【讨论】:

    【解决方案2】:

    如果您查看Find 定义public T Find (Predicate&lt;T&gt; match),您将看到它接收Predicate&lt;T&gt;,它只不过是一个带有参数T 和返回值boolFunc&lt;T, bool&gt; 的函数。这实际上意味着元素的序列将根据提供的函数进行过滤。

    指定Func&lt;T, bool&gt; 的一种可能方法是使用称为lambda 表达式的C# 语言构造。话虽如此,x =&gt; x.type == pt... 是一个 lambda 表达式,它定义了要搜索的元素的条件。

    看着:

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

    目的是根据typevisualIndex 过滤Pieces,其中xPiece。不要与x 混淆,您可以使用任何文字。你可以这样读: 给我每个 Piece x,其中 x.type 是 pt,x.visualIndex 是 visualIndex

    【讨论】:

      【解决方案3】:

      x 是在Pieces 列表中找到的Piece 对象,x.type 是在 Piece 类中定义的字段,这反过来让您拥有一个具有相同属性的 p 对象PieceTypept

      【讨论】:

        【解决方案4】:

        find 方法中,您声明了一个lambda 函数(更准确地说是predicate),x 是该函数的变量。根据这条指令,xPiece 类的一个实例,它具有typevisualIndex 属性。

        这一行的意思是:“在pieces 列表中查找第一个元素,其中type 设置为ptvisualIndex 设置为visualIndex”。

        【讨论】:

          【解决方案5】:
          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 方法“找到”元素必须满足哪些条件。

          【讨论】:

          • Except Find 只找到匹配条件的first元素。要查找所有元素,您将使用 Linq IEnumerable.WhereList&lt;T&gt;.FindAll
          猜你喜欢
          • 2023-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-26
          相关资源
          最近更新 更多