开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1720

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 1000|回复: 8

[仅为年时] unity发布webplayer与javaweb服务器的那些破事——b

[复制链接]  [移动端链接]
8常驻蛮牛
5502/10000
排名
894
昨日变化
1

227

主题

1254

帖子

5502

积分

Rank: 8Rank: 8

UID
73452
好友
44
蛮牛币
2130
威望
0
注册时间
2015-2-6
在线时间
1581 小时
最后登录
2017-6-22

专栏作家蛮牛译员社区QQ达人活力之星蛮牛哥认证开发者

QQ
发表于 2017-4-12 11:50:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 仅为年时 于 2017-4-12 11:50 编辑

本篇讲解一个场景的保存与加载的方案。
由于web端不能够本地存储数据,所以只能回传到服务器,并且场景非常庞大,不适合整体保存,即使是只保存场景中创建的物体,对web端的负担也很大,因此想到的解决方案是保存创建的物体的对应信息,在下次加载的时候可以统一进行重新创建。当场景修改的对象比较多的时候就可以考虑对场景进行整体替换了。不一定是最好的解决办法,但也是一种思路,这里我是把信息作为json格式的字符串来存储的。
一、Unity部分
1、保存场景
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
//using UnityEditor;
using System.Collections.Generic;
using System.Xml;
using System.IO;
using System.Text;
using LitJson;

public class SaveScene : MonoBehaviour {

    public static StringBuilder sb = new StringBuilder();
    public static void ExportJSON()
    {
        JsonWriter writer = new JsonWriter(sb);
        writer.WriteObjectStart();
        writer.WritePropertyName("GameObjects");
        writer.WriteArrayStart();
        foreach (GameObject obj in Object.FindObjectsOfType(typeof(GameObject)))
        {
            if (obj.transform.parent == null && obj.name.Length > 7
                && obj.name.Substring(obj.name.Length - 7) == "(Clone)")
            {
                //print(obj.name);
                writer.WriteObjectStart();
                writer.WritePropertyName("name");
                writer.Write(obj.name);
                writer.WritePropertyName("asset");
                writer.Write(obj.name + ".prefab");
                writer.WritePropertyName("position");
                writer.WriteObjectStart();
                writer.WritePropertyName("x");
                writer.Write(obj.transform.position.x.ToString("F5"));
                writer.WritePropertyName("y");
                writer.Write(obj.transform.position.y.ToString("F5"));
                writer.WritePropertyName("z");
                writer.Write(obj.transform.position.z.ToString("F5"));
                writer.WriteObjectEnd();

                writer.WritePropertyName("rotation");
                writer.WriteObjectStart();
                writer.WritePropertyName("x");
                writer.Write(obj.transform.rotation.eulerAngles.x.ToString("F5"));
                writer.WritePropertyName("y");
                writer.Write(obj.transform.rotation.eulerAngles.y.ToString("F5"));
                writer.WritePropertyName("z");
                writer.Write(obj.transform.rotation.eulerAngles.z.ToString("F5"));
                writer.WriteObjectEnd();

                writer.WritePropertyName("scale");
                writer.WriteObjectStart();
                writer.WritePropertyName("x");
                writer.Write(obj.transform.localScale.x.ToString("F5"));
                writer.WritePropertyName("y");
                writer.Write(obj.transform.localScale.y.ToString("F5"));
                writer.WritePropertyName("z");
                writer.Write(obj.transform.localScale.z.ToString("F5"));
                writer.WriteObjectEnd();

                writer.WriteObjectEnd();
            }
        }

        writer.WriteArrayEnd();
        writer.WriteObjectEnd();

    }
}

该段代码的意思就是遍历场景中含有Clone后缀的预制体,然后保存其transform信息并保存为json格式的字符串(为了打印预览)。

