[Unity3d]unity+asp.net实现动态搜索加载模型并且能够实现模型拖动缩放的功能

简介:

实现的功能要求:用户在文本框中输入要查询的模型型号(包括模糊搜索),服务器返回数据,然后客户端解析数据并且动态的生成数据列表,点击列表从服务器端下载打包的assetbundle模型,加载到场景,并且点击其他的,确保场景中每次只显示一个模型,而且该模型能够缩放旋转。

Code:

搜索功能框:


在搜索框中输入,然后向服务器端发送请求,服务器端返回数据,客户端解析数据,做出列表


点击列表之后,会动态加载model


创建在这个Model对象下:


case "开始搜索": 				 //执行查询 searchText = GameObject.Find("Input").GetComponentInChildren<UILabel>().text; print(searchText); if(!string.IsNullOrEmpty(searchText)) { 	WWWForm formSearch = new WWWForm(); 	formSearch.AddField("type",searchText); 	WWW www = new WWW(searchUrl,formSearch); 	yield return www;       	if (www.error != null)         {               Debug.LogError(www.error);          }          else          { 		print(www.text); 		if(www.text!="NULL") 		{                     if (www.isDone)                     {                             int posY = 0;                             //父物体:panel、sprite                             //GameObject gobj = CreateEmptyObject(name, showpanel);                             gobj.transform.localPosition = new Vector3(0, 0, 50);                             gobj.transform.localScale = new Vector3(1, 1, 1); 					    	 					    	 					    	//生成生成三级导航                             ////UIScrollBar scrollbar = NGUITools.AddChild<UIScrollBar>(obj);                             //panel                             UIDraggablePanel panel = NGUITools.AddChild<UIDraggablePanel>(gobj);                             panel.transform.localPosition = new Vector3(500 + 140 - Screen.width, 0, 0);                             panel.transform.localScale = new Vector3(1, 1, 1);                             panel.scale = new Vector3(0, 1, 0);                             panel.GetComponent<UIPanel>().clipping = UIDrawCall.Clipping.SoftClip;                             //panel.GetComponent<UIPanel>().clipRange = new Vector4(0, 0, 280, 800);                             panel.GetComponent<UIPanel>().clipSoftness = new Vector2(1, 1); 					    	 					    	                             //sprite                             UISprite texture = NGUITools.AddSprite(gobj, atlas, "Sprite (MID_navigation_70%)");             //名字 						    //texture.pivot = UIWidget.Pivot.Top;                             texture.transform.localPosition = new Vector3(500 + 140 - Screen.width, 0, 0);                             //texture.transform.localScale = new Vector3(280, 800, 1);                             texture.alpha = 0.5f;                             //panel-grid                             UIGrid grid = NGUITools.AddChild<UIGrid>(panel.gameObject); 							                             grid.transform.localPosition = new Vector3(0, texture.transform.localScale.y / 2, -20);                             grid.transform.localScale = new Vector3(1, 1, 1);                             grid.arrangement = UIGrid.Arrangement.Vertical;                             grid.cellHeight = 40;                             grid.cellWidth = 505; 					                                 JsonData jd = JsonMapper.ToObject(www.text);                             for (int i = 0; i < jd.Count; i++)                             {                                 //根据解析的Name添加二级导航                                                             //print("Name:" + jd[i]["Name"]); 								//print("url:"+jd[i]["Url"]);                                 //grid-item                                 GameObject gobject = (GameObject)Instantiate(prefabItem1, new Vector3(0, 0, 0), Quaternion.identity); 								gobject.GetComponentInChildren<PrefbLoadmodel>().modelname = jd[i]["Type"].ToString(); //传入模型的名字                                 gobject.transform.parent = grid.transform;                                 gobject.transform.localPosition = new Vector3(0, 0, 0);                                 gobject.transform.localScale = new Vector3(1, 1, 1); 								//gobject.GetComponent<UIDragPanelContents>().draggablePanel = panel; 								gobject.GetComponentInChildren<UILabel>().text = jd[i]["Name"].ToString();                                 gobject.GetComponentInChildren<UISprite>().alpha = 0.5f;                                 grid.repositionNow = true;                                 //技术参数                                 //print("Telimgurl:" + jd[i]["Telimgurl"]);                                 //规格                                 //print("Imgurl:" + jd[i]["Imgurl"]); 								                             }                             posY = 40 * jd.Count;                             if (posY > 400)                             {                                 posY = 400;                             }                             texture.transform.localScale = new Vector3(505, posY + 10, 1);                             panel.GetComponent<UIPanel>().clipRange = new Vector4(0, 0, 505, posY + 10);  //设置左上角坐标和宽高                         } 	}     } } break;

PrefbLoadmodel.cs: 这个类放在预设的按钮下,作用是点击加载模型

