我有一个统一的项目,想使用一个预定义的列表一个接一个地调用方法。
在此测试场景中,我想两次执行startTrialWithFixedValue1(),两次执行startTrialWithFixedValue2(),最后一次执行startTrialWithRandomValue()。每次用户输入时,我都希望从列表中执行下一个方法。我的代码有两个主要问题:
(1)每当我使用带return的if语句时,变量countTrial都无法访问。调试日志始终显示为0:1,并且第一个方法始终执行。
(2)如果我排除return语句,则所有方法都立即启动。
[编辑]要指定我的问题:如何按照给定列表的顺序执行方法。
脚本A:
public int countTrial;
public int maxTrials = 16;
public Spawner spawner;
List<int> trialMarkers = new List<int>() {1, 1, 2, 2, 3};
public void chooseNextTrial()
{
for (int countTrial = 0; countTrial < maxTrials; countTrial++)
{
Debug.Log(countTrial + ": " + trialMarkers[countTrial]);
if (trialMarkers[countTrial] == 1)
{
spawner.startTrialWithFixedValue1();
return;
}
if (trialMarkers[countTrial] == 2)
{
spawner.startTrialWithFixedValue2();
return;
}
else
{
spawner.startTrialWithRandomValue();
return;
}
}
脚本B:
public void handleUserInput()
{
if (Input.GetButtonDown("Fire3"))
{
deleteAllChildren();
chooseTrial.chooseNextTrial();
}
}
}
希望你们能帮助我!
[EDIT2]如程序员所建议:删除该函数中的return语句,然后再次运行它。复制并粘贴Debug.Log(countTrial +“:” + trialMarkers [countTrial])的结果;结果总是:
5:3
5:3
5:3
...
答案 0 :(得分:3)
您需要删除For循环并更手动地处理Method的执行
public int countTrial = 0;
public int maxTrials = 16;
public Spawner spawner;
List<int> trialMarkers = new List<int>() {1, 1, 2, 2, 3};
public void chooseNextTrial()
{
Debug.Log(countTrial + ": " + trialMarkers[countTrial]);
if (trialMarkers[countTrial] == 1)
{
spawner.startTrialWithFixedValue1();
}
if (trialMarkers[countTrial] == 2)
{
spawner.startTrialWithFixedValue2();
}
else
{
spawner.startTrialWithRandomValue();
}
}
然后在第二个脚本(脚本B)中处理用户输入
public void handleUserInput()
{
if (Input.GetButtonDown("Fire3"))
{
deleteAllChildren();
chooseTrial.chooseNextTrial();
chooseTrial.countTrial++;
}
}
最后一行:您不应该使用Fop循环,因为您希望序列开始于玩家输入动作并按此处理。还添加了这样的方法:
public void NextCounter()
{
if(countTrial<trialMarkers.Count)
countTrial++
}
在脚本A中,然后在脚本B中这样调用它,以避免计数器超出列表计数。
chooseTrial.NextCounter();
强烈建议在SCript B中使用countTrial ++
答案 1 :(得分:1)
返回方法时,您将跳出循环。
for (int countTrial = 0; countTrial < (maxTrials <= trialMarkers.Count ? maxTrails : trialMarkers.Count) ; countTrial++)
{
Debug.Log(countTrial + ": " + trialMarkers[countTrial]);
if (trialMarkers[countTrial] == 1)
{
spawner.startTrialWithFixedValue1();
}
if (trialMarkers[countTrial] == 2)
{
spawner.startTrialWithFixedValue2();
}
else
{
spawner.startTrialWithRandomValue();
}
}
将按照您的要求执行。还要注意,我更改了迭代器,以免在循环中出现对象引用错误。
答案 2 :(得分:1)
如何执行与标题中所描述的类似的操作(给人的印象是您具有“功能列表”)。这个例子很容易扩展:
b
我创建一个“函数数组”(实际上是函数的委托),然后使用您的指令列表执行它们。