您的位置:首页 > 其它

三维数据管理&浏览BS系统项目总结

2013-04-16 14:15 387 查看
一.unity场景构架

1. js脚本中不能加#pragma strict(去掉),否则会限制 js脚本函数调用C#中的函数

****************************************************************

2.C#主函数:

public class modelload : MonoBehaviour

{

GameObject gameobject=null; //全局的场景主Object

GameObject asset =null; //主assert

public delegate void DownFinishDelegate (WWW wwwObj,object customParam,string url,string prefabName); //设置委托以便于,异步下载完成后通知主线程来引发完成一些事情

public class WWWRequest

{

public string prefabName="";

public string requestURl;

public DownFinishDelegate calbackFun;

public WWW wwwObject = null;

public bool bHasDeal = false; //开关键,第一次缓存玩(www第一次下载完毕)对其进行设置

public List<object> customParams = new List<object>(); //参数列表在回调之前可以无限添加

public WWWRequest(){}

public WWWRequest (string url, DownFinishDelegate cbFun,string prefabName,object customParam=null)

{

requestURl = url;

calbackFun = new DownFinishDelegate (cbFun);

//wwwObject = new WWW (url);

customParams.Add(customParam);

this.prefabName=prefabName;

}

//下载线程函数新,使用磁盘缓存

public IEnumerator<WWW> loading (string modelurl,int id)

{

//Resources.UnloadUnusedAssets ();

//token=true;

//data = new WWW ("file://" + Application.dataPath + "/ui.unity");

wwwObject =
WWW.LoadFromCacheOrDownload(modelurl,id); //该方法不同与new www()方式,LoadFromCacheOrDownload-->首先判读缓存中是否有,而且与url地址无关,只是与下载.unity3d文件名和版本号Id有关,如果名称和版本号一致,则直接从缓存中读取,所以可以通过参数Id来进行版本更新(id是由sql中模型的创建修改时间列来生成的)

wwwObject.threadPriority = ThreadPriority.High; //该函数将下载的权限设置为unity所有线程中最高的(高于逻辑,渲染等线程)

//wwwObject = new WWW(modelurl);

//data = new WWW("http://127.0.0.1:99/uiA.unity3d");

//data = new WWW("http://127.0.0.1:99/uiA.unity3d");

//data=new WWW(@"http://small6.itiexue.net/1587/15872190.jpg");

yield return wwwObject;

if (wwwObject.error!= null)

{

Debug.Log(wwwObject.error);

yield return null; //如果下载报错,返回空

}

}

}

//WWW Request List

private Dictionary<string, WWWRequest> m_WWWMap = new Dictionary<string, WWWRequest> ();

public void AddDownRequest (string url,string prefabName,string id,object customParam=null, DownFinishDelegate callBackFun=null)

{

callBackFun=new DownFinishDelegate(LoadNewModel); //创建新回调函数

if (Caching.IsVersionCached(url,int.Parse(id))) //判断www缓存中是否有该已经有相同版本的下载

{

Debug.Log("exist!");

}

if(url != "")

{

//增加新的资源下载需求

if (!m_WWWMap.ContainsKey (url))

{

WWWRequest www=new WWWRequest (url, callBackFun,prefabName,customParam);

StartCoroutine (www.loading(url,int.Parse(id)));

m_WWWMap.Add (url,www ); //根据url将www放入list中进行管理

}

else

{

//已经提交相同请求,但是没有下载完成

if(!m_WWWMap
for(int i=0;i<wwwReq.calbackFun.GetInvocationList().GetLength(0);i++) //逐个触发该wwwReq中的回调函数

{

((DownFinishDelegate)wwwReq.calbackFun.GetInvocationList()[i]).Invoke(wwwReq.wwwObject,wwwReq.customParams[i],wwwReq.requestURl,wwwReq.prefabName);

}

wwwReq.bHasDeal = true; //开关值设置为true

}

}

}

public void DownFinishFun(WWW wwwParam,object customParam)

{

//wwwObj = wwwParam;

}

Dictionary<string,AssetBundle> assetBundle=new Dictionary<string, AssetBundle>();

//回调函数

public void LoadNewModel(WWW wwwParam,object customParam,string url,string prefabName)

{

AssetBundle bundle=null;

if(assetBundle.ContainsKey(url))

{

bundle=assetBundle[url]; }

else

{

if (wwwParam!= null && wwwParam.isDone&& wwwParam.error== null)

{

bundle=wwwParam.assetBundle;

assetBundle[url]=bundle; //assert list中不包含该bundle,则新添加一个

}

else

{

return; //如果www下载错误,或者没完成,则LoadNewModel返回空(很重要)

}

}

//开始模式定位和操作

try

{

if(asset!=null)

{

asset=null;

if(gameobject!=null)

{

Destroy(gameobject); //先销毁instance的gameobject

gameobject=null; // 主场景值保持一个主物体,在新物体加载之前将gameobject销毁,并且设置为null

}

Resources.UnloadUnusedAssets(); //清空源assert之前,要将对该assert的引用设置为0,

}

}

catch(Exception ex)

{

Debug.Log("cleanning is wrong!");

}

asset = bundle.Load (prefabName) as GameObject;

gameobject = Instantiate (asset) as GameObject;// 生成新的实例

gameobject.transform.localPosition = new Vector3 (0, 0, 3); //将新实例定位在Vector3 (0, 0, 3)

}

}

****************************************************************

二.unity场景生成注意事项(模拟服务器存放)

1.将unity场景的存放目录IIS设置为 192.168.1.10:10000

2.将crossdomain.xml(跨域访问文件)和其他unity3d文件放在一起--->这样可以让WebPlayer访问不在同一域的资源



****************************************************************

三. web服务端和前端的开发

1. u.initPlugin(jQuery("#unityPlayer")[0], "webtest5.unity3d"); //show.aspx中,是指定webplay加载的场景

2.sql数据源和asp控件绑定的方式是采用前置asp,如下(且img的dom不具有value属性,所以img的属性是使用alt传递出去的;onclick="showModel(this.alt)" 是点击事件):

<ul class="ad-thumb-list">

<% foreach (DataBind.Models.UnityModel m in modelList)

{ %>

<li>

<a href="images/8.jpg">

<img src="<%=m.modelThumbnail%>" title="A title for 8.jpg" alt="<%=m.modelId%>" class="image12" value="<%=m.modelId%>" onclick="showModel(this.alt)" >

</a>

</li>

<% } %>

</ul>

3. 另外在三层架构中,如果不是在同一个项目中,一个项目引用其他项目时,是调用其他项目生成的dll(只有在同一项目中才可直接引用);所以其他项目修改后,要及时重构dll,

5.

a.不要在异常中嵌套异常,而是要从底层向上层调用处抛出throw,在BLL和UI层中处理

b. 多用验证,能将异常用常规方法处理的就不要用异常来处理

c. sql中的datetime和c#中的datetime是可以兼容的。

6.在后台中只容许验证的session用户访问show.aspx,否则不能直接访问show.aspx,另外session要加入失效时间(例如:半个钟头)

7. handler.ashx中要是用 context.Response.ContentType =
"text/plain"方式, 让响应回传的是text,不能为html-->这样回传的才是字段

********************************************************

8. Ajax技术,对提交的页面元素事件进行处理,源码如下:

var xmlHttp;

function showCustomer(str) { //页面元素调用主函数

xmlHttp = GetXmlHttpObject();

//xmlHttp = new XMLHttpRequest();

if (xmlHttp == null) {

alert("您的浏览器不支持AJAX!");

return;

}

var url = "Handler.ashx";

url = url + "?q=" + str;

url = url + "&sid=" + Math.random();

//var url_send = "?q=" + str + "&sid=" + Math.random();

//xmlHttp.open("POST", url, true);

xmlHttp.open("GET", url, true); //如果处理的是ashx,且为text方式,就只能用open(不能用post方式)

//xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xmlHttp.onreadystatechange = stateChanged;

xmlHttp.send(null); //和xmlHttp.open("GET", url, true)配套使用

//xmlHttp.send("id=1001&name=holyknihgt");

}

function stateChanged() { //回传的处理函数

if (xmlHttp.readyState == 4&&xmlHttp.status==200) {

//var s = xmlHttp.responseText;

//alert(s);

var modelname = xmlHttp.responseText;

//alert(modelname);

if (modelname == "notexist") {

return;

}

else {

loadmodel(modelname);

}

}

}

function GetXmlHttpObject() {

var xmlHttp = null;

try {

// Firefox, Opera 8.0+, Safari

xmlHttp = new XMLHttpRequest();

}

catch (e) {

// Internet Explorer

try {

xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

}

catch (e) {

xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

}

}

return xmlHttp;

}

function showModel(str) {

xmlHttp = GetXmlHttpObject();

//xmlHttp = new XMLHttpRequest();

if (xmlHttp == null) {

alert("您的浏览器不支持AJAX!");

return;

}

var url = "Handler.ashx";

url = url + "?q=" + str;

url = url + "&sid=" + Math.random();

//var url_send = "?q=" + str + "&sid=" + Math.random();

//xmlHttp.open("POST", url, true);

xmlHttp.open("GET", url, true);

//xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xmlHttp.onreadystatechange = stateChanged;

xmlHttp.send(null);

//xmlHttp.send("id=1001&name=holyknihgt");

}

20.

a.Unity3D 调用动态链接库dll文件
http://hi.baidu.com/thejavafan/item/1b24b7b86732e6a1eaba93d9
b.unity3d引用数据库dll文件,输出web格式时报错?怎么解决?或者其他方式连接数据库(oracle)?

无法解决,web的因为网页的安全沙盒机制,无法导入dll。

连接数据库可以用www类,通过webservice操作数据库

c.

在Windows环境下开发Unity3d游戏或应用,可以利用dll文件将一个大工程分为几个小的工程。这里较为推荐3dsMax+Unity3d+Windows7+Virsual Studio 2010+ReSharper这样的组合进行整个WinPC/Web项目的开发和维护。

在VS2010中可以导入一个ClassLib Project,编译生成dll文件。然后在Unity3d项目中添加对该dll文件的引用,并且将该dll文件复制到Unity3d项目的Assets目录下的任意位置。Unity3d将自动解析该dll文件。注意,尽量不要有命名空间,否则Unity3d可能报错。

VS布置如下:

Unity3d中布置如下:

为了方便起见,我们可以再dll工程的post-build event中写入以下命令:

copy $(TargetDir)$(TargetName)$(TargetExt) 目标文件夹 /Y

注意:目标文件夹需要依自己的整体布局来定,例如:

向左转|向右转
[url=http://d.hiphotos.baidu.com/zhidao/pic/item/fc1f4134970a304ea67fa65cd1c8a786c9175c32.jpg]

" target=_blank>.wwwObject.isDone)

{

m_WWWMap[url].calbackFun += callBackFun;

m_WWWMap[url].customParams.Add(customParam);

}

//已下载资源,直接调用回调函数

else

{

callBackFun.Invoke (m_WWWMap[url].wwwObject,customParam,m_WWWMap[url].requestURl,m_WWWMap[url].prefabName);

}

}

}

}

