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

相关网盘免费资源下载...

 

一.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[url].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; //  最好使用AssetBundle.LoadAsync异步读取的方式,在协程里面用异步读取就行了,否则assetbundle虽然

                                                                          //下载完,但是assetbundle直接使用load方法会卡死,所以要使用LoadAsync异步读取的方式(2016.8.30补充)
   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传递出去的;οnclick="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%>"   οnclick="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

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

 

向左转 |向右转

 

相关网盘免费资源下载...

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值