我正在使用Unity 5.0。
我试图使用C#web客户端异步下载一些文件。
文件被下载,DownloadDataCompleted
事件也被触发。
然后我尝试做一些计算,但是我得到了这些错误。
RandomRangeInt
只能从主线程调用。 加载场景时,将从加载线程执行构造函数和字段初始值设定项。 不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移动到Awake或Start函数。
上述问题的任何解决方案或任何人都可以告诉我如何在主线程上运行该计算部分
正如所要求的代码在这里
private void DownloadXMLFromServer()
{
//first download the file from server
WebClient _maClient = new WebClient ();
_maClient.DownloadDataCompleted += delegate(object sender, DownloadDataCompletedEventArgs e)
{
File.WriteAllBytes("DownloadedXML.xml",e.Result);
DownloadImgOfApp();
};
_maClient.DownloadDataAsync (new Uri (instance.urlOf_XML));
}
public void DownloadImgOfApp()
{
int appNumber = UnityEngine.Random.Range (0, totalNumbOfAppsAvaialbeInXML);//these line throws error
string appName = "App" + (appNumber + 1);
string downloadImgLinkName = null;
string clickableLink = null; }
答案 0 :(得分:0)
Unity3D中的很多方法都可以从主线程中调用。这意味着只能在false
Start()
Update()
Awake()
中调用它们,依此类推。 Unity不允许您从不同的线程(包括异步回调)调用这些方法。
这对OnTriggerEnter(...)
这样的事情有意义,但我想不出随机可能导致问题的原因。但由于某种原因,Unity无论如何都在阻止呼叫。
要解决您的问题,您可以创建GameObject.Instatiate(...)
的实例并使用它生成随机数
我能看到的唯一问题是System.Random无法给你一个浮点数,只有字节,整数或双精度。