当然,我们需要调用上面的代码,只要调用一个协成就好,如下:
[C#] 纯文本查看 复制代码
public void button_SaveScene()
    {
        SaveScene.ExportJSON();
        //print(SaveScene.sb.ToString());
        StartCoroutine(sendToS(SaveScene.sb.ToString()));
        
    }
    IEnumerator sendToS(string scenedata)
    {
        WWWForm form = new WWWForm();
        form.AddField("GameObjects", scenedata);
        //print(scenedata);
        Security.PrefetchSocketPolicy("http://192.168.1.63:8080/MyUnityToJSPTest/servlet/ByteFileContentServlet", 843);
        WWW w = new WWW("http://192.168.1.63:8080/MyUnityToJSPTest/servlet/ByteFileContentServlet", form);
        yield return w;
        //print(scenedata);
        //print(w.text);
    }


2、加载场景
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;
using System.Xml;
using System.IO;
//using UnityEditor;
using LitJson;
public class LoadScene : MonoBehaviour
{

    public static IEnumerator LoadSceneData()
    {
        WWW www = new WWW("http://192.168.1.63:8080/MyUnityToJSPTest/servlet/SceneSaveServlet");
        yield return www;
        string strLine = www.text;
        print(strLine);
        JsonData jd = JsonMapper.ToObject(strLine);
        JsonData gameObjectArray = jd["GameObjects"];
        int i;
        for (i = 0; i < gameObjectArray.Count; i++)
        {
            string PrefabName = (string)gameObjectArray["asset"];
            PrefabName = PrefabName.Substring(0, PrefabName.Length - 14);
            string asset = "Prefabs/" + PrefabName;
            Vector3 pos = Vector3.zero;
            Vector3 rot = Vector3.zero;
            Vector3 sca = Vector3.zero;

            JsonData position = gameObjectArray["position"];
            JsonData rotation = gameObjectArray["rotation"];
            JsonData scale = gameObjectArray["scale"];

            pos.x = float.Parse((string)position["x"]);
            pos.y = float.Parse((string)position["y"]);
            pos.z = float.Parse((string)position["z"]);

            rot.x = float.Parse((string)rotation["x"]);
            rot.y = float.Parse((string)rotation["y"]);
            rot.z = float.Parse((string)rotation["z"]);

            sca.x = float.Parse((string)scale["x"]);
            sca.y = float.Parse((string)scale["y"]);
            sca.z = float.Parse((string)scale["z"]);

            GameObject ob = (GameObject)Instantiate(Resources.Load(asset), pos, Quaternion.Euler(rot));
            ob.transform.localScale = sca;
            ob.name = Resources.Load(asset).name;
        }
    }
}



二、服务器部分
其实看了上面的代码相信大家不是懵逼就是觉得太简单了,都是什么鬼,服务器是什么样的?
抛开怎么搭建这个服务器来说(网上有很多,因为需要配置jdk、tomcat等,我就不多罗嗦了),就从一个只有get和post命令来看,只需要添加一个servlet服务就好。如下图:
QQ图片20170411171339.png
再贴一下代码:
[Java] 纯文本查看 复制代码
package com.SQ.Servlets;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SceneSaveServlet extends HttpServlet {

        public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                //定义JOSN字符串
                String SceneData="{'GameObjects':[{'name':'Capsule(Clone)','asset':'Capsule(Clone).prefab','position':{'x':'-0.91226','y':'0.05000','z':'-1.97406'},'rotation':{'x':'0.00000','y':'0.00000','z':'0.00000'},'scale':{'x':'0.50000','y':'0.50000','z':'0.50000'}},{'name':'Capsule(Clone)','asset':'Capsule(Clone).prefab','position':{'x':'-1.18522','y':'0.05000','z':'-1.15855'},'rotation':{'x':'0.00000','y':'0.00000','z':'0.00000'},'scale':{'x':'0.50000','y':'0.50000','z':'0.50000'}},{'name':'Orc Shoulders 1(Clone)','asset':'Orc Shoulders 1(Clone).prefab','position':{'x':'0.21437','y':'0.10000','z':'-1.34941'},'rotation':{'x':'0.00000','y':'0.00000','z':'0.00000'},'scale':{'x':'1.00000','y':'1.00000','z':'1.00000'}}]}";
                PrintWriter out = response.getWriter();
                out.write(SceneData);
                System.out.println("This is doGet()");
        }
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                doGet(request,response);  
                //向控制台输出文件内容长度
                System.out.println(request.getContentLength());
                System.out.println(request.getParameter("GameObjects"));
                System.out.println("This is doPost()");
                
                
        }

}


有这些还不行,还需要在jsp页中添加一个form用来获取或者发送数据用,如下
<form action="servlet/SceneSaveServlet" method="post">
</form>

