Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表中的随机索引未删除,ArgumentoutofRangeException错误_C#_Unity3d_Random_Remove_Unity Ui - Fatal编程技术网

C# 列表中的随机索引未删除,ArgumentoutofRangeException错误

C# 列表中的随机索引未删除,ArgumentoutofRangeException错误,c#,unity3d,random,remove,unity-ui,C#,Unity3d,Random,Remove,Unity Ui,在我的Unity项目中,我列出了4个信号。在代码中,当调用CheckPress()时,从信号列表中选择一个随机索引,我称之为firststimIndex,该索引通过UDP发送到MAX/MSP以播放一些音频。调用PlaySignal()时,将播放与此索引关联的音频。这个很好用。然后,当调用LoadNextSignal()时,将删除以前的索引,并加载和播放一个新的随机索引并将其删除LoadNextSignal()需要调用3次,因为剩余的信号数为3。此过程将继续,直到从列表中删除所有信号 我的问题在于

在我的Unity项目中,我列出了4个信号。在代码中,当调用
CheckPress()
时,从信号列表中选择一个随机索引,我称之为
firststimIndex
,该索引通过UDP发送到MAX/MSP以播放一些音频。调用
PlaySignal()
时,将播放与此索引关联的音频。这个很好用。然后,当调用
LoadNextSignal()
时,将删除以前的索引,并加载和播放一个新的随机索引并将其删除
LoadNextSignal()
需要调用3次,因为剩余的信号数为3。此过程将继续,直到从列表中删除所有信号

我的问题在于当第二次调用时执行
LoadNextSignal()
时。如何修复代码的这一部分?此外,变量stimIndex是必需的,正如在我的项目中一样,当我写入数据时,它被写入
signals[stimIndex]

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Text;
using System.Net;
using System.Net.Sockets;

