UDN
Search public documentation:

UnrealScriptIteratorsCH
English Translation
日本語訳
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 主页 > 虚幻脚本 >UnrealScript语言参考指南 > UnrealScript 迭代器

UnrealScript迭代器


概述


UnrealScript 的 foreach 命令使处理成组的大量actor变得容易,比如迭代在一个关卡中的所有actors或者在一个actor附近特定距离内的所有actor。==foreach== 和一类称为 iterator(迭代器) 的特殊函数结合使用,该 iterator(迭代器) 函数 的作用是循环迭代一系列的actors。

这里是将一个迭代器和 foreach 命令结合使用的示例:

// Display a list of all lights in the level.
function Something()
{
	local Actor A;

	// Go through all actors in the level.
	log( "Physics:" );
	foreach AllActors( class 'Actor', A )
	{
		if( A.Physics != PHYS_Interpolating )
			log( A );
	}
}

在所有的 foreach 中的第一个参数都是一个常量类,它指定了要搜索的actor的类型。你可以用这个来限定搜索,比如,仅搜索所有的 Pawns

foreach 命令中的第二个参数是一个变量,在 foreach 循环过程中的每个迭代期间中这个变量都会被赋予一个actor值。

迭代器函数


这里是和 foreach 进行协同工作的所有的迭代函数。

Actor

所有这些迭代器函数是 Actor 类的成员函数,所以如果您想在一个非Actor类的函数中使用一个迭代器,你则必须有一个actor类的变量,使用以下语法:

AllActors ( class<actor> BaseClass, out actor Actor, optional class InterfaceClass )
循环处理关卡中的所有actors。如果您指定了可选参数 InterfaceClass ,那么则仅包含实现了 InterfaceClass 的actors。
DynamicActors( class<actor> BaseClass, out actor Actor, optional class InterfaceClass )
循环处理 bStatic=false 的所有actors。
ChildActors( class<actor> BaseClass, out actor Actor )
迭代循环处理这个actor具有的所有actors。
BasedActors( class<actor> BaseClass, out actor Actor )
迭代循环处理以这个actor作为基类的所有actors。
TouchingActors( class<actor> BaseClass, out actor Actor )
迭代循环处理和该actor相接触(渗入)的所有actors。
TraceActors( class<actor> BaseClass, out actor Actor, out vector HitLoc, out vector HitNorm, vector End, optional vector Start, optional vector Extent )
迭代循环处理从 Start 点到 End 点之间使用盒式碰撞范围 Extent 进行线性跟踪所触及的所有actors。在每次迭代中, HitLoc 设置为碰撞位置, HitNorm 设置为一个向外指的碰撞法线。
OverlappingActors( class<actor> BaseClass, out actor Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden )
迭代循环处理特定位置处的指定 Radius(半径) 内的所有actors(如果没有指定特定位置,则使用这个actor的位置)。
VisibleActors( class<actor> BaseClass, out actor Actor, optional float Radius, optional vector Loc )
迭代循环处理在特定位置处可见的所有actors的列表(如果没有指定位置,则使用这个actor的位置)。
VisibleCollidingActors ( class<actor> BaseClass, out actor Actor, float Radius, optional vector Loc, optional bool bIgnoreHidden )
返回指定半径内碰撞到(bCollideActors==true)的所有actors,从Loc(默认为调用者的位置)到那个actor的位置处的线性跟踪不会碰到世界。由于这个函数使用了碰撞散列函数,所以它要比 AllActors() 快很多。
CollidingActors ( class<actor> BaseClass, out actor Actor, float Radius, optional vector Loc )
返回某个 Radius(半径) 内碰撞到的actors( bCollideActors==true )。由于这个函数使用了碰撞散列函数,所以它要比 AllActors() 快很多。
ComponentList( class<ActorComponent> BaseClass, out ActorComponent out_Component )
返回actor的组件列表中的所有组件。
AllOwnedComponents( class<Component> BaseClass, out ActorComponent OutComponent )
返回“直接或间接”附加到actor上的所有组件。
LocalPlayerControllers( class<PlayerController> BaseClass, out PlayerController PC)
返回所有本地PlayerControllers(玩家控制器)。

从非Actor类中使用这些迭代器的语法是:

foreach ActorVar.DynamicActors(class'Pawn', P)

所以在 Interaction 的类使用迭代器,你可以这样做:

foreach ViewportOwner.Actor.DynamicActors(class'Pawn', P)

WorldInfo

这些迭代器函数都是 WorldInfo 类的成员函数,所以您需要具有到WorldInfo类的引用才能使用这些函数。

AllControllers(class<Controller> BaseClass, out Controller C)
迭代关卡中当前具有的所有 Controllers (Player 或 AI) 。
AllPawns(class<Pawn> BaseClass, out Pawn P, optional vector TestLocation, optional float TestRadius)
迭代当前关卡中的所有 Pawns 。您可以选择性地指定迭代某个给定位置(TestLocation)周围的某个半径(TestRadius)内的 Pawns
AllNavigationPoints(class<NavigationPoint> BaseClass, out NavigationPoint N)
迭代 NavigationPointList 中的所有 NavigationPoints 列表。
RadiusNavigationPoints(class<NavigationPoint> BaseClass, out NavigationPoint N, vector Point, float Radius)
迭代通过 Point 参数指定的位置周围的特定 Radius(半径) 内的 NavigationPointList 中的所有 NavigationPoints 的列表。
AllClientConnections(out Player ClientConnection, out int ClientIP, out int ClientPort)
迭代具有网络连接所有玩家对象的列表,同时传入了它们的IP及端口。仅在服务器上运行。

从Actor中使用这些迭代器的语法是:

foreach WorldInfo.AllControllers(class'Controller',C)

要想从非Actor中使用这些迭代器,您可以使用以下语法:

foreach class'WorldInfo'.static.GetWorldInfo().AllControllers(class'Controller', C)

Foreach和动态数组


通过使用 foreach 命令,动态数组现在也支持迭代功能。基本语法是:

foreach ArrayVariable(out ArrayItem, optional out ItemIndex)
{
   ...
}

ArrayItem 必须和数组中的元素是同一类型。如果提供了属性,每次迭代都将索引值进行增量计算并输出元素项及其索引值。

请参照 UnrealScript变量中的迭代动态数组部分获得更多信息。