如何在列表中存储函数内部的函数<>?
我知道这有点令人困惑,但我不知道如何更详细地解释它。这就是我如何理解我的问题。我想把函数存储在list中<>其中一个函数由另一个函数组成。由于List是以先进先出的方式执行的,所以当涉及到具有另一个函数的函数时,我希望它在继续执行父List中的另一个元素之前执行子元素,直到它完成。
对于场景,内部有另一个方法的方法是A Loop。我想让它迭代,直到满足某个条件,然后停止。然后,继续到父列表中存储的另一个方法。
就目前而言,我可以将方法存储在List中。它只知道如何在方法中执行方法。 下面是代码的预览:/private List<Function_> TranslateCodeFromBlocks(Transform parent, List<Function_> sequence_, List<Function_> insideLoop)
{
foreach (Transform child in parent)
{
var functionName = child.name.Split('_');
if (functionName[0] == "Function")
{
string function = functionName[1];
switch (function)
{
case "MoveRight":
sequence_.Add(new MoveRight("MoveRight"));
break;
case "MoveLeft":
sequence_.Add(new MoveLeft("MoveLeft"));
break;
case "MoveUp":
sequence_.Add(new MoveUp("MoveUp"));
break;
case "MoveDown":
sequence_.Add(new MoveDown("MoveDown"));
break;
case "MoveLoop":
foreach (Transform compLoop in parent)
{
var loopName = child.name.Split('_');
if (loopName[0] == "Function")
{
string tempLoop = loopName[1];
switch (function)
{
case "MoveRight":
insideLoop.Add(new MoveRight("MoveRight"));
break;
case "MoveLeft":
insideLoop.Add(new MoveLeft("MoveLeft"));
break;
case "MoveUp":
insideLoop.Add(new MoveUp("MoveUp"));
break;
case "MoveDown":
insideLoop.Add(new MoveDown("MoveDown"));
break;
}
}
}
sequence_.Add(new MoveLoop(insideLoop)); //this return error. Idk what to code, im stucked here.
break;
}
}
}
return sequence_;
}
}
这有点复杂,我希望你们能理解。因此,正如您所看到的,当涉及到MoveLoop(包含几个游戏对象)时,我希望代码能够找到每个子对象并将其添加到另一个列表中<>它调用了insidelloop。这List<比;会正常执行,它只是碰巧在另一个叫做MoveLoop的函数中。除了MoveLoop之外的其余部分被添加到父列表中><>被称为序列。
public MainLoop(Rigidbody2D mainTarget, List<Function_> sequence_)
{
this.end = false;
this.stop = false;
this.mainTarget = mainTarget;
this.sequence_ = sequence_;
}
public IEnumerator Play()
{
int i;
foreach (Function_ fun in this.sequence_)
{
fun.Func(this.mainTarget);
this.stop = true;
Stop();
yield return new WaitForSeconds(1);
}
}
}
然后这段代码执行List<>称为Sequence,它是父List<>。如何调用和执行List<>while List<>Sequence_正在执行?
public class MoveUp : Function_ {
public MoveUp(string ID) : base(ID)
{
this.ID = ID;
}
override public void Func(Rigidbody2D mainTarget)
{
Vector2 position = mainTarget.position;
position.y += 50;
mainTarget.MovePosition(position);
moveUp = true;
}
public class MoveRight : Function_ {
public MoveRight(string ID) : base(ID)
{
this.ID = ID;
}
override public void Func(Rigidbody2D mainTarget)
{
Vector2 position = mainTarget.position;
moveRight = true;
position.x += 45;
mainTarget.MovePosition(position);
}
以下是MoveUp, MoveRight的一些预览。
我是新手,所以如果我的编程术语是错误的,请原谅我。
EDIT: Problem Solved.
您可以将委托存储在列表中。
List<Func<int, int>> funcs = new List<Func<int, int>>();
funcs.Add(i => i * 2);
funcs[0].Invoke(1); //returns 2
请查看Func、Action和Predicate委托,参见委托:Predicate vs. Action vs. Func。