按照C#

时间:2018-07-20 13:52:15

标签: c# list unity3d

我有一个统一的项目,想使用一个预定义的列表一个接一个地调用方法。

在此测试场景中,我想两次执行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
...

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

我创建一个“函数数组”(实际上是函数的委托),然后使用您的指令列表执行它们。