unity webGl发布连接数据库

unity号称多平台发布,但不同平台还是存在不少问题,以下解决网页WEBGL发布后数据库无法连接的方案。

数据库网页版无效

尝试一:直连数据库 x
尝试二:连webservice服务 java后台发布webservice unity中调用 x
尝试三:js获取Java数据 传输到unity 传参无法传对象 且数据库暴露前台不安全 x

尝试四:java后台获取数据通过json字符串传到jsp页面,jsp页面与unity交互 可以实现

实现思路过程

  1. 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>
  1. 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
    }
原创文章 53 获赞 33 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_35257875/article/details/102515623
今日推荐