NGUI学习笔记(一):UIGrid排序
发表于2018-06-05
实际项目中使用UIGrid来排序是非常方便的,下面就和大家介绍下UIGrid的使用。

UIGrid.cs 脚本提供里对子元素的多种排序方式:
public enum Sorting
{
None,
Alphabetic,
Horizontal,
Vertical,
Custom,
}
None表示按照元素的ChildIndex进行排序
Alphabetic表示按照元素的名字的字母表排序进行排序
Horizontal以及Vertical表示按照元素的localPosition进行排序
而最后一种则是十分贴心的自定义排序,前提是自行实现一种排序的比较算法
这里使用的算法是冒泡排序,需要设定的就是如何比较两个Item
下面是我写的Item类型
using UnityEngine;
using System.Collections;
using System;
public class Item:MonoBehaviour{
public int quality;
public int cost;
public PartEnum.part part = PartEnum.part.none;
UILabel qualityLbl;
UILabel costLbl;
UILabel partLbl;
void Start()
{
qualityLbl = transform.FindChild("Sprite/QualityLbl").GetComponent<UILabel>();
costLbl = transform.FindChild("Sprite/CostLbl").GetComponent<UILabel>();
partLbl = transform.FindChild("Sprite/PartLbl").GetComponent<UILabel>();
Initialize ();
}
void Initialize()
{
quality = UnityEngine.Random.Range (0, 12);
cost = UnityEngine.Random.Range (300, 9000);
part = (PartEnum.part)UnityEngine.Random.Range (0, 3);
qualityLbl.text += quality.ToString ();
costLbl.text += cost.ToString ();
partLbl.text += Enum.GetName(typeof(PartEnum.part),part);
}
}
用到的枚举
using UnityEngine;
using System.Collections;
using System;
public static class PartEnum {
public enum part
{
none = -1,
head = 0,
body = 1,
foot = 2,
};
}
正式的排序脚本
using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor.VersionControl;
using UObject = UnityEngine.Object;
public class GridSort : MonoBehaviour {
public enum SortType
{
quality =0,
cost =1,
part =2,
none =3,
};
public SortType sortType = SortType.none;
int sortIndex = 0;
UILabel sortLabel;
UIButton sortBtn;
UIGrid uiGrid;
GameObject gridGO;
void Start () {
Initialize ();
}
void Initialize()
{
gridGO = GameObject.Find ("ItemScroll View");
uiGrid = gridGO.GetComponent<UIGrid>();
uiGrid.onCustomSort = CustomSort;
GameObject sortBtnObj = GameObject.Find ("SortBtn");
//UIEventListener.Get (sortBtnObj).onClick += new UIEventListener.VoidDelegate (OnObjBtnSortClick);
sortBtn = sortBtnObj.GetComponent<UIButton> ();
sortBtn.onClick.Add(new EventDelegate(OnUIBtnSortClick));
sortLabel = sortBtnObj.GetComponentInChildren<UILabel> ();
}
int CustomSort(Transform t1,Transform t2)
{
Item a = t1.GetComponent<Item> ();
Item b = t2.GetComponent<Item> ();
switch (sortType)
{
case SortType.none:
return 0;
case SortType.part:
return a.part.CompareTo (b.part);
case SortType.quality:
return a.quality.CompareTo (b.quality);
case SortType.cost:
return a.cost.CompareTo (b.cost);
default:
return 0;
}
}
void OnObjBtnSortClick(GameObject go)
{
sortIndex++;
int newSortIndex = sortIndex % 4;
sortType =(SortType) Enum.ToObject (typeof(SortType), newSortIndex);
switch (sortType)
{
case SortType.cost:
sortLabel.text = "按花费排序";
break;
case SortType.quality:
sortLabel.text = "安品质排序";
break;
case SortType.part:
sortLabel.text = "按部位排序";
break;
case SortType.none:
sortLabel.text = "默认排序";
break;
}
uiGrid.repositionNow = true;
uiGrid.Reposition ();
}
void OnUIBtnSortClick()
{
sortIndex++;
int newSortIndex = sortIndex % 4;
sortType =(SortType) Enum.ToObject (typeof(SortType), newSortIndex);
switch (sortType)
{
case SortType.cost:
sortLabel.text = "按花费排序";
break;
case SortType.quality:
sortLabel.text = "安品质排序";
break;
case SortType.part:
sortLabel.text = "按部位排序";
break;
case SortType.none:
sortLabel.text = "默认排序";
break;
}
uiGrid.repositionNow = true;
uiGrid.Reposition ();
}
}
这里要提一下监听UIButton有很多种方法,个人比较喜欢添加UIEventListener来实现。
使用UIEvenListener来监听的话,其onClick这个list里面添加的代理的签名返回值为空,但是有一个传入参数为GameObject类型。
而UIButton自带的onClick:
/// <summary>
/// Click event listener.
/// </summary>
public List<EventDelegate> onClick = new List<EventDelegate>();
需要添加的代理类型为EventDelete,有三种创建方式:
public EventDelegate () { } public EventDelegate (Callback call) { Set(call); } public EventDelegate (MonoBehaviour target, string methodName) { Set(target, methodName); }
我用的是第二种,我发现这个Callback返回值也为空,但是却不需要传入参数。
所以为了验证2种监听方法,我写了两个相似的函数OnObjBtnSortClick和OnUIBtnSortClick.
最后整理一下场景,运行,上效果:

