|
那个例子有个问题就是,如果你传过来的数据带中文,到了u3d里,执行到
var jsonObj1=eval(getwww.data);
这一步的时候就会出错。原因是unity3d不支持\u转义,而json_encode函数在encode的时候就直接把中文变成了\u1234这种形式。
其实很好解决,echo之前先把转义的字符串变成中文就行了。unity3d不是浏览器,应该调用WWW的时候直接读的二进制数据,所以不会出错。
附图里面的“测试”两个字就是json直接传的。
js_unescape这个函数是我抄来的……简单改了改
php代码:
[mw_shl_code=php,true]<?php
$arr=array(
'username' => '测试',
'password' => 'bar'
);
echo js_unescape(json_encode($arr));
function js_unescape($str)
{
$ret = '';
$len = strlen($str);
for ($i = 0; $i < $len; $i++)
{
if ($str[$i] == '\\' && $str[$i+1] == 'u')
{
$val = hexdec(substr($str, $i+2, 4));
if ($val < 0x7f) $ret .= chr($val);
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));
$i += 5;
}
else $ret .= $str[$i];
}
return $ret;
}
?>[/mw_shl_code]u3d js代码:
[mw_shl_code=javascript,true]var jsonURL="http://localhost/json/demo.php";
var show;
var chineseSkin : GUISkin;
function Start(){
//获取json数据的方法
var getwww : WWW = new WWW (jsonURL);
yield getwww;
print (getwww.data);
var jsonObj1=eval(getwww.data);
print (jsonObj1["username"]);
show=jsonObj1["username"];
}
function OnGUI(){
GUI.skin=chineseSkin;
GUI.Button(Rect(10,10,100,20),show);
}[/mw_shl_code]需要字体才能显示出中文。另外注意.php文件的编码要设置成utf-8,u3d的js文件编码最好也设置成utf8。
=====
另外,上面链接的那个使用json的方法,对于树形结构同样有效:
比如改成[mw_shl_code=php,true]$arr=array(
'username' => '你好',
'password' => 'bar',
'a' => array(
"name" => "aaa",
"pass" => "bbb"
)
);[/mw_shl_code][mw_shl_code=csharp,true]print (jsonObj1["a"]["name"]);[/mw_shl_code]例如数据库查询结果,3条记录,每条记录里面包含姓名,性别,年龄。这个json也能取得后返回u3d吗?
是完全可以的,忘了xml吧。不过从u3d传到web上目前我那个代码没实现json树形结构,只能传递1层的,改改应该也可以实现。
|
|