public class CheckButtonBehaviour : MonoBehaviour
{
public Button Check;
public Button Play;
public Button NextSignal;

public List<string> signals = new List<string> {"Speech1", "Speech2", "Speech3", "Speech4"};

public int stimIndex;
public int index = 1;
public int counter = 3;
public int remainingSignals;

private static int localPort;
private string IP;  
public int port = 8050;
IPEndPoint remoteEndPoint;
UdpClient client;

void Start()
{
    IP = "127.0.0.1";
    port = 8050;
    remoteEndPoint = new IPEndPoint(IPAddress.Parse(IP), port);
    client = new UdpClient();
    Play.gameObject.SetActive(false);
    NextSignal.gameObject.SetActive(false);
}

public void CheckPress()    
{
    var random = new System.Random();
    int firststimIndex = random.Next(signals.Count);

    ///Sends to MAX MSP 
    string text = firststimIndex.ToString();
    byte[] data5 = Encoding.ASCII.GetBytes(text);
    client.Send(data5, data5.Length, remoteEndPoint);
    Debug.Log("<color=red>First signal is : </color>"+ signals[firststimIndex]);
    stimIndex = firststimIndex;
    
    Check.gameObject.SetActive(true);
    Check.interactable = false;
    Check.enabled = false;

    Play.gameObject.SetActive(true);
    NextSignal.gameObject.SetActive(true);
}

public void LoadNextSignal()
{
   if(signals.Count == 0)
      return;
   signals.RemoveAt(stimIndex); //Removes the previous signal
   remainingSignals = signals.Count;

   Debug.Log("<color=red>Remaining Signals are : </color>" + remainingSignals);
   int randomIndex = UnityEngine.Random.Range(0, remainingSignals);
   string text1 = randomIndex.ToString(); 
   byte[] data6 = Encoding.ASCII.GetBytes(text1);
   stimIndex = randomIndex;
   client.Send(data6, data6.Length, remoteEndPoint);
   
   
   Debug.Log("Loaded Signal" + stimIndex + "; remaining signals before removal equals" + remainingSignals);
   index++;

    if (counter >= index)
    {
        Debug.Log("<color=orange>Yay! Keep Listening!</color>");
    }
    else
    {
        Debug.Log("<color=green>All Trials finished</color>");
        Play.gameObject.SetActive(false);
        NextSignal.gameObject.SetActive(false);
    }
}

void PlaySignal()
{
    byte[] data2 = Encoding.ASCII.GetBytes("A"); //B
    client.Send(data2, data2.Length, remoteEndPoint);
    Debug.Log("<color=red>Signal is Played</color>");
}
}
使用System.Collections.Generic;
使用UnityEngine;
使用UnityEngine.UI;
使用系统文本;
Net系统;
使用System.Net.Sockets;
公共类CheckButtonBehaviour:单行为
{
公共按钮检查;
公共按钮播放;
公共按钮下一个信号;
公共列表信号=新列表{“Speech1”、“Speech2”、“Speech3”、“Speech4”};
公共综合指数;
公共int指数=1;
公共整数计数器=3;
公共信号;
私有静态intlocalport;
私有字符串IP;
公共int端口=8050;
IPEndPoint远程端点;
UDP客户;
void Start()
{
IP=“127.0.0.1”;
端口=8050;
remoteEndPoint=新的IPEndPoint(IPAddress.Parse(IP),端口);
client=新的UdpClient();
Play.gameObject.SetActive(false);
NextSignal.gameObject.SetActive(false);
}
公开作废支票出版社()
{
var random=新系统.random();
int firststimIndex=random.Next(signals.Count);
///发送到最大MSP
string text=firststimIndex.ToString();
字节[]数据5=编码.ASCII.GetBytes(文本);
Send(data5,data5.Length,remoteEndPoint);
Log(“第一个信号是:”+信号[firststimIndex]);
stimIndex=第一个stimIndex;
检查.gameObject.SetActive(true);
Check.interactiable=false;
Check.enabled=false;
Play.gameObject.SetActive(true);
NextSignal.gameObject.SetActive(true);
}
public void LoadNextSignal()
{
如果(signals.Count==0)
返回;
signals.RemoveAt(stimIndex);//删除上一个信号
剩余信号=信号。计数;
Debug.Log(“剩余信号为:”+remainingSignals);
int randomIndex=UnityEngine.Random.Range(0,剩余信号);
string text1=randomIndex.ToString();
字节[]数据6=Encoding.ASCII.GetBytes(text1);
刺激指数=随机指数;
Send(data6,data6.Length,remoteEndPoint);
Debug.Log(“加载的信号”+STIMDINDEX+”;删除前的剩余信号等于“+remainingSignals”);
索引++;
如果(计数器>=索引)
{
Log(“耶!继续收听!”);
}
其他的
{
Debug.Log(“所有试验已完成”);
Play.gameObject.SetActive(false);
NextSignal.gameObject.SetActive(false);
}
}
无效播放信号()
{
byte[]data2=Encoding.ASCII.GetBytes(“A”);//B
Send(data2,data2.Length,remoteEndPoint);
Debug.Log(“播放信号”);
}
}
代码有几个“问题”,但可以解决:

  • 使用
    UnityEngine.Random.Range(0,剩余信号)
    获取Int值
  • 此函数始终返回上所述的浮点值。您希望将结果设置为
    int
    ,我将遵循
    new System.Random().Next(signals.Count)
    仅限


  • 当列表项可以为空时访问这些列表项
  • 在开发这样的程序/函数时,这些程序/函数是从不同的地方调用的,开发人员通常试图在可能的情况下防止任何问题和异常。例如,我们可以使用您的方法
    public void LoadNextSignal()
    ,并在开头添加以下行:

    public void LoadNextSignal()
    {
       if(signals.Count == 0) return;
    
       //... the rest of the code
    }
    

    这将防止跳出索引并引发此异常。背后的主要思想是,您永远无法确定它被执行了多少次。

    它不是被调用了很多次,以至于列表中不再有项目了吗?您没有可以覆盖这种情况的代码。例如,如果您有4个remainingSignals,则您的信号列表中只有0-3之间的索引值,但您的随机代码会生成0-4之间的索引。你应该把上界改成保留信号-1。@Ralf我不这么认为。对于int参数,第二个参数是互斥的,因此值实际上是
    0
    remainingSignals-1
    ,如果
    remainingSignals==0
    ,则为yes?您应该检查这种情况,如
    if(remainingSignals==0){return;}
    或类似的情况。。。您是否尝试过逐行调试您的代码,并查看它在哪一点上的行为不符合预期?我想你可以通过这种方式自己找到问题。。否则,我们中的一个人将不得不在脑海中做同样的事情,而我目前对此没有太大的野心;)@Tatranskymedved,我“多次”都不明白
    LoadNextSignal()
    将只调用三次,因为列表中应该还有三个信号。我尝试了您建议的步骤1和步骤2。解决了参数超出范围的错误。然而,有一个信号是重复的,其中一个从未播放过。简而言之,我听到4个信号,但它们彼此没有区别。例如,如果Speech1作为第一个信号播放,它将作为第三个或第四个信号再次重复。我在Inspector中检查了stimIndex变量,我观察到它的值从未超过2。它接受值0、1和2。因为这个原因,我从来没有听过演讲。有人能建议我应该做什么吗?我建议你试着画一张流程图。对于每种方法