这样就可以了,服务启动了之后,unity端可以保存场景中的数据,在服务器端控制台可以打印出来,也可以调用服务器端的json格式字符串数组信息,在场景中生成相应对象。但是,现在只限于在没有发布为webplayer的时候好用,具体原因下篇再说吧。对于不懂java web服务器的人来说,我只能说无能为力,因为我也不太懂。社区有位叫Aries_H的专栏作家有这部分文字,我有些参考,很详细,大家也可以参考。

PS:http://+IP:+端口号/+你的工程名字/
编辑器模式下测试的时候需要把这里的IP地址改为你的服务器地址,如下图:
1.png

评分

参与人数 2蛮牛币 +20 鲜花 +50 收起 理由
东方喵 + 20
朱迪 + 50

查看全部评分

[发帖际遇]: 仅为年时 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

5熟悉之中
880/1000
排名
2792
昨日变化
2

1

主题

95

帖子

880

积分

Rank: 5Rank: 5

UID
67841
好友
0
蛮牛币
651
威望
0
注册时间
2015-1-12
在线时间
410 小时
最后登录
2017-6-22
发表于 2017-4-13 10:14:32 | 显示全部楼层
可真有闲功夫,数据都不验证的吗

回复 支持 反对

使用道具 举报

7日久生情
1767/5000
排名
3259
昨日变化
13

0

主题

1218

帖子

1767

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
94526
好友
0
蛮牛币
1572
威望
0
注册时间
2015-4-22
在线时间
229 小时
最后登录
2017-6-22
发表于 2017-4-13 10:22:10 | 显示全部楼层
感谢楼主分享
[发帖际遇]: Lnoe 在网吧通宵,花了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

排名
35423
昨日变化
27

0

主题

51

帖子

79

积分

Rank: 2Rank: 2

UID
37119
好友
0
蛮牛币
31
威望
0
注册时间
2014-7-30
在线时间
25 小时
最后登录
2017-6-20
发表于 2017-4-27 23:02:30 | 显示全部楼层
我去年的一个项目,用实体转XML再加密上传。比这个简单。

回复 支持 反对

使用道具 举报

2初来乍到
136/150
排名
15007
昨日变化
16

0

主题

83

帖子

136

积分

Rank: 2Rank: 2

UID
109592
好友
0
蛮牛币
20
威望
0
注册时间
2015-6-21
在线时间
25 小时
最后登录
2017-6-15
发表于 2017-4-29 18:11:28 | 显示全部楼层
赞,学习了,谢谢分享

回复 支持 反对

使用道具 举报

排名
47349
昨日变化
25

0

主题

30

帖子

52

积分

Rank: 2Rank: 2

UID
35028
好友
0
蛮牛币
4
威望
0
注册时间
2014-7-18
在线时间
20 小时
最后登录
2017-6-21
发表于 2017-5-3 09:15:50 | 显示全部楼层
感觉还不错呀。

回复

使用道具 举报

排名
7465
昨日变化
4

15

主题

50

帖子

1320

积分

Rank: 9Rank: 9Rank: 9

UID
7908
好友
12
蛮牛币
597
威望
0
注册时间
2013-11-13
在线时间
153 小时
最后登录
2017-5-10

专栏作家

发表于 2017-5-10 17:55:54 | 显示全部楼层
安静的放弃webplayer吧

回复 支持 反对

使用道具 举报

排名
5624
昨日变化
5

7

主题

47

帖子

386

积分

Rank: 9Rank: 9Rank: 9

UID
117397
好友
1
蛮牛币
654
威望
0
注册时间
2015-8-10
在线时间
78 小时
最后登录
2017-6-19

专栏作家

发表于 2017-6-11 21:00:11 | 显示全部楼层
顶你,写的很可以了,那些人在那说什么闲话,感觉自己很厉害的,怎么没看你出来总结呢。

回复 支持 反对

使用道具 举报

3偶尔光临
183/300
排名
11335
昨日变化
8

2

主题

84

帖子

183

积分

Rank: 3Rank: 3Rank: 3

UID
151744
好友
0
蛮牛币
234
威望
0
注册时间
2016-6-13
在线时间
47 小时
最后登录
2017-6-22
发表于 2017-6-13 11:54:39 | 显示全部楼层
楼主提供的思路我觉得很好 Web端场景物体应该是要保存好每个配置文件 用的时候解析得到我们需要加载的数据

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表