// Use this for initialization

void Start ()

{

Resources.UnloadUnusedAssets(); //清除无用的assert,但是前提是该assert的引用值为0

}

// Update is called once per frame

void Update ()

{

foreach (KeyValuePair<string,WWWRequest> wwwPair in m_WWWMap)

{

WWWRequest wwwReq = wwwPair.Value;

//如果尚未调用回调,并且下载完成,则调用,且只调用一次

if ((!wwwReq.bHasDeal) && wwwReq.wwwObject.isDone)

{

//print("DelegationCount:"+wwwReq.calbackFun.GetInvocationList().GetLength(0));

for(int i=0;i<wwwReq.calbackFun.GetInvocationList().GetLength(0);i++) //逐个触发该wwwReq中的回调函数

{

((DownFinishDelegate)wwwReq.calbackFun.GetInvocationList()[i]).Invoke(wwwReq.wwwObject,wwwReq.customParams[i],wwwReq.requestURl,wwwReq.prefabName);

}

wwwReq.bHasDeal = true; //开关值设置为true

}

}

}

public void DownFinishFun(WWW wwwParam,object customParam)

{

//wwwObj = wwwParam;

}

Dictionary<string,AssetBundle> assetBundle=new Dictionary<string, AssetBundle>();

//回调函数

public void LoadNewModel(WWW wwwParam,object customParam,string url,string prefabName)

