C# StartRoutine(带WWW)在Android上不起作用,但在编辑器Unity上起作用
我正在为我的web服务开发一个应用程序。我使用的是C# StartRoutine(带WWW)在Android上不起作用,但在编辑器Unity上起作用,c#,android,unity3d,C#,Android,Unity3d,我正在为我的web服务开发一个应用程序。我使用的是LitJson,我完成了应用程序,但在导出它以在android中测试它时,与WWWIEnumerators相关的应用程序不起作用 例如,一个启动会话的按钮,只有调用IEnumerator的函数起作用,但IEnumerator本身不起作用,我通过放置一条为应用程序创建的警报消息来检查它 这是按钮调用的函数: public void LogIn() { UserName = GameObject.Find("inputUsuario").tr
LitJson
,我完成了应用程序,但在导出它以在android中测试它时,与WWWIEnumerator
s相关的应用程序不起作用
例如,一个启动会话的按钮,只有调用IEnumerator
的函数起作用,但IEnumerator
本身不起作用,我通过放置一条为应用程序创建的警报消息来检查它
这是按钮调用的函数:
public void LogIn() {
UserName = GameObject.Find("inputUsuario").transform.GetChild(2).gameObject.GetComponent < Text > ().text;
Password = GameObject.Find("inputPassword").transform.GetChild(2).gameObject.GetComponent < Text > ().text;
Debug.Log("Username:" + UserName + "And Password:" + Password);
StartCoroutine(LogInWWW());
}
我必须补充一点,Android上的调试控制台没有错误。
此外,我必须澄清,我在URL中添加了前缀“http://”,因为这是一个解决方案,给出了我所看到的问题。当您实例化一个
新的WWW(串URL)
时,它也隐式启动请求,但不是同步操作,它是异步的,因此您必须先检查www.isDone
,然后才能使用www.text
。我认为它可以在Unity Editor上正常工作,因为它只是有一个更快的连接
public IEnumerator Request(){
using (var testRequest = new WWW(@"URL")) {
var totalWaited = 0;
var timeOuted = false;
while (testRequest.isDone == false) {
yield return new WaitForSeconds(1);
totalWaited++;
if (totalWaited > timeOutInSeconds) {
timeOuted = true;
}
}
if (timeOuted) { Debug.LogError("TimeOut"); yield break; }
yield return testRequest.text;
}
伙计们,有时错误很少,但简而言之,由于“反复试验”,我成功地找到了错误,问题是我试图使用
GetChild
获取UserName
和Password
的值,如下代码:
`Password = GameObject.Find("inputPassword").transform.GetChild(2).gameObject.GetComponent<Text>().text;`
`Password=GameObject.Find(“inputPassword”).transform.GetChild(2.GameObject.GetComponent().text`
由于某些原因,Android上不存在该对象,我了解到这一点,因为我一直在测试,直到部分代码出现问题。然后我决定更改代码,以更具体的方式查找文本,通过inputUserTextObj更改文本对象,与密码对象相同,并通过以下方式更改代码:
UserName = GameObject.Find("inputUsuarioTextObj").gameObject.GetComponent<Text>().text;
Password = GameObject.Find("inputPasswordTextObj").gameObject.GetComponent<Text>().text;
UserName=GameObject.Find(“inputusariotextobj”).GameObject.GetComponent().text;
Password=GameObject.Find(“inputPasswordTextObj”).GameObject.GetComponent().text;
正如我所说的,我知道问题不在于IEnumerator,但调试没有向我显示任何错误似乎太奇怪了,因为这是一个典型的“GameObject为Null”错误,我甚至可以用我的生命向他们发誓调试应用程序,而我从未显示过所述错误
但是,嘿,非常感谢你们的时间,伙计们,真的感受到了支持,并原谅我占用了你们的时间。Android上的
UrlLogin
和print(www.text)
的价值是什么?如果您从Debug.Log(“error:+www.error”)中得到任何错误代码>你也应该发布它。这将有助于回答您的问题。当您说它在编辑器上工作时,您的意思是说它只是在您按play键时编译,还是说它实际执行了您想要的操作应用程序没有启动任何值,IEnumerator没有完全工作(仅在Android上),在编辑器中它工作正常,它启动值我可以正确地完成“Login”功能,应用程序的其他IEnumerator也可以这样做。UrlLogin的值是:并且我没有得到任何错误,它只是不起作用。这个指令不应该在末尾:yield return www;吗;。在执行ProcessjsonLogin()之前返回;好的,如果www.isDone
,我会制作一个小的文本obj来调试,并且再次在编辑器中工作,但是在Android上,它什么也不做。我调试应用程序,我不能得到任何错误。它什么也不做。现在,我决定用一个简单的代码替换IEnumerator的所有代码:public IEnumerator loginww(){yield return new WaitForSeconds(1);GameObject.Find(“DebugTextObj”).GameObject.GetComponent().text=“www-ins-not-Done”}
同样,它在Android上不起作用,但在编辑器中起作用。我想知道减号的原因,以便更新代码。代码非常好用,我在上面备份了@Programmer,初始代码没有任何错误。你的代码错了。加载WWW内容时,您不会暂停与waitforseconds的协同程序,这没有任何意义。时间安排的逻辑是不相关的。至少如果你能打破这个循环,我可以看到逻辑的开始。最后一行是无用的,您不能从协同程序中产生内容。这不是用于集合的IEnumerator,如果需要返回数据,可以通过回调或参数赋值来实现。如果编辑连接在同一个地方使用,则很可能是相同的。@Everts您无法纠正此人,因为他不会听。这种答案就是为什么要按下投票按钮。var blueColor=Color.white;这是可行的,但也是错误的。如果您在设备上运行它,不要期望日志显示在编辑器上。我提供了一个关于如何在Android设备上查找日志的链接。美好的你真的确定这就是问题所在吗?这已经修复了?是的,输入链接,但我发誓我没有找到任何东西,或者我没有搜索好:/但是,是的,这就是问题所在,整个应用程序正在正常运行,没有任何问题,谢谢:)好的。不客气。奇怪的是,GetChild()
在Android上失败了。可能没有得到正确的游戏对象。我将投票支持这个答案,因为它解决了问题。快乐编码!
UserName = GameObject.Find("inputUsuarioTextObj").gameObject.GetComponent<Text>().text;
Password = GameObject.Find("inputPasswordTextObj").gameObject.GetComponent<Text>().text;