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

扫一扫,访问微社区

开发者专栏

关注:1963

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

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

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

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

[复制链接]  [移动端链接]
排名
630
昨日变化

255

主题

1314

帖子

6259

积分

Rank: 16

UID
73452
好友
93
蛮牛币
3742
威望
0
注册时间
2015-2-6
在线时间
1862 小时
最后登录
2017-11-17

专栏作家蛮牛译员社区QQ达人活力之星七夕浪漫情人原创精华达人论坛发帖强人蛮牛哥认证开发者

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

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

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

x
本帖最后由 仅为年时 于 2017-7-12 16:09 编辑

unity发布webplayer与javaweb服务器的那些破事——a
http://www.manew.com/thread-102415-1-1.html
unity发布webplayer与javaweb服务器的那些破事——b
http://www.manew.com/thread-102695-1-1.html
unity发布webplayer与javaweb服务器的那些破事——c
http://www.manew.com/thread-105559-1-1.html


本篇讲解一个场景的保存与加载的方案。

由于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熟悉之中
945/1000
排名
2934
昨日变化
3

1

主题

100

帖子

945

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

7日久生情
2700/5000
排名
2228
昨日变化
1

0

主题

1721

帖子

2700

积分

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

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

回复

使用道具 举报

排名
39617
昨日变化
55

0

主题

52

帖子

83

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

2初来乍到
136/150
排名
16533
昨日变化
12

0

主题

83

帖子

136

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

2初来乍到
102/150
排名
53009
昨日变化
39

0

主题

70

帖子

102

积分

Rank: 2Rank: 2

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

回复

使用道具 举报

排名
8163
昨日变化
8

15

主题

50

帖子

1337

积分

Rank: 9Rank: 9Rank: 9

UID
7908
好友
12
蛮牛币
639
威望
0
注册时间
2013-11-13
在线时间
163 小时
最后登录
2017-11-14

专栏作家

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

回复 支持 反对

使用道具 举报

排名
4084
昨日变化
4

9

主题

115

帖子

625

积分

Rank: 9Rank: 9Rank: 9

UID
117397
好友
2
蛮牛币
1246
威望
0
注册时间
2015-8-10
在线时间
135 小时
最后登录
2017-11-14

专栏作家

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

回复 支持 反对

使用道具 举报

3偶尔光临
263/300
排名
9291
昨日变化
3

4

主题

99

帖子

263

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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