{

AssetBundle bundle=null;

if(assetBundle.ContainsKey(url))

{

bundle=assetBundle[url]; }

else

{

if (wwwParam!= null && wwwParam.isDone&& wwwParam.error== null)

{

bundle=wwwParam.assetBundle;

assetBundle[url]=bundle; //assert list中不包含该bundle,则新添加一个

}

else

{

return; //如果www下载错误,或者没完成,则LoadNewModel返回空(很重要)

}

}

//开始模式定位和操作

try

{

if(asset!=null)

{

asset=null;

if(gameobject!=null)

{

Destroy(gameobject); //先销毁instance的gameobject

gameobject=null; // 主场景值保持一个主物体,在新物体加载之前将gameobject销毁,并且设置为null

}

Resources.UnloadUnusedAssets(); //清空源assert之前,要将对该assert的引用设置为0,

}

}

catch(Exception ex)

{

Debug.Log("cleanning is wrong!");

}

asset = bundle.Load (prefabName) as GameObject;

gameobject = Instantiate (asset) as GameObject;// 生成新的实例

gameobject.transform.localPosition = new Vector3 (0, 0, 3); //将新实例定位在Vector3 (0, 0, 3)

}

}

****************************************************************

二.unity场景生成注意事项(模拟服务器存放)

1.将unity场景的存放目录IIS设置为 192.168.1.10:10000

2.将crossdomain.xml(跨域访问文件)和其他unity3d文件放在一起--->这样可以让WebPlayer访问不在同一域的资源



****************************************************************

三. web服务端和前端的开发

1. u.initPlugin(jQuery("#unityPlayer")[0], "webtest5.unity3d"); //show.aspx中,是指定webplay加载的场景

2.sql数据源和asp控件绑定的方式是采用前置asp,如下(且img的dom不具有value属性,所以img的属性是使用alt传递出去的;onclick="showModel(this.alt)" 是点击事件):

<ul class="ad-thumb-list">

<% foreach (DataBind.Models.UnityModel m in modelList)

{ %>

<li>

<a href="images/8.jpg">

<img src="<%=m.modelThumbnail%>" title="A title for 8.jpg" alt="<%=m.modelId%>" class="image12" value="<%=m.modelId%>" onclick="showModel(this.alt)" >

</a>

</li>

<% } %>

</ul>

3. 另外在三层架构中,如果不是在同一个项目中,一个项目引用其他项目时,是调用其他项目生成的dll(只有在同一项目中才可直接引用);所以其他项目修改后,要及时重构dll,

5.

a.不要在异常中嵌套异常,而是要从底层向上层调用处抛出throw,在BLL和UI层中处理

b. 多用验证,能将异常用常规方法处理的就不要用异常来处理

c. sql中的datetime和c#中的datetime是可以兼容的。

