WebGL--------------持久化存储

出于安全原因,unity里很多功在WebGL是不可用的,比如System.Net.Sokcet,XML,外部设备的某些权限等等,本文的做法是WebGL调用javaScript,JS将数据存到Cookie里。

什么是Cookie?  Cookie是网页的缓存,是网页用来存储数据的一种方式,比如清理电脑垃圾时“清理网页缓存”的选项就是清理Cookie,在登陆网页上的帐号时“保存密码”选项就是将密码存到Cookie里了。 Cookie本质上类似键值对,比键值对多了一个“时间”,来表示这个键值对可以保存多长时间,cookie还可以附带其他信息,如域名,路径等,关于cookie的详细内容可以写一本书了,本文不再赘述。

C#和JavaScript都是由C语言发展而来的,所以不用担心JavaScript不会用,此处只写两个JavaScript方法。

存储思路是:WebGL调用JavaScript接口   -- javaScript将WebGL传来的参数存入Cookie 。

获取数据时:WebGL 调用JS接口  --  JS检查Cookie   -- JavaScript将数据传到WebGL中

1.WebGL和JavaScript如何互相调用?

WebGL导出的HTML文件打开后是这样的

用过XML的朋友对这个格式应该不陌生,这就是一个HTML文件,将JavaScript函数写在Head里,在WebGL里就可以调用了,如下图我写了一个 方法 A。

声明方法A后,在Unity里就可以调用了,C#脚本里写:

Application.ExternalCall("A");  

就可以在WebGL里调用JS里的方法A了。

下面说JS掉WebGL。

上文说的方法A里写:

                function A() {

                            gameInstance.SendMessage("Test", "ReciveCookieMsg", "你好,JS里面传来信息了");
                }

gameInstance.SendMessage是JS向WebGL发消息的方法。在WebGL的游戏场景里找到“Test”这个游戏对象,Test对象挂载一个名为Test的同名脚本,调用RexiveCookieMsg方法,“你好,JS里面传来信息”是参数。

然后WebGL里有Test对象的Test脚本里声明如下方法。

    public void ReciveCookieMsg(string str) {
          DeBug.Log(str);
    }

此时,在Unity里调用Application.ExternalCall("A");  方法时,就会调用JS的A方法,然后A方法里调用unity的ReciveCookieMsg方法,并打印  “你好,JS里面传来信息” 。

以上就是JS与WebGL相互调用。

持久化存储,只需在WebGL里调用JS的存储Cookie方法,就可以了。

2.存储和提取

在Unity导出的WebGL 的HTML文件里声明如下方法(此处我是先写下来然后在复制进去的)

      <script>
                function setCookie(cname, cvalue, exdays) {   //exdays表示天数
                    var d = new Date();
                    d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
                    var expires = "expires=" + d.toGMTString();
                    //alert("thisPrice " + cvalue);
                    document.cookie = cname + "=" + cvalue + "; " + expires;
                }
                function getCookie(cname) {
                    var returnArg;    //传出去的参数
                    var name = cname + "=";
                    var ca = document.cookie.split(';');
                    for (var i = 0; i < ca.length; i++) {
                        var c = ca[i].trim();
                        if (c.indexOf(name) == 0) {
                            returnArg = c.substring(name.length, c.length);
                            //alert("lastMassage: " + returnArg);
                            gameInstance.SendMessage("Test", "ReciveCookieMsg", returnArg);

                            return; // returnArg;
                        }
                    }
                    return "";
                }

      </script>

上面是一个存储方法和提取方法,setCookie方法传入一个键值对和时间,

getCookie方法传入一个键,根据键来搜索值。找到值后,调用WebGL方法,将值传过去。

在Unity项目里创建一个Test对象,并挂载一个Test脚本,如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class Test:MonoBehaviour {
    public float speed=0.2f;
    public GameObject testCube;
    //测试脚本,测试unity与web互调及cookie
    TestNoFather TNF;
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            Application.ExternalCall("setCookie", "PosX", testCube.transform.position.x);
        }
        if (Input.GetKeyDown(KeyCode.O))
        {
            Application.ExternalCall("getCookie", "PosX");
        }
        if (Input.GetKey(KeyCode.A))
        {
            testCube.transform.Translate(Vector3.left*Time.deltaTime*speed);
        }
        if (Input.GetKey(KeyCode.D))
        {
            testCube.transform.Translate(Vector3.right * Time.deltaTime * speed);
        }

        
    }

    private void Start()
    {
        //TNF = new TestNoFather(testCube);
    }

    //接受方法
    public void ReciveCookieMsg(string str) {

        float x = Convert.ToSingle(str);
        float y = testCube.transform.position.y;
        float z = testCube.transform.position.z;
        testCube.transform.position = new Vector3(x, y, z);
    }
}

Test脚本中的testCube设置为一个Cube。

然后将WebGL导出,导出的HTML里复制上上面的JS方法。

效果如下:

保存后,上传到服务器,局域网也可以哦,但是本地是无法正常使用Cookie的,因为本地没有域名。用火狐浏览器打开网页,按A D键可以控制方块移动,按 O键可以保存(覆盖)方块的位置,按 P键可以读取上次保存的小方块位置,关闭页面后重新打开,按P键可以读取上次保存的方块位置。

猜你喜欢

转载自blog.csdn.net/Roadlun/article/details/84578617