unity3d本身可以读取excel文件,引入一个dll就可以了。但是当打包发布成webgl格式的时候,首先File就不能用了,所以必须借助JS来读取Excel,然后将读取的结果发送给unity3d。
html代码:
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Unity WebGL Player | GuoLu</title>
<link rel="shortcut icon" href="TemplateData/favicon.ico">
<link rel="stylesheet" href="TemplateData/style.css">
<script src="TemplateData/UnityProgress.js"></script>
<script src="Build/UnityLoader.js"></script>
<script src="./js/xlsx.full.min.js"></script>
<script>
var gameInstance = UnityLoader.instantiate("gameContainer", "Build/guolu.json", {onProgress: UnityProgress});
function aa()
{
document.getElementById("File").click();
}
function bb(e)
{
alert(e);
}
/*
FileReader共有4种读取方法:
1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。
2.readAsBinaryString(file):将文件读取为二进制字符串
3.readAsDataURL(file):将文件读取为Data URL
4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'
*/
var wb;//读取完成的数据
var rABS = false; //是否将文件读取为二进制字符串
function importf(obj) {//导入
if(!obj.files) {
return;
}
//alert(obj.files[0].name);
var f = obj.files[0];
var reader = new FileReader();
reader.readAsBinaryString(f);
reader.onload = function(e) {
var data = e.target.result;
wb = XLSX.read(data, {
type: 'binary'
});
//wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
//wb.Sheets[Sheet名]获取第一个Sheet的数据
document.getElementById("demo").innerHTML= JSON.stringify( XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]) );
};
/*if(rABS) {
reader.readAsArrayBuffer(f);
} else {
reader.readAsBinaryString(f);
}*/
//reader.readAsText(f);
}
function fixdata(data) { //文件流转BinaryString
var o = "",
l = 0,
w = 10240;
for(; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
return o;
}
</script>
</head>
<body>
<div class="webgl-content">
<div id="gameContainer" style="width: 1280px; height: 720px"></div>
<div class="footer">
<div class="webgl-logo"></div>
<div class="fullscreen" onclick="gameInstance.SetFullscreen(1)"></div>
<div class="title">GuoLu</div>
</div>
</div>
<div id="demo"></div>
<input type="file" id="File" style="display:none" onchange="importf(this)">
</body>
</html>
JS使用xlsx.full.min.js 将本地的excel文件解析出来,然后保存为json格式,发送给unity3d。unity读取json,注意unity自带的JsonUtility.FromJson读取json的方法有很多限制,有坑,需要本地创建两个类来读取。而且json的格式也必须是这样:
{
"inforList":
[
{
"name": "yy",
"age": "100"
},
{
"name": "zz",
"age": "100"
}
]
}
unity3d代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class JsonData
{
public string name;
public string age;
}
[System.Serializable]
public class Test
{
public List<JsonData> inforList;
}
public class JsonTest : MonoBehaviour {
// Use this for initialization
void Start () {
TextAsset ta = Resources.Load<TextAsset>("MyTestJson");
Debug.Log(ta.text);
Test list = JsonUtility.FromJson<Test>(ta.text);
foreach (var item in list.inforList)
{
Debug.Log(item.name);
}
}
}