6.在后台中只容许验证的session用户访问show.aspx,否则不能直接访问show.aspx,另外session要加入失效时间(例如:半个钟头)

7. handler.ashx中要是用 context.Response.ContentType =
"text/plain"方式, 让响应回传的是text,不能为html-->这样回传的才是字段

********************************************************

8. Ajax技术,对提交的页面元素事件进行处理,源码如下:

var xmlHttp;

function showCustomer(str) { //页面元素调用主函数

xmlHttp = GetXmlHttpObject();

//xmlHttp = new XMLHttpRequest();

if (xmlHttp == null) {

alert("您的浏览器不支持AJAX!");

return;

}

var url = "Handler.ashx";

url = url + "?q=" + str;

url = url + "&sid=" + Math.random();

//var url_send = "?q=" + str + "&sid=" + Math.random();

//xmlHttp.open("POST", url, true);

xmlHttp.open("GET", url, true); //如果处理的是ashx,且为text方式,就只能用open(不能用post方式)

//xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xmlHttp.onreadystatechange = stateChanged;

xmlHttp.send(null); //和xmlHttp.open("GET", url, true)配套使用

//xmlHttp.send("id=1001&name=holyknihgt");

}

function stateChanged() { //回传的处理函数

if (xmlHttp.readyState == 4&&xmlHttp.status==200) {

//var s = xmlHttp.responseText;

//alert(s);

var modelname = xmlHttp.responseText;

//alert(modelname);

if (modelname == "notexist") {

return;

}

else {

loadmodel(modelname);

}

}

}

function GetXmlHttpObject() {

var xmlHttp = null;

try {

// Firefox, Opera 8.0+, Safari

xmlHttp = new XMLHttpRequest();

}

catch (e) {

// Internet Explorer

try {

xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

}

catch (e) {

xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

}

}

return xmlHttp;

}

function showModel(str) {

xmlHttp = GetXmlHttpObject();

//xmlHttp = new XMLHttpRequest();

if (xmlHttp == null) {

alert("您的浏览器不支持AJAX!");

return;

}

var url = "Handler.ashx";

url = url + "?q=" + str;

url = url + "&sid=" + Math.random();

//var url_send = "?q=" + str + "&sid=" + Math.random();

//xmlHttp.open("POST", url, true);

xmlHttp.open("GET", url, true);

//xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

xmlHttp.onreadystatechange = stateChanged;

xmlHttp.send(null);

//xmlHttp.send("id=1001&name=holyknihgt");

}

20.

a.Unity3D 调用动态链接库dll文件 http://hi.baidu.com/thejavafan/item/1b24b7b86732e6a1eaba93d9
b.unity3d引用数据库dll文件,输出web格式时报错?怎么解决?或者其他方式连接数据库(oracle)?

无法解决,web的因为网页的安全沙盒机制,无法导入dll。

连接数据库可以用www类,通过webservice操作数据库

c.

在Windows环境下开发Unity3d游戏或应用,可以利用dll文件将一个大工程分为几个小的工程。这里较为推荐3dsMax+Unity3d+Windows7+Virsual Studio 2010+ReSharper这样的组合进行整个WinPC/Web项目的开发和维护。

在VS2010中可以导入一个ClassLib Project,编译生成dll文件。然后在Unity3d项目中添加对该dll文件的引用,并且将该dll文件复制到Unity3d项目的Assets目录下的任意位置。Unity3d将自动解析该dll文件。注意,尽量不要有命名空间,否则Unity3d可能报错。

VS布置如下:

Unity3d中布置如下:

为了方便起见,我们可以再dll工程的post-build event中写入以下命令:

copy $(TargetDir)$(TargetName)$(TargetExt) 目标文件夹 /Y

注意:目标文件夹需要依自己的整体布局来定,例如:

向左转|向右转
[url=http://d.hiphotos.baidu.com/zhidao/pic/item/fc1f4134970a304ea67fa65cd1c8a786c9175c32.jpg]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: