NGUI系列教程九(自制ListView)
在NGUI中可以很方便的实现ListView的控件,ListView就好比IOS或Android平台中使用手势上下拖动的控件。在Unity3D中实现ListView的原理无非就两种,第一种是摄像机不动只移动控件,第二种是控件不动只移动摄像机。在官方的Demo中已经有这两种的例子。
和之前的文章开始一样,我们先创建一个2D的游戏平面。接着给Panel面板绑定游戏组件,
Unity导航菜单栏中选择Component->NGUI->Interaction->Grid,
它主要设定ListView中每一个item的属性。
继续在Unity导航菜单栏中选择Component->NGUI->Interaction->UIDraggablePanel,
它主要设定listView的触摸区域以及与拖动条事件等。
如下图所示,我详细说说Panel面板中一些需要注意的属性。
UIGrid(Script):Arrangement 选择Vertical表示这个ListView表示纵向,这里如果选择Horizontal表示该ListView是横向的。
Cell Width:ListView中每一个item的宽度。
Cell Height:listView中每一个item的高度。
UIDraggable Panel(Script):选项中的Scale非常重要,这里设置y = 1 表示ListView只支持纵向的拖动,如果设置X=1表示列表只支持横向的拖动,如果两个都=1表示列表同时支持横向与纵向的拖动,此处设置X=0,取消在横向上的拖动。
Horizontal Scroll Bar 与 Vertical Scroll Bar表示横向或纵向的拖动条与listView结合,然而这里我们无需写一行代码,它会自动帮我们计算,将你的ListView与拖动条结合。
UIPanel(Script) ,我们选择Clipping的类型为SoftClip,这里可设置listView整体的显示区域。如下图所示,整体的显示区域就是紫色框中的区域。橙色框是ListView整体的显示内容,它会依次的排列下去,但是永远只会显示紫色框中的内容。
接着我们看看目前工程的结构。在Hierarchy视图中Anchor下面同级的目录中有Button、ListPanel、Scroll Bar。Button就是上图中添加列表的按钮,ListPanel中是通过点击添加列表按钮后自动添加的列表预设。Scroll Bar表示上图中左侧的纵向拖动条。在右侧监测面板视图中,BoxCollider组件必须添加,该组件中Center与Size可设置ListView中的Item的触摸响应区域,这个区域应当与Item的显示区域相当。
Item上还有一个重要的组件就是UIDrag Panel Contents(Script),如果没有它ListView就无法拖动。在Unity导航菜单栏中选择Component->NGUI->Interaction->UIDrag Panel Contents即可。
将Item预设资源放在Resources文件夹中是为了使用Resource来读取。
下面我们看看动态添加列表的脚本,把脚本绑定在Button上。
using UnityEngine;
using System.Collections;
using System.Collections.Generic; public class Test : MonoBehaviour { public UIGrid grid;
int count = ;
void Start()
{
//得到grid对象
grid = GameObject.Find("ListPanel").GetComponent<UIGrid>();
} void OnClick ()
{ //克隆预设
GameObject o =(GameObject) Instantiate(Resources.Load("Item"));
//为每个预设设置一个独一无二的名称
o.name = "item" + count;
//将新预设放在Panel对象下面
o.transform.parent = GameObject.Find("ListPanel").transform; ////下面这段代码是因为创建预设时 会自动修改旋转缩放的系数,
//我不知道为什么会自动修改,所以MOMO重新为它赋值
//有知道的朋友麻烦告诉我一下 谢谢!!! GameObject item = GameObject.Find(o.name);
item.transform.localPosition = new Vector3(,,);
item.transform.localScale= new Vector3(,,); count ++; //列表添加后用于刷新listView
grid.repositionNow = true;
} }
我们在创建一个Button用于动态的删除列表。我们编写脚本Delete.cs绑定上该按钮,原理和添加差不多大家看看哈~~
using UnityEngine;
using System.Collections; public class Delete : MonoBehaviour { public UIGrid grid; void Start()
{
//得到grid对象
grid = GameObject.Find("ListPanel").GetComponent<UIGrid>(); } void OnClick()
{
//通过标签名称找到多有对象,前提是给预设起一个tag,这里我叫它player
GameObject []items = GameObject.FindGameObjectsWithTag("Player");
//当预设数量大于 0时
if(items.Length >)
{
//删除列表的item
Destroy(items[]);
//刷新UI
grid.repositionNow = true;
} } }
接着我们学习点击某项Item后修改显示的内容,将如下脚本挂在item当中。
using UnityEngine;
using System.Collections; public class item : MonoBehaviour { void OnClick()
{
//得到item自对象的精灵组建。
//因为得到的组建采取深度优先
//所以我们需要修改数组中元素为1的精灵
//数组中元素为0的精灵是按钮的背景
UISprite ui = GetComponentsInChildren<UISprite>()[];
//修改头像为女生头像
ui.spriteName = "223124814_04"; //得到文字对象
UILabel label = GetComponentInChildren<UILabel>();
//修改文字内容
label.text = "蜗蜗";
}
}
工程项目:http://pan.ceeger.com/viewfile.php?file_id=1828&file_key=QrED5c55
NGUI系列教程九(自制ListView)的更多相关文章
- CRL快速开发框架系列教程九(导入/导出数据)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- NGUI系列教程五(角色信息跟随)
在一些网络游戏中,我们常常可以看到角色的上方显示着角色的名称,等级,血量等信息.它们可以跟随角色移动,并且可以显示和隐藏.今天我们就来学习一下这些功能的实现方法.1. 新建unity工 程,导入NGU ...
- NGUI系列教程四(自定义Atlas,Font)
今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...
- NGUI系列教程三
接下来我们再来看Progress Bar和Slider,对比参数我们可以发现,Progress Bar和slider的明显区别在于slider多一个Thumb选项,这里的Thumb就是我们拖动的时候点 ...
- NGUI系列教程二
接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(九) Policy Injection Application Block 代理对象(Proxy Object) ...
- (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)
NGUI系列教程七(序列帧动画) 今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...
- NGUI系列教程七(序列帧动画)
今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还要在啰嗦一句,首先大家要准备一些序列帧 ...
- Unity3D脚本中文系列教程(九)
Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 oper ...
随机推荐
- linux用户及组管理
useradd 添加用户 passwd 修改用户密码 userdel 删除用户,默认不删除用户主目录和email,如果想删除可加 –r 参数 groupadd 添 ...
- Sublime Text 2 实用快捷键[Mac OS X]
lucasfais 总结了一些非常实用的 Sublime Text 2 快捷键,Lucifr 将它们翻译成了中文,以方便查阅. 注意:修饰键(如⌘)后跟多个按键的情况表示在按住修饰键的情况下依次按下相 ...
- yii2.0的gii生成代码bug
自动生成代码真的很好用,能减少很多基础代码的编写,如果这些基础代码一个个手动去敲,即枯燥乏味,还容易出错(话说人类真的不适合做单调重复的工作),yii框架的gii自动生成代码工具就能减少很多工作量.前 ...
- Quartz Scheduler(2.2.1) - Usage of JobDataMap
The JobDataMap can be used to hold any amount of (serializable) data objects which you wish to have ...
- UML建模——概述
轻松玩建模 统一建模语言UML快速入门 http://soft.yesky.com/lesson/281/2472281.shtml UML是一种定义良好.易于表达.功能强大且普遍适用的建模语言.它溶 ...
- Android之图片应用
package com.example.imagescale; import android.os.Bundle; import android.app.Activity; import androi ...
- <转载>批处理之FOR语句祥解
批处理之FOR语句祥解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN ...
- Cocos2d-x开发实例:使用Lambda 表达式
在Cocos2d-x 3.0之后提供了对C++11标准[1]的支持,其中的Lambda[2]表达式使用起来非常简洁.我们可以使用Lambda表达式重构上一节的实例. 我们可以将下面的代码: liste ...
- CSS 初体验之一
层叠样式表 (Cascading Style Sheets)”,它主要是用于定义HTML内容在浏览器内的显示样式. 1.首先先看盒装模型,如下图,平时设置的width,height是指元素内容(con ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(三)DOCTYPE和字符集
在2.1.2节中通过新老DOCTYPE的对比,读者可以清晰地看到HTML 5在精简旧有结构上做出的努力.DOCTYPE在出现之初主要用于XML中,用作描述XML允许使用的元素.属性和排列方式.起初HT ...