unity号称多平台发布,但不同平台还是存在不少问题,以下解决网页WEBGL发布后数据库无法连接的方案。
数据库网页版无效
尝试一:直连数据库 x
尝试二:连webservice服务 java后台发布webservice unity中调用 x
尝试三:js获取Java数据 传输到unity 传参无法传对象 且数据库暴露前台不安全 x
尝试四:java后台获取数据通过json字符串传到jsp页面,jsp页面与unity交互 可以实现
实现思路过程
- java后台建立Servlet链接数据库,获取unity所需展示数据。
持久类save
package com.bugong;
public class Save {
private double x;
private double y;
private double z;
private double l;
private double m;
private double n;
private double w;
private String cubeName;
public Save(){};
public Save(double x, double y, double z, double l, double m, double n, double w, String cubeName) {
this.x = x;
this.y = y;
this.z = z;
this.l = l;
this.m = m;
this.n = n;
this.w = w;
this.cubeName = cubeName;
}
public double getX() {
return x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return y;
}
public void setY(double y) {
this.y = y;
}
public double getZ() {
return z;
}
public void setZ(double z) {
this.z = z;
}
public double getL() {
return l;
}
public void setL(double l) {
this.l = l;
}
public double getM() {
return m;
}
public void setM(double m) {
this.m = m;
}
public double getN() {
return n;
}
public void setN(double n) {
this.n = n;
}
public double getW() {
return w;
}
public void setW(double w) {
this.w = w;
}
public String getCubeName() {
return cubeName;
}
public void setCubeName(String cubeName) {
this.cubeName = cubeName;
}
}
数据库操作类
package com.bugong;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class CURDSqlserver {
Connection conn = null ;
Statement stmt = null ;
ResultSet rs = null ;
public void Conn()
{
String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";
String dbURL="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test";
String userName="sa";
String userPwd="Oraps123";
try
{
Class.forName(driverName);
System.out.println("加载驱动成功!");
}catch(Exception e){
e.printStackTrace();
System.out.println("加载驱动失败!");
}
try{
conn=DriverManager.getConnection(dbURL,userName,userPwd);
System.out.println("连接数据库成功!");
}catch(Exception e)
{
e.printStackTrace();
System.out.print("SQL Server连接失败!");
}
}
public void ConnClose()
{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public List<Save> selectAll(){
List<Save> listSave = new ArrayList<Save>();
//定义查询语句
String sql = "select * from cubeInfo";
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()){
Save save = new Save();
save.setCubeName(rs.getString(3)) ;
save.setX(rs.getDouble(4));
save.setY(rs.getDouble(5));
save.setZ(rs.getDouble(6));
save.setL(rs.getDouble(7));
save.setM(rs.getDouble(8));
save.setN(rs.getDouble(9));
save.setW(rs.getDouble(10));
listSave.add(save);
}
} catch (SQLException e) {
e.printStackTrace();
}
return listSave;
}
public void Insert(Save save){
String sql_insert = "insert into cubeInfo(cubeName,position_x,position_y,position_z,rotation_x,rotation_y,rotation_z,rotation_w) values(?,?,?,?,?,?,?,?)";
try {
PreparedStatement ptmt = conn.prepareStatement(sql_insert);
ptmt.setString(1,save.getCubeName());
ptmt.setDouble(2,save.getX());
ptmt.setDouble(3,save.getY());
ptmt.setDouble(4,save.getZ());
ptmt.setDouble(5,save.getL());
ptmt.setDouble(6,save.getM());
ptmt.setDouble(7,save.getN());
ptmt.setDouble(8,save.getW());
ptmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void DeleteAll(){
String sql_delete ="DELETE FROM cubeInfo";
try {
PreparedStatement ptmt = conn.prepareStatement(sql_delete);
ptmt.execute();
} catch (SQLException e) {
e.printStackTrace();
}
}
public Save selectByName(String cubeName){
String sql_selectByName = "select * from cubeInfo where cubeName = ?";
Save save = new Save();
try {
PreparedStatement ptmt = conn.prepareStatement(sql_selectByName);
ptmt.setString(1,cubeName);
rs = ptmt.executeQuery();
while(rs.next()){
save.setCubeName(rs.getString(3)) ;
save.setX(rs.getDouble(4));
save.setY(rs.getDouble(5));
save.setZ(rs.getDouble(6));
save.setL(rs.getDouble(7));
save.setM(rs.getDouble(8));
save.setN(rs.getDouble(9));
save.setW(rs.getDouble(10));
}
} catch (SQLException e) {
e.printStackTrace();
}
return save ;
}
}
以下功能分别为查询所有,id查询,插入操作
package com.bugong;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
public class testServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("selectALL in");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
CURDSqlserver sql = new CURDSqlserver();
sql.Conn();
List<Save> listSave = sql.selectAll();
sql.ConnClose();
System.out.println(listSave.size());
JSONArray j = JSONArray.fromObject(listSave);
System.out.println(j.toString());
out.println(j.toString());
// for(int i = 0;i<j.size();i++){
// JSONObject jsonObject = j.getJSONObject(i);
// Save save = (Save) JSONObject.toBean(jsonObject,Save.class);
// System.out.println("wtf!"+save.getCubeName());
// }
// request.setAttribute("jsonString",j.toString());
// request.getRequestDispatcher("/test02.jsp").forward(request, response);
out.flush();
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
package com.bugong;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
public class selectByOneServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("selectbyone in");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String str = request.getParameter("str02");
System.out.println(str);
CURDSqlserver sql = new CURDSqlserver();
sql.Conn();
List<Save> listSave = sql.selectAll();
Save save = sql.selectByName(str);
// request.setAttribute("Save",save);
// request.setAttribute("listSave",listSave);
// request.getRequestDispatcher("/test02.jsp").forward(request, response);
String result = save.getCubeName();
JSONObject json = JSONObject.fromObject(save);//将java对象转换为json对象
String strr = json.toString();//将json对象转换为字符串
out.println(strr);
sql.ConnClose();
out.flush();
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
package com.bugong;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
public class InsertServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("xxxxxxxx");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String str = request.getParameter("str");
System.out.println(str);
CURDSqlserver sql = new CURDSqlserver();
sql.Conn();
sql.DeleteAll();
JSONArray j = JSONArray.fromObject(str);
for(int i = 0;i<j.size();i++){
JSONObject jsonObject = j.getJSONObject(i);
Save save = (Save) JSONObject.toBean(jsonObject,Save.class);
//System.out.println("wtf!"+save.getCubeName());
sql.Insert(save);
};
out.println("save success");
sql.ConnClose();
//request.getRequestDispatcher("/test.html").forward(request, response);
out.flush();
out.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
2.jsp获取数据,与unity交互。jsp页面在unity发布页面的基础上做的修改。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page contentType="text/html;charset=utf-8"%>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Unity WebGL Player | 3Dstorehouse</title>
<script src="Build/UnityLoader.js"></script>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
var gameInstance = UnityLoader.instantiate("gameContainer", "Build/unity3D_3Dhouse.json");
function swj(arg){
document.getElementById('str').value=arg;
saveSence();
}
function swj02(arg){
document.getElementById('str02').value=arg;
selectByOne();
}
</script>
<script type="text/javascript">
$(document).ready(function(){
});
// 直接在前台页面显示,datatype为json
function selectByOne(){
$.ajax({
type: "POST", //传数据的方式
url: "http://192.168.20.66:8080/demo03", //servlet地址
data: $('#selectByOneForm').serialize(), //传的数据 form表单 里面的数据
dataType: "json",
success: function(result){ //传数据成功之后的操作 result是servlet传过来的数据 这个函数对result进行处理,让它显示在 输入框中
$("#results").val(result.cubeName); //找到输入框 并且将result的值 传进去
$("#results2").val(result.x);
$("#results3").val(result.y);
$("#results4").val(result.z);
$("#results5").val(result.l);
$("#results6").val(result.m);
$("#results7").val(result.n);
$("#results8").val(result.w);
}
});
}
//暂未实现unity中弹窗,web发布后gui失效了
// function selectByOne(){
// $.ajax({
// type: "POST", //传数据的方式
// url: "http://192.168.20.66:8080/demo03", //servlet地址
// data: $('#selectByOneForm').serialize(), //传的数据 form表单 里面的数据
// success: function(result){ //传数据成功之后的操作 result是servlet传过来的数据 这个函数对result进行处理,让它显示在 输入框中
// alert("result:"+result)
// gameInstance.SendMessage("GameObject", "returnByOne",result );
// }
// });
// }
function saveSence(){
$.ajax({
type: "POST", //传数据的方式
url: "http://192.168.20.66:8080/demo02", //servlet地址
data: $('#saveSenceForm').serialize(), //传的数据 form表单 里面的数据
success: function(result){ //传数据成功之后的操作 result是servlet传过来的数据 这个函数对result进行处理,让它显示在 输入框中
alert(result)
}
});
}
var i = 0 ;
function selectAll(){
if (i == 0){
$.ajax({
type: "POST", //传数据的方式
url: "http://192.168.20.66:8080/demo", //servlet地址
data: $('#saveSenceForm').serialize(), //传的数据 form表单 里面的数据
success: function(result){ //传数据成功之后的操作 result是servlet传过来的数据 这个函数对result进行处理,让它显示在 输入框中
gameInstance.SendMessage("GameObject", "LoadBySqlJsp",result );
}
});
i++;
}else{
alert("页面刷新后重新读取");
location.reload();
}
}
</script>
</head>
<body>
<div>
</div>
<form id="saveSenceForm">
<input type="hidden" name="str" id="str" /><br/>
</form>
<form id="selectByOneForm">
<input type="hidden" name="str02" id="str02" /><br/>
</form>
<form id="selectAll">
<button type="button" onclick="selectAll()">读取存档</button>
</form>
<tr>
cubeName<input type="text" id="results">
</tr>
<tr>
x坐标<input type="text" id="results2">
</tr>
<tr>
y坐标<input type="text" id="results3">
</tr>
<tr>
z坐标<input type="text" id="results4">
</tr>
<tr>
旋转角度x<input type="text" id="results5">
</tr>
<tr>
旋转角度y<input type="text" id="results6">
</tr>
<tr>
旋转角度w<input type="text" id="results8">
</tr>
<div id="gameContainer" style="width: 1960px; height: 800px; margin: auto"></div>
</body>
</html>
- jsp与unity交互
参考前面博文,获取数据后处理一下就行,例以下为我获取数据库的坐标信息表,重新在unity中加载对象。
if (listSave != null || listSave != "[]")
{
//读取存档前 删除目前正在运行的cube
targetGOs = GameObject.FindGameObjectsWithTag("test");
foreach (GameObject targetGO in targetGOs)
{
Destroy(targetGO);
}
//testtext.text = listSave;
List<Save> list = JsonMapper.ToObject<List<Save>>(listSave);
for (int i = 0; i < list.Count; i++)
{
Save sa = list[i];
string name = sa.cubeName;
float a = Convert.ToSingle(sa.x);
float b = Convert.ToSingle(sa.y);
float c = Convert.ToSingle(sa.z);
float d = Convert.ToSingle(sa.l);
float e = Convert.ToSingle(sa.m);
float f = Convert.ToSingle(sa.n);
float w = Convert.ToSingle(sa.w);
Vector3 v = new Vector3(a, b, c);
Quaternion bodyAppearRotation = new Quaternion(d, e, f, w);
boxBody = Instantiate(boxBody, v, bodyAppearRotation);
GameObject newCube = GameObject.Find("newCube");
boxBody.transform.parent = newCube.transform;
boxBody.name = name;
}
//对数据库插入
private void SaveBySqlJsp()
{
StringBuilder str = new StringBuilder();
List<SaveString> listSave = new List<SaveString>();
targetGOs = GameObject.FindGameObjectsWithTag("test");
foreach (GameObject targetGO in targetGOs)
{
SaveString save = new SaveString();
Transform tra = targetGO.transform;
save.x = tra.position.x.ToString();
save.y = tra.position.y.ToString();
save.z = tra.position.z.ToString();
save.l = tra.rotation.x.ToString();
save.m = tra.rotation.y.ToString();
save.n = tra.rotation.z.ToString();
save.w = tra.rotation.w.ToString();
save.cubeName = tra.name;
listSave.Add(save);
//str.Append("{");
//str.Append("cubeName");
//插入到数据库
// sql.Insert(save);
}
string abc = JsonMapper.ToJson(listSave);
Application.ExternalCall("swj", abc); //webgl 2018
}