相关网盘免费资源下载...
一.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
注意:目标文件夹需要依自己的整体布局来定,例如:
相关网盘免费资源下载...