我有一个对象和附加到它的脚本。
我想在脚本的Update
函数中将数据发送到Web服务器。
所以我创建了一个WWW对象。 但是一段时间后,Unity开始报告“线程不应再运行了”。
以下是更新功能:
void Update ()
{
//ambil tindakan dari server
//bikin object www
//bikin request ke localhost/vacuum?r=index/action
//ambil hasilnya (json)
//ambil perintah
//eksekusi perintah
//scan lingkungan
var fwd = transform.TransformDirection (Vector3.forward);
var left = transform.TransformDirection (Vector3.left);
var right = transform.TransformDirection (Vector3.right);
var back = transform.TransformDirection (Vector3.back);
RaycastHit hit_fwd = new RaycastHit(),
hit_left = new RaycastHit(),
hit_right = new RaycastHit(),
hit_back = new RaycastHit();
bool bool_hit_fwd, bool_hit_left, bool_hit_right, bool_hit_back;
float
distance_fwd = 0.0f,
distance_left = 0.0f,
distance_right = 0.0f,
distance_back = 0.0f;
bool_hit_fwd = Physics.Raycast (transform.position, fwd, out hit_fwd, 50);
bool_hit_left = Physics.Raycast (transform.position, left, out hit_left, 50);
bool_hit_right = Physics.Raycast (transform.position, right, out hit_right, 50);
bool_hit_back = Physics.Raycast (transform.position, back, out hit_back, 50);
if (bool_hit_fwd)
{
distance_fwd = hit_fwd.distance;
}
if (bool_hit_left)
{
distance_left = hit_left.distance;
}
if (bool_hit_right)
{
distance_right = hit_right.distance;
}
if (bool_hit_back)
{
distance_back = hit_back.distance;
}
transform.Rotate(0, 0.01f, 0);
print(
"rot-y/pos-x/pos-y :: fwd/left/right/back = " +
transform.rotation.eulerAngles.y + '/' +
transform.position.x + '/' +
transform.position.y + '/' +
" :: " +
distance_fwd + '/' +
distance_left + '/' +
distance_right + '/' +
distance_back);
String url = "http://localhost:1234/minibrain?" +
"roty=" + transform.rotation.eulerAngles.y.ToString() +
"&posx=" + transform.position.x.ToString() +
"&posy=" + transform.position.y.ToString() +
"&fwddist=" + distance_fwd.ToString() +
"&leftdist=" + distance_left.ToString() +
"&rightdist=" + distance_right.ToString() +
"&backdist=" + distance_back.ToString();
WWW www = new WWW(url);
}
没有错误。 Web服务器正确接收数据。但数据传输率大大降低。像每秒100次传输一样,每秒传输10次。
有没有办法创建WWW对象而不会导致“线程不再运行”?
答案 0 :(得分:1)
这里的问题很可能就是你在Update()
中运行了所有内容。这通常会尽可能快地向前推进。您对WWW的调用将立即返回(它不会等到所有操作都完成),然后您转到下一帧。
因此,如果您的更新运行速度足够快,您将会遇到越来越多未完成的WWW对象。我不知道它目前的运行速度有多快,但你必须问问自己是否需要那么多的数据点,或者如果通过WWW调用是最好的方法。如果您的设置可用,套接字连接可能会更好。
如果您对以尽可能快的方式发送数据感到满意,请确保通过将调用设置为协程来检查isDone
,或者在这种情况下仅为其返回产生收益。 (不要在它上面使用while循环)或者或者只是确定一个你想要数据的常规间隔,然后发送它,如果最终在你的设置上更容易。
答案 1 :(得分:1)
使用coroutines。在Update()函数中实现Web请求是一种糟糕的经历,因为Web请求需要一些时间来执行。