using UnityEngine; using System.Collections; using LitJson;  public class PrefbLoadmodel : MonoBehaviour { 	 	static string ipStr = "http://ueige123.oicp.net/handler/"; 	string searchText = null; 	//产品中心导航链接    	private string productUrl = ipStr + "Search.ashx"; 	 	Transform model; 	 	public string modelname=null; 	// Use this for initialization 	void Start () { 		model = GameObject.Find("Model").transform; 		 	} 	 	// Update is called once per frame 	void Update () { 		 	} 	 	void OnClick() 	{	 		print("modelName:---"+modelname); 		 		isLoad(modelname+"(Clone)");  //将其他的隐藏 		 	} 	 	void isLoad(string name) 	{ 		if(model.FindChild(name)) 		{ 			for (int i = 0; i < model.childCount; i++)         	{             //当鼠标点击对象的名字与Modell中子对象名字不同相同时,设置激活状态:false             	if (model.GetChild(i).name != name)            		{ 					model.GetChild(i).gameObject.SetActive(false); 		    	} 				else 				{ 					model.GetChild(i).gameObject.SetActive(true);	 				} 			} 			print("存在"); 		}	 		else 		{ 			print("不存在"); 			for (int i = 0; i < model.childCount; i++)             {                                  model.GetChild(i).gameObject.SetActive(false);             } 			searchText = this.gameObject.GetComponentInChildren<UILabel>().text; 			StartCoroutine(SendName(searchText)); 		} 	} 	 	IEnumerator SendName(string name)     { 		WWWForm form = new WWWForm(); 		print("name:"+name); 		form.AddField("type",name); 		WWW resumewww = new WWW(productUrl,form); 		yield return resumewww; 		//记录加载时出现的错误信息           if (resumewww.error != null)          {              print("错误:" + resumewww.error);          }          else          {              print(resumewww.text); //服务器端返回的数据   			 JsonData jd = JsonMapper.ToObject(resumewww.text);              if (resumewww.isDone)              {                 string url1= jd[0]["Url"].ToString(); 				string type = jd[0]["Type"].ToString(); 				modelname = type; 				 WWW download = WWW.LoadFromCacheOrDownload(url1,1); 				yield return download; 				 				GameObject obj = Instantiate(download.assetBundle.mainAsset)as GameObject; 				obj.transform.parent = model; 				obj.transform.localPosition = new Vector3(4,0,2); 				obj.transform.localScale = new Vector3(1000, 1000,1000); 				 				obj.AddComponent<DragModel>();  //动态添加拖动组件 				download.assetBundle.Unload(false);              }          } 	} } 

DragModel.cs:这个类是模型动态的添加的组件,作用是能够鼠标旋转和缩放模型

using UnityEngine; using System.Collections;  public class DragModel : MonoBehaviour { 	 	 	private float x = 0.0f; 	private float y = 0.0f; 	 	private float xSpeed = 200.0f; 	private float ySpeed = 200.0f; 	 	private float zSpeed = 40f; 	 	private float minDistence = 0; 	private float maxDistence = 10; 	  	void Update ()  	{ 		 		if(Input.GetMouseButton(1)) 		{ 			x=Input.GetAxis("Mouse X") *xSpeed;  			y=Input.GetAxis("Mouse Y") *ySpeed; 			 			transform.Rotate(Vector3.up * -x *Time.deltaTime,Space.World); 			transform.Rotate(Vector3.right * y *Time.deltaTime,Space.World); 			 		} 		 		 		else if(Input.GetAxis("Mouse ScrollWheel")!=0) 		{ 			float ga = Input.GetAxis("Mouse ScrollWheel"); 			if(transform.position.z > minDistence && transform.position.z<maxDistence||transform.position.z<=minDistence && ga<0||transform.position.z>=maxDistence && ga>0) 			{ 				transform.Translate(Vector3.forward*-ga*zSpeed*Time.deltaTime,Space.World);	 			} 		} 	} } 


==================== 迂者 丁小未 CSDN博客专栏=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:858550         cocos2dx QQ群:280818155

====================== 相互学习,共同进步 ===================

转载请注明出处:http://blog.csdn.net/dingxiaowei2013/article/details/17587497

欢迎关注我的微博: http://weibo.com/u/2590571922
相关文章
|
3月前
|
人工智能 开发框架 .NET
.NET技术的强大功能:.NET技术的基础特性、在现代开发中的应用、以及它如何助力未来的软件开发。
.NET技术是软件开发领域的核心支柱,以其强大功能、灵活性及安全性广受认可。本文分三部分解析:基础特性如多语言支持、统一运行时环境;现代应用如企业级与Web开发、移动应用、云服务及游戏开发;以及未来趋势如性能优化、容器化、AI集成等,展望.NET在不断变化的技术环境中持续发展与创新。
119 4
|
5天前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架
|
4天前
|
XML 开发框架 .NET
.NET 9 中 LINQ 新增功能实操
.NET 9 中 LINQ 新增功能实操
|
5天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
5天前
|
开发框架 JavaScript 前端开发
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
2024年全面且功能强大的.NET快速开发框架推荐,效率提升利器!
|
5天前
|
网络协议 网络安全 Apache
一个整合性、功能丰富的.NET网络通信框架
一个整合性、功能丰富的.NET网络通信框架
|
9天前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
|
23天前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
1月前
|
开发框架 .NET 开发工具
.NET 9 中 LINQ 新增的功能
.NET 9 中 LINQ 新增的功能
|
3月前
|
定位技术 C# 图形学
从零开始的unity3d入门教程(二)----基本功能讲解
这是一篇Unity3D入门教程,详细介绍了Unity界面操作、游戏物体创建修改、场景搭建、玩家控制、音效添加以及游戏测试和导出的全过程。
从零开始的unity3d入门教程(二)----基本功能讲解

相关实验场景

更多