1. 程式人生 > >[Unity3d]Unity web平臺 SecurityException報錯解決辦法

[Unity3d]Unity web平臺 SecurityException報錯解決辦法

最近被一個問題困擾了好久,連續三天都一直在想辦法解決,各種能參考的資料都看了,包括硬著頭皮看全英文的官網,努力尋求解決辦法,昨晚搞到凌晨深夜兩點可還是失望的離開了辦公室,到底是什麼問題呢?我相信如果Unity3D做網路遊戲或者動態載入資源的同志們都會碰到,那就是Unity3d動態載入資源然後切換到web平臺會報錯,關於security的一個錯誤,官方的解釋是:http://docs.unity3d.com/Documentation/Manual/SecuritySandbox.html,努力看看英文吧,相信會有幫助!

目的:為了Unity3D能動態載入模型資源,切換到web平臺也能正常載入到場景中!

步驟:

一開始我做的方案一,就是Unity3D直接訪問遠端mysql資料庫,但後來發現切換到web平臺會報錯,而且解決起來比較麻煩,也不知道是否有人解決了沒,然後諮詢有過網遊開發經驗的大牛,他說一般公司開發都是會搭建一箇中間層伺服器,php或者.net或者其他,通過這個中間層伺服器來訪問資料庫並且返回打包的資料,因此就聽了大牛的建議然後果斷去搭建.net伺服器,這個我還比較熟悉一些,之前搞過一年多的.net,然後中間層伺服器搭建好了,url是http://192.168.1.6/plusFile/Test.aspx,Unity3D中通過www的方法獲取aspx返回的資料庫中模型的路徑,關於模型我是放在額外自己新建的一個ftp伺服器上,地址是http://114.92.247.6/xiaowei,上面有一個模型,當然我已經打包成unity3d格式的了,按理的話應該是動態載入fbx的的模型資源,但是這個還有待探索中,如果有知道的同志,還望指導我一下。關於.net伺服器的搭建就不多說了,當然也可以用php或者jsp。

Unity3D程式碼:

using UnityEngine;
using System.Collections;
using System.Text;

public class NewBehaviourScript : MonoBehaviour
{

    string s;
    private GameObject obj;
    private WWW www;
    private string url = @"http://192.168.1.6/plusFile/Test.aspx";
    private string url1 = "http://114.92.247.6/xiaowei/ok.unity3d";

    void Start()
    {

    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(20, 20, 100, 40), "載入"))
        {
            StartCoroutine(getURL(url));
            print("2");
        }
    }

    IEnumerator getURL(string url)
    {
        print("3");
        WWW web = new WWW(url);
        yield return web;
		
        Encoding e1 = new ASCIIEncoding();
        this.s = e1.GetString(web.bytes);
        print("web : " + this.s);
        print("--"+web.bytes.Length);
        
		//擷取伺服器端有用的資料
		print("s:length"+s.Length+"url1:length:"+url1.Length);
        //this.s = web.text;
		this.s = s.Substring(0,38);
		print(s.Length);
        StartCoroutine(getModel(s));
        print(url1+"|"+this.s);
        print(this.s.Length);
    }


    IEnumerator getModel(string str)
    {
        print(str.Length);
        this.www = new WWW(str);

        yield return this.www;
        print(www.bytes.Length);
        obj = GameObject.Instantiate(www.assetBundle.mainAsset) as GameObject;
        obj.transform.position = new Vector3(0, 1, 20);
        print(www.bytes.Length);
    }
}

看到這我就有點欣喜了,能夠動態載入模型了,但切換到web平臺就有問題了,不管怎樣就是報錯,有關一個Security許可權的錯誤,然後網上檢視各種資料,瞭解到Web Player平臺有一個Security SandBox的安全策略,這個可能是為了安全性考慮的吧,配置了一下使用者訪問資源的一個許可權。也就是要在伺服器端配置一個crossdomain.xml,大體內容是:
<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">  
<cross-domain-policy>
<allow-access-from domain="*" to-ports="*"/>
</cross-domain-policy>

第一個“*”是指許可權內的IP,*代表所有IP的客戶端都有這個許可權,第二個*號指伺服器放開所有的埠,主要是一個843埠,通過這個埠來監視客戶端的活動的。但之前我怎麼配置.net伺服器端都發現還是security許可權報錯,搞了我昨晚凌晨兩點才離開辦公室,後來發現我的模型資源放在遠端的FTP伺服器端,那個伺服器端也要配置相同的許可權,這樣一來就沒有錯誤了,恭喜一下自己,終於解決了困惑已久的問題!關於Unity3D,我們有個專門技術討論的大群,可以進行技術交流和諮詢,群號:375151422     858550 歡迎進行技術討論,裡